aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--Makefile.common14
-rw-r--r--NEWS21
-rw-r--r--README52
-rw-r--r--backends/fs/psp/psp-fs.cpp12
-rw-r--r--backends/fs/psp/psp-stream.cpp313
-rw-r--r--backends/fs/psp/psp-stream.h52
-rw-r--r--backends/platform/dingux/dingux-events.cpp215
-rw-r--r--backends/platform/dingux/dingux-graphics.cpp468
-rw-r--r--backends/platform/dingux/dingux.cpp58
-rw-r--r--backends/platform/dingux/dingux.h69
-rw-r--r--backends/platform/dingux/main.cpp53
-rw-r--r--backends/platform/dingux/module.mk13
-rwxr-xr-xbackends/platform/gp2xwiz/caanoo/build.sh12
-rwxr-xr-xbackends/platform/gp2xwiz/caanoo/bundle-debug.sh9
-rwxr-xr-xbackends/platform/gp2xwiz/caanoo/bundle.sh9
-rwxr-xr-xbackends/platform/gp2xwiz/caanoo/caanoo-bundle.mk67
-rwxr-xr-xbackends/platform/gp2xwiz/caanoo/clean.sh8
-rwxr-xr-xbackends/platform/gp2xwiz/caanoo/config-alleng.sh16
-rwxr-xr-xbackends/platform/gp2xwiz/caanoo/config.sh16
-rwxr-xr-xbackends/platform/gp2xwiz/caanoo/scummvm-gdb.gpe16
-rwxr-xr-xbackends/platform/gp2xwiz/caanoo/scummvm.gpe15
-rw-r--r--backends/platform/gp2xwiz/gp2xwiz-graphics.cpp48
-rw-r--r--backends/platform/gp2xwiz/gp2xwiz-main.cpp5
-rw-r--r--backends/platform/linuxmoto/linuxmoto-main.cpp1
-rw-r--r--backends/platform/n64/README.N641
-rw-r--r--backends/platform/n64/osys_n64.h8
-rw-r--r--backends/platform/n64/osys_n64_base.cpp7
-rw-r--r--backends/platform/n64/osys_n64_utilities.cpp3
-rw-r--r--backends/platform/psp/display_manager.cpp67
-rw-r--r--backends/platform/psp/display_manager.h9
-rw-r--r--backends/platform/psp/mp3.cpp79
-rw-r--r--backends/platform/psp/mp3.h7
-rw-r--r--backends/platform/psp/tests.cpp174
-rw-r--r--backends/platform/sdl/graphics.cpp10
-rw-r--r--backends/platform/sdl/main.cpp2
-rw-r--r--backends/platform/sdl/sdl.cpp2
-rw-r--r--backends/platform/symbian/AdaptAllMMPs.pl4
-rw-r--r--backends/platform/symbian/BuildPackageUpload_LocalSettings.pl16
-rw-r--r--backends/platform/symbian/mmp/scummvm_base.mmp.in2
-rw-r--r--backends/platform/symbian/mmp/scummvm_hugo.mmp.in64
-rw-r--r--backends/platform/wii/osystem.h1
-rw-r--r--backends/platform/wii/osystem_events.cpp3
-rw-r--r--backends/platform/wii/osystem_gfx.cpp16
-rw-r--r--base/internal_version.h4
-rw-r--r--base/internal_version.h.in4
-rw-r--r--base/plugins.cpp8
-rw-r--r--base/version.cpp4
-rw-r--r--common/archive.h24
-rw-r--r--common/config-manager.cpp25
-rw-r--r--common/endian.h8
-rw-r--r--common/macresman.cpp1
-rw-r--r--common/macresman.h2
-rw-r--r--common/messages.cpp2722
-rw-r--r--common/rational.cpp2
-rw-r--r--common/rect.h3
-rw-r--r--common/scummsys.h7
-rw-r--r--common/str.cpp9
-rw-r--r--common/stream.cpp103
-rw-r--r--common/stream.h30
-rw-r--r--common/translation.cpp309
-rw-r--r--common/translation.h88
-rw-r--r--common/unzip.cpp72
-rw-r--r--common/util.cpp6
-rw-r--r--common/util.h11
-rwxr-xr-xconfigure99
-rw-r--r--dists/devcpp/agos.dev309
-rw-r--r--dists/devcpp/cine.dev489
-rw-r--r--dists/devcpp/gob.dev609
-rw-r--r--dists/devcpp/kyra.dev359
-rw-r--r--dists/devcpp/lure.dev479
-rw-r--r--dists/devcpp/queen.dev449
-rw-r--r--dists/devcpp/saga.dev589
-rw-r--r--dists/devcpp/scumm.dev1469
-rw-r--r--dists/devcpp/scummvm.dev2088
-rw-r--r--dists/devcpp/sky.dev479
-rw-r--r--dists/devcpp/sword1.dev439
-rw-r--r--dists/devcpp/sword2.dev569
-rw-r--r--dists/engine-data/hugo.datbin0 -> 168169 bytes
-rw-r--r--engines/advancedDetector.cpp37
-rw-r--r--engines/advancedDetector.h3
-rw-r--r--engines/agi/agi.cpp15
-rw-r--r--engines/agi/agi.h1
-rw-r--r--engines/agi/cycle.cpp2
-rw-r--r--engines/agi/sound_midi.cpp6
-rw-r--r--engines/agos/detection_tables.h21
-rw-r--r--engines/dialogs.cpp5
-rw-r--r--engines/draci/script.cpp4
-rw-r--r--engines/engines.mk5
-rw-r--r--engines/gob/detection_tables.h118
-rw-r--r--engines/gob/draw.cpp781
-rw-r--r--engines/gob/draw.h41
-rw-r--r--engines/gob/draw_fascin.cpp777
-rw-r--r--engines/gob/draw_v2.cpp5
-rw-r--r--engines/gob/expression.cpp2
-rw-r--r--engines/gob/game.cpp6
-rw-r--r--engines/gob/gob.cpp2
-rw-r--r--engines/gob/hotspots.cpp115
-rw-r--r--engines/gob/hotspots.h5
-rw-r--r--engines/gob/init.h1
-rw-r--r--engines/gob/init_fascin.cpp58
-rw-r--r--engines/gob/init_v3.cpp2
-rw-r--r--engines/gob/inter.cpp14
-rw-r--r--engines/gob/inter.h3
-rw-r--r--engines/gob/inter_fascin.cpp101
-rw-r--r--engines/gob/inter_v4.cpp2
-rw-r--r--engines/gob/inter_v6.cpp2
-rw-r--r--engines/gob/module.mk1
-rw-r--r--engines/gob/mult_v2.cpp2
-rw-r--r--engines/gob/scenery.cpp27
-rw-r--r--engines/gob/sound/sound.cpp9
-rw-r--r--engines/gob/util.cpp2
-rw-r--r--engines/hugo/detection.cpp209
-rw-r--r--engines/hugo/display.cpp456
-rw-r--r--engines/hugo/display.h103
-rw-r--r--engines/hugo/engine.cpp973
-rw-r--r--engines/hugo/engine.h44
-rw-r--r--engines/hugo/file.cpp904
-rw-r--r--engines/hugo/file.h88
-rw-r--r--engines/hugo/game.h880
-rw-r--r--engines/hugo/global.h55
-rw-r--r--engines/hugo/hugo.cpp1476
-rw-r--r--engines/hugo/hugo.h312
-rw-r--r--engines/hugo/intro.cpp186
-rw-r--r--engines/hugo/intro.h120
-rw-r--r--engines/hugo/inventory.cpp230
-rw-r--r--engines/hugo/inventory.h56
-rw-r--r--engines/hugo/module.mk24
-rw-r--r--engines/hugo/mouse.cpp311
-rw-r--r--engines/hugo/mouse.h54
-rw-r--r--engines/hugo/parser.cpp720
-rw-r--r--engines/hugo/parser.h86
-rw-r--r--engines/hugo/route.cpp472
-rw-r--r--engines/hugo/route.h85
-rw-r--r--engines/hugo/schedule.cpp700
-rw-r--r--engines/hugo/schedule.h105
-rw-r--r--engines/hugo/sound.cpp331
-rw-r--r--engines/hugo/sound.h65
-rw-r--r--engines/hugo/util.cpp178
-rw-r--r--engines/hugo/util.h63
-rw-r--r--engines/kyra/debugger.cpp2
-rw-r--r--engines/kyra/detection.cpp13
-rw-r--r--engines/kyra/detection_tables.h4
-rw-r--r--engines/kyra/gui.cpp18
-rw-r--r--engines/kyra/kyra_mr.cpp2
-rw-r--r--engines/kyra/resource.cpp11
-rw-r--r--engines/kyra/resource.h4
-rw-r--r--engines/kyra/resource_intern.cpp257
-rw-r--r--engines/kyra/resource_intern.h44
-rw-r--r--engines/kyra/screen.cpp12
-rw-r--r--engines/kyra/screen_v2.cpp2
-rw-r--r--engines/kyra/script_tim.cpp8
-rw-r--r--engines/kyra/sound_adlib.cpp2
-rw-r--r--engines/kyra/sound_midi.cpp10
-rw-r--r--engines/kyra/sound_towns.cpp3
-rw-r--r--engines/lure/scripts.cpp5
-rw-r--r--engines/m4/globals.h65
-rw-r--r--engines/m4/m4.h12
-rw-r--r--engines/m4/mads_logic.cpp767
-rw-r--r--engines/m4/mads_logic.h52
-rw-r--r--engines/m4/mads_scene.cpp8
-rw-r--r--engines/m4/mads_scene.h5
-rw-r--r--engines/m4/mads_views.cpp12
-rw-r--r--engines/m4/scene.cpp1
-rw-r--r--engines/m4/scene.h7
-rw-r--r--engines/m4/ws_machine.cpp4
-rw-r--r--engines/m4/ws_sequence.cpp2
-rw-r--r--engines/mohawk/console.cpp24
-rw-r--r--engines/mohawk/console.h1
-rw-r--r--engines/mohawk/dialogs.cpp8
-rw-r--r--engines/mohawk/graphics.cpp70
-rw-r--r--engines/mohawk/graphics.h6
-rw-r--r--engines/mohawk/riven.cpp298
-rw-r--r--engines/mohawk/riven.h30
-rw-r--r--engines/mohawk/riven_external.cpp627
-rw-r--r--engines/mohawk/riven_external.h11
-rw-r--r--engines/mohawk/riven_saveload.cpp6
-rw-r--r--engines/mohawk/riven_scripts.cpp13
-rw-r--r--engines/mohawk/riven_scripts.h6
-rw-r--r--engines/mohawk/riven_vars.cpp55
-rw-r--r--engines/mohawk/video.cpp18
-rw-r--r--engines/mohawk/video.h2
-rw-r--r--engines/saga/scene.cpp4
-rw-r--r--engines/sci/console.cpp56
-rw-r--r--engines/sci/console.h2
-rw-r--r--engines/sci/debug.h6
-rw-r--r--engines/sci/detection.cpp8
-rw-r--r--engines/sci/detection_tables.h351
-rw-r--r--engines/sci/engine/features.cpp17
-rw-r--r--engines/sci/engine/gc.cpp13
-rw-r--r--engines/sci/engine/kernel.cpp8
-rw-r--r--engines/sci/engine/kernel.h1
-rw-r--r--engines/sci/engine/kernel_tables.h15
-rw-r--r--engines/sci/engine/kevent.cpp33
-rw-r--r--engines/sci/engine/kfile.cpp400
-rw-r--r--engines/sci/engine/kgraphics.cpp121
-rw-r--r--engines/sci/engine/klists.cpp3
-rw-r--r--engines/sci/engine/kmath.cpp70
-rw-r--r--engines/sci/engine/kmenu.cpp12
-rw-r--r--engines/sci/engine/kmovement.cpp507
-rw-r--r--engines/sci/engine/kparse.cpp9
-rw-r--r--engines/sci/engine/kpathing.cpp64
-rw-r--r--engines/sci/engine/kscripts.cpp36
-rw-r--r--engines/sci/engine/savegame.cpp16
-rw-r--r--engines/sci/engine/script.cpp20
-rw-r--r--engines/sci/engine/script_patches.cpp493
-rw-r--r--engines/sci/engine/seg_manager.cpp2
-rw-r--r--engines/sci/engine/segment.h8
-rw-r--r--engines/sci/engine/selector.cpp6
-rw-r--r--engines/sci/engine/selector.h7
-rw-r--r--engines/sci/engine/state.cpp12
-rw-r--r--engines/sci/engine/state.h28
-rw-r--r--engines/sci/engine/static_selectors.cpp108
-rw-r--r--engines/sci/engine/vm.cpp139
-rw-r--r--engines/sci/engine/workarounds.cpp82
-rw-r--r--engines/sci/engine/workarounds.h4
-rw-r--r--engines/sci/event.cpp19
-rw-r--r--engines/sci/graphics/animate.cpp92
-rw-r--r--engines/sci/graphics/animate.h2
-rw-r--r--engines/sci/graphics/compare.cpp4
-rw-r--r--engines/sci/graphics/controls.cpp23
-rw-r--r--engines/sci/graphics/cursor.cpp98
-rw-r--r--engines/sci/graphics/cursor.h10
-rw-r--r--engines/sci/graphics/paint16.cpp21
-rw-r--r--engines/sci/graphics/paint16.h2
-rw-r--r--engines/sci/graphics/palette.cpp25
-rw-r--r--engines/sci/graphics/picture.cpp11
-rw-r--r--engines/sci/graphics/portrait.cpp2
-rw-r--r--engines/sci/graphics/ports.cpp49
-rw-r--r--engines/sci/graphics/ports.h1
-rw-r--r--engines/sci/graphics/text16.cpp13
-rw-r--r--engines/sci/graphics/transitions.cpp138
-rw-r--r--engines/sci/graphics/transitions.h5
-rw-r--r--engines/sci/graphics/view.cpp7
-rw-r--r--engines/sci/resource.cpp91
-rw-r--r--engines/sci/resource.h3
-rw-r--r--engines/sci/resource_audio.cpp35
-rw-r--r--engines/sci/sci.cpp245
-rw-r--r--engines/sci/sci.h22
-rw-r--r--engines/sci/sound/drivers/map-mt32-to-gm.h170
-rw-r--r--engines/sci/sound/drivers/midi.cpp42
-rw-r--r--engines/sci/sound/midiparser_sci.cpp33
-rw-r--r--engines/sci/sound/midiparser_sci.h4
-rw-r--r--engines/sci/sound/music.cpp52
-rw-r--r--engines/sci/sound/music.h12
-rw-r--r--engines/sci/sound/soundcmd.cpp12
-rw-r--r--engines/sci/sound/soundcmd.h7
-rw-r--r--engines/scumm/detection.cpp4
-rw-r--r--engines/scumm/detection_tables.h45
-rw-r--r--engines/scumm/gfx.cpp6
-rw-r--r--engines/scumm/help.cpp2
-rw-r--r--engines/scumm/imuse/imuse_player.cpp7
-rw-r--r--engines/scumm/midiparser_eup.cpp222
-rw-r--r--engines/scumm/module.mk2
-rw-r--r--engines/scumm/palette.cpp8
-rw-r--r--engines/scumm/player_sid.cpp24
-rw-r--r--engines/scumm/player_towns.cpp556
-rw-r--r--engines/scumm/player_towns.h120
-rw-r--r--engines/scumm/saveload.cpp9
-rw-r--r--engines/scumm/saveload.h2
-rw-r--r--engines/scumm/script.cpp19
-rw-r--r--engines/scumm/script_v2.cpp1
-rw-r--r--engines/scumm/script_v3.cpp40
-rw-r--r--engines/scumm/script_v4.cpp5
-rw-r--r--engines/scumm/script_v5.cpp61
-rw-r--r--engines/scumm/scumm.cpp45
-rw-r--r--engines/scumm/scumm.h6
-rw-r--r--engines/scumm/scumm_v3.h2
-rw-r--r--engines/scumm/scumm_v5.h5
-rw-r--r--engines/scumm/sound.cpp115
-rw-r--r--engines/scumm/vars.cpp3
-rw-r--r--engines/scumm/verbs.cpp44
-rw-r--r--engines/tinsel/detection_tables.h2
-rw-r--r--engines/tinsel/music.cpp141
-rw-r--r--engines/tinsel/tinsel.cpp16
-rw-r--r--engines/tinsel/tinsel.h8
-rw-r--r--graphics/VectorRendererSpec.cpp2
-rw-r--r--graphics/surface.cpp20
-rw-r--r--graphics/video/codecs/indeo3.cpp109
-rw-r--r--graphics/video/codecs/indeo3.h2
-rw-r--r--graphics/video/coktel_decoder.cpp2
-rw-r--r--gui/ThemeEngine.cpp28
-rw-r--r--gui/launcher.cpp73
-rw-r--r--gui/options.cpp127
-rw-r--r--gui/themes/translations.datbin0 -> 75042 bytes
-rw-r--r--po/POTFILES3
-rw-r--r--po/ca_ES.po497
-rw-r--r--po/de_DE.po488
-rw-r--r--po/es_ES.po690
-rw-r--r--po/fr_FR.po676
-rw-r--r--po/hu_HU.po469
-rw-r--r--po/it_IT.po497
-rw-r--r--po/module.mk14
-rw-r--r--po/ru_RU.po466
-rw-r--r--po/scummvm.pot456
-rw-r--r--po/uk_UA.po690
-rw-r--r--sound/decoders/mp3.cpp2
-rw-r--r--sound/mididrv.cpp31
-rw-r--r--sound/mididrv.h50
-rw-r--r--sound/mods/paula.cpp32
-rw-r--r--sound/module.mk1
-rw-r--r--sound/softsynth/appleiigs.cpp57
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_audio.cpp29
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_audio.h1
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp3
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp16
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h3
-rw-r--r--sound/softsynth/sid.cpp31
-rw-r--r--test/common/bufferedreadstream.h25
-rw-r--r--test/common/str.h2
-rw-r--r--tools/README12
-rw-r--r--tools/create_hugo/create_hugo.cpp1260
-rw-r--r--tools/create_hugo/create_hugo.h555
-rw-r--r--tools/create_hugo/dists/msvc9/create_hugo.sln20
-rw-r--r--tools/create_hugo/dists/msvc9/create_hugo.vcproj219
-rw-r--r--tools/create_hugo/enums.h1565
-rw-r--r--tools/create_hugo/module.mk10
-rw-r--r--tools/create_hugo/staticdata.h11891
-rw-r--r--tools/create_hugo/staticdisplay.h65
-rw-r--r--tools/create_hugo/staticengine.h52
-rw-r--r--tools/create_hugo/staticintro.h59
-rw-r--r--tools/create_hugo/staticmouse.h43
-rw-r--r--tools/create_hugo/staticparser.h58
-rw-r--r--tools/create_hugo/staticschedule.h43
-rw-r--r--tools/create_hugo/staticutil.h51
-rw-r--r--tools/create_translations/create_translations.cpp187
-rw-r--r--tools/create_translations/create_translations.h30
-rw-r--r--tools/create_translations/module.mk11
-rw-r--r--tools/create_translations/po_parser.cpp364
-rw-r--r--tools/create_translations/po_parser.h110
-rwxr-xr-xtools/po2c277
331 files changed, 38879 insertions, 16903 deletions
diff --git a/Makefile b/Makefile
index 6b64759ebd..ad2f8fcf9f 100644
--- a/Makefile
+++ b/Makefile
@@ -42,6 +42,10 @@ ifeq "$(HAVE_CLANG)" "1"
CXXFLAGS+= -Wno-conversion -Wno-shorten-64-to-32 -Wno-sign-compare -Wno-four-char-constants
endif
+# Warn if global constructors are used. Only available in GCC with LLVM backend
+# (and maybe clang?), hence off by default.
+#CXXFLAGS+= -Wglobal-constructors
+
#######################################################################
# Default commands - put the necessary replacements in config.mk #
#######################################################################
diff --git a/Makefile.common b/Makefile.common
index f8b758b4ba..14d73405fd 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -172,12 +172,11 @@ SVNROOT := https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/
endif
# Define the Subversion revision if available, either autodetected or
-# specified by the user
+# specified by the user, but only for base/version.cpp.
ifneq ($(origin VER_SVNREV), undefined)
-CXXFLAGS+= -DSCUMMVM_SVN_REVISION=\"$(VER_SVNREV)\"
+base/version.o: CXXFLAGS:=$(CXXFLAGS) -DSCUMMVM_SVN_REVISION=\"$(VER_SVNREV)\"
endif
-
######################################################################
# Distribution settings
######################################################################
@@ -227,13 +226,20 @@ dist-src: \
DIST_FILES_DOCS:=$(addprefix $(srcdir)/,AUTHORS COPYING COPYING.BSD COPYING.LGPL COPYRIGHT NEWS README)
# Themes files
-DIST_FILES_THEMES:=$(addprefix $(srcdir)/gui/themes/,scummmodern.zip)
+DIST_FILES_THEMES=scummmodern.zip
+ifdef USE_TRANSLATION
+DIST_FILES_THEMES+=translations.dat
+endif
+DIST_FILES_THEMES:=$(addprefix $(srcdir)/gui/themes/,$(DIST_FILES_THEMES))
# Engine data files
DIST_FILES_ENGINEDATA=
ifdef ENABLE_DRASCULA
DIST_FILES_ENGINEDATA+=drascula.dat
endif
+ifdef ENABLE_HUGO
+DIST_FILES_ENGINEDATA+=hugo.dat
+endif
ifdef ENABLE_KYRA
DIST_FILES_ENGINEDATA+=kyra.dat
endif
diff --git a/NEWS b/NEWS
index aac0b7f7e4..0e69339fd9 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,8 @@ For a more comprehensive changelog for the latest experimental SVN code, see:
1.2.0 (????-??-??)
New Ports:
- Added Android port.
+ - Added Dingux port.
+ - Added Caanoo port (based on the GP2XWiz port).
General:
- Removed the outdated PalmOS port.
@@ -33,6 +35,7 @@ For a more comprehensive changelog for the latest experimental SVN code, see:
KYRA:
- Fixed some minor graphical glitches.
- Implemented formerly missing recreation of some in game items.
+ - Added support for playing Kyrandia 3 with the original CD file layout.
Parallaction:
- Made part one of The Big Red Adventure completable.
@@ -44,10 +47,20 @@ For a more comprehensive changelog for the latest experimental SVN code, see:
- Several improvements in Maniac Mansion NES.
PSP port:
- - Switched to new backend design which fixes minor graphical issues,
- speeds things up, and provides 16-bit support.
- - Enabled playback of MP3 files using the hardware decoder (ME). This means that
- the port is now optimized for MP3 playback (as opposed to OGG).
+ - New backend design: fixed minor graphical issues and enabled 16-bit support.
+ - Enabled playback of MP3 files using the Media Engine. This means that
+ the port is optimized for MP3 files (as opposed to OGG).
+ - Many optimizations. Everything should run faster.
+
+ Wii port:
+ - Added support for USB2 mass storage devices (requires The Homebrew Channel
+ >= v1.0.8 with IOS58).
+
+ GameCube port:
+ - Added support for DVDs with the ISO9660 file system.
+
+ GP2X port:
+ - Added support for dynamic engine plugins.
1.1.2 (????-??-??)
Broken Sword 2
diff --git a/README b/README
index c583cf994c..9c60055429 100644
--- a/README
+++ b/README
@@ -139,11 +139,11 @@ support an unsupported game -- read the FAQ on our web site first.
2.1) Reporting Bugs:
---- ---------------
-To report a bug, please create a SourceForge account and follow the bugs
-link from our homepage. Please make sure the bug is reproducible, and
-still occurs in the latest SVN/Daily build version. Also check the known
-problems list (below) and the compatibility list on our website for that
-game, to ensure the issue is not already known:
+To report a bug, please create a SourceForge account and follow the
+"Bug Tracker" link from our homepage. Please make sure the bug is
+reproducible, and still occurs in the latest SVN/Daily build version.
+Also check the known problems list (below) and the compatibility list
+on our website for that game, to ensure the issue is not already known:
http://www.scummvm.org/compatibility_stable.php
@@ -1541,12 +1541,12 @@ order to combine MIDI music with AdLib sound effects.
7.6) Playing sound with Sequencer MIDI: [UNIX ONLY]
---- ----------------------------------
-If your soundcard driver supports a sequencer, you may set the environment
-variable "SCUMMVM_MIDI" to your sequencer device -- for example, to
-/dev/sequencer
+If your soundcard driver supports a sequencer, you may set the
+environment variable "SCUMMVM_MIDI" to your sequencer device -- for
+example, to /dev/sequencer
-If you have problems with not hearing audio in this configuration, it is
-possible you will need to set the "SCUMMVM_MIDIPORT" variable to 1 or 2.
+If you have problems with not hearing audio in this configuration, you
+may need to set the environment variable "SCUMMVM_MIDIPORT" to 1 or 2.
This selects the port on the selected sequencer to use. Then start
scummvm with the -eseq parameter. This should work on several cards, and
may offer better performance and quality than AdLib emulation. However,
@@ -1556,13 +1556,13 @@ fall back on AdLib emulation.
7.6.1) Playing sound with ALSA sequencer: [UNIX ONLY]
------ ----------------------------------
-If you have installed the ALSA driver with the sequencer support, then
-set the environment variable SCUMMVM_PORT or the config file parameter
-alsa_port to your sequencer port. The default is to try both "65:0" and
-"17:0".
+If you have installed the ALSA driver with sequencer support, then you
+may set the environment variable "SCUMMVM_PORT" or the config file
+variable "alsa_port" to specify your sequencer port. If neither is set,
+the default behavior is to try both "65:0" and "17:0".
-Here is a little howto on how to use the ALSA sequencer with your
-soundcard. In all cases, to have a list of all the sequencer ports you
+Here is a brief guide on how to use the ALSA sequencer with your
+soundcard. In all cases, to obtain a list of all the sequencer ports you
have, try the command "aconnect -o -l". This should give output similar
to:
@@ -1619,12 +1619,13 @@ command as described earlier in this section.
7.6.2) Playing sound with IRIX dmedia sequencer: [UNIX ONLY]
---- ------------------------------------------
-If you are using IRIX, driver with the sequencer support, you can
-set the environment variable SCUMMVM_PORT or the config file parameter
-dmedia_port to your sequencer port. The default is to use the first port.
+If you are using IRIX and the dmedia driver with sequencer support, you
+can set the environment variable "SCUMMVM_MIDIPORT" or the config file
+variable "dmedia_port" to specify your sequencer port. The default is to
+use the first port.
-To get a list of configured midi interfaces on your system, run startmidi
-without parameters. Example output:
+To get a list of configured midi interfaces on your system, run
+"startmidi" without parameters. Example output:
2 MIDI interfaces configured:
Serial Port 2
@@ -1642,9 +1643,9 @@ SCUMMVM_PORT=Software Synth in your environment.
7.7) Using TiMidity++ MIDI server:
---- -----------------------------
If you system lacks any MIDI sequencer, but you still want better MIDI
-quality than default AdLib emulation can offer, you can try TiMidity++
-MIDI server. See http://timidity.sourceforge.net/ for download and
-install instructions.
+quality than default AdLib emulation can offer, you can try the
+TiMidity++ MIDI server. See http://timidity.sourceforge.net/ for
+download and install instructions.
First, you need to start a daemon:
@@ -1652,7 +1653,8 @@ First, you need to start a daemon:
Now you can start scummvm and try selection TiMidity music output. By
default, it will connect to localhost:7777, but you can change host/port
-by defining "TIMIDITY_HOST" environment variable.
+via the "TIMIDITY_HOST" environment variable. You can also specify
+a "device number" using the "SCUMMVM_MIDIPORT" environment variable.
7.8) Using compressed audio files
diff --git a/backends/fs/psp/psp-fs.cpp b/backends/fs/psp/psp-fs.cpp
index d72c5108dd..4857a385b7 100644
--- a/backends/fs/psp/psp-fs.cpp
+++ b/backends/fs/psp/psp-fs.cpp
@@ -247,11 +247,19 @@ AbstractFSNode *PSPFilesystemNode::getParent() const {
}
Common::SeekableReadStream *PSPFilesystemNode::createReadStream() {
- return PSPIoStream::makeFromPath(getPath(), false);
+ const uint32 READ_BUFFER_SIZE = 1024;
+
+ Common::SeekableReadStream *stream = PspIoStream::makeFromPath(getPath(), false);
+
+ return new PspIoBufferedReadStream(stream, READ_BUFFER_SIZE, DisposeAfterUse::YES);
}
Common::WriteStream *PSPFilesystemNode::createWriteStream() {
- return PSPIoStream::makeFromPath(getPath(), true);
+ const uint32 WRITE_BUFFER_SIZE = 1024;
+
+ Common::WriteStream *stream = PspIoStream::makeFromPath(getPath(), true);
+
+ return new PspIoBufferedWriteStream(stream, WRITE_BUFFER_SIZE, DisposeAfterUse::YES);
}
#endif //#ifdef __PSP__
diff --git a/backends/fs/psp/psp-stream.cpp b/backends/fs/psp/psp-stream.cpp
index 8843bfd2fb..3b0737ba63 100644
--- a/backends/fs/psp/psp-stream.cpp
+++ b/backends/fs/psp/psp-stream.cpp
@@ -58,58 +58,53 @@ void printBuffer(byte *ptr, uint32 len) {
}
#endif
+// Class PspIoStream ------------------------------------------------
-PSPIoStream::PSPIoStream(const Common::String &path, bool writeMode)
- : _handle(0), _path(path), _writeMode(writeMode),
- _ferror(false), _pos(0),
- _physicalPos(0), _fileSize(0), _inCache(false), _eos(false),
- _cacheStartOffset(-1), _cache(0),
- _errorSuspend(0), _errorSource(0),
- _errorPos(0), _errorHandle(0), _suspendCount(0) {
+PspIoStream::PspIoStream(const Common::String &path, bool writeMode)
+ : _handle(0), _path(path), _fileSize(0), _writeMode(writeMode),
+ _physicalPos(0), _pos(0), _eos(false), _error(false),
+ _errorSuspend(0), _errorSource(0), _errorPos(0), _errorHandle(0), _suspendCount(0) {
DEBUG_ENTER_FUNC();
- // assert(!path.empty()); // do we need this?
+ //assert(!path.empty()); // do we need this?
}
-PSPIoStream::~PSPIoStream() {
+PspIoStream::~PspIoStream() {
DEBUG_ENTER_FUNC();
if (PowerMan.beginCriticalSection())
- PSP_DEBUG_PRINT_FUNC("Suspended\n");
-
- PowerMan.unregisterForSuspend(this); // Unregister with powermanager to be suspended
- // Must do this before fclose() or resume() will reopen.
-
- sceIoClose(_handle); // We don't need a critical section. Worst case, the handle gets closed on its own
+ PSP_DEBUG_PRINT_FUNC("suspended\n");
+
+ PowerMan.unregisterForSuspend(this); // Unregister with powermanager to be suspended
+ // Must do this before fclose() or resume() will reopen.
+ sceIoClose(_handle);
- if (_cache)
- free(_cache);
-
PowerMan.endCriticalSection();
}
/* Function to open the file pointed to by the path.
*
*/
-void *PSPIoStream::open() {
+void *PspIoStream::open() {
DEBUG_ENTER_FUNC();
+
if (PowerMan.beginCriticalSection()) {
- // No need to open. Just return the _handle resume() already opened.
- PSP_DEBUG_PRINT_FUNC("Suspended\n");
+ // No need to open? Just return the _handle resume() already opened
+ PSP_DEBUG_PRINT_FUNC("suspended\n");
}
- _handle = sceIoOpen(_path.c_str(), _writeMode ? PSP_O_RDWR | PSP_O_CREAT : PSP_O_RDONLY, 0777); // open
-
- if (_handle) {
- // Get the file size. This way is much faster than going to the end of the file and back
- SceIoStat stat;
- sceIoGetstat(_path.c_str(), &stat);
- _fileSize = *((uint32 *)(void *)&stat.st_size); // 4GB file is big enough for us
- PSP_DEBUG_PRINT("%s filesize = %d\n", _path.c_str(), _fileSize);
+ _handle = sceIoOpen(_path.c_str(), _writeMode ? PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC : PSP_O_RDONLY, 0777);
+ if (!_handle) {
+ _error = true;
+ _handle = NULL;
+ }
- // Allocate the cache
- _cache = (char *)memalign(64, CACHE_SIZE);
- }
+ // Get the file size. This way is much faster than going to the end of the file and back
+ SceIoStat stat;
+ sceIoGetstat(_path.c_str(), &stat);
+ _fileSize = *((uint32 *)(void *)&stat.st_size); // 4GB file (32 bits) is big enough for us
+
+ PSP_DEBUG_PRINT("%s filesize[%d]\n", _path.c_str(), _fileSize);
PowerMan.registerForSuspend(this); // Register with the powermanager to be suspended
@@ -118,35 +113,48 @@ void *PSPIoStream::open() {
return (void *)_handle;
}
-bool PSPIoStream::err() const {
+bool PspIoStream::err() const {
DEBUG_ENTER_FUNC();
- if (_ferror) // We dump since no printing to screen with suspend
- PSP_ERROR("mem_ferror[%d], source[%d], suspend error[%d], pos[%d], \
- _errorPos[%d], _errorHandle[%p], suspendCount[%d]\n",
- _ferror, _errorSource, _errorSuspend, _pos,
+ if (_error) // We dump since no printing to screen with suspend callback
+ PSP_ERROR("mem_error[%d], source[%d], suspend error[%d], pos[%d],"
+ "_errorPos[%d], _errorHandle[%p], suspendCount[%d]\n",
+ _error, _errorSource, _errorSuspend, _pos,
_errorPos, _errorHandle, _suspendCount);
- return _ferror;
+ return _error;
}
-void PSPIoStream::clearErr() {
- _ferror = false;
+void PspIoStream::clearErr() {
+ _error = false;
}
-bool PSPIoStream::eos() const {
+bool PspIoStream::eos() const {
return _eos;
}
-int32 PSPIoStream::pos() const {
+int32 PspIoStream::pos() const {
return _pos;
}
-int32 PSPIoStream::size() const {
+int32 PspIoStream::size() const {
return _fileSize;
}
-bool PSPIoStream::seek(int32 offs, int whence) {
+bool PspIoStream::physicalSeekFromCur(int32 offset) {
+
+ int ret = sceIoLseek32(_handle, offset, PSP_SEEK_CUR);
+
+ if (ret < 0) {
+ _error = true;
+ PSP_ERROR("failed to seek in file[%s] to [%x]. Error[%x]\n", _path.c_str(), offset, ret);
+ return false;
+ }
+ _physicalPos += offset;
+ return true;
+}
+
+bool PspIoStream::seek(int32 offs, int whence) {
DEBUG_ENTER_FUNC();
PSP_DEBUG_PRINT_FUNC("offset[0x%x], whence[%d], _pos[0x%x], _physPos[0x%x]\n", offs, whence, _pos, _physicalPos);
_eos = false;
@@ -157,195 +165,115 @@ bool PSPIoStream::seek(int32 offs, int whence) {
posToSearchFor = _pos;
break;
case SEEK_END:
- posToSearchFor = _fileSize; // unsure. Does it take us here or to EOS - 1?
+ posToSearchFor = _fileSize;
break;
}
posToSearchFor += offs;
-
+
// Check for bad values
if (posToSearchFor < 0) {
- _ferror = true;
+ _error = true;
return false;
- }
-
- if (posToSearchFor > _fileSize) {
- _ferror = true;
+ } else if (posToSearchFor > _fileSize) {
+ _error = true;
_eos = true;
return false;
}
- // See if we can find it in cache
- if (isOffsetInCache(posToSearchFor)) {
- PSP_DEBUG_PRINT("seek offset[0x%x] found in cache. Cache starts[0x%x]\n", posToSearchFor, _cacheStartOffset);
- _inCache = true;
- } else { // not in cache
- _inCache = false;
- }
_pos = posToSearchFor;
+
return true;
}
-uint32 PSPIoStream::read(void *ptr, uint32 len) {
+uint32 PspIoStream::read(void *ptr, uint32 len) {
DEBUG_ENTER_FUNC();
- PSP_DEBUG_PRINT_FUNC("filename[%s], len[0x%x], ptr[%p]\n", _path.c_str(), len, ptr);
+ PSP_DEBUG_PRINT_FUNC("filename[%s], len[0x%x], ptr[%p], _pos[%x], _physPos[%x]\n", _path.c_str(), len, ptr, _pos, _physicalPos);
- if (_ferror || _eos)
+ if (_error || _eos || len <= 0)
return 0;
-
- byte *destPtr = (byte *)ptr;
- uint32 lenFromFile = len; // how much we read from the actual file
- uint32 lenFromCache = 0; // how much we read from cache
+
uint32 lenRemainingInFile = _fileSize - _pos;
-
- if (lenFromFile > lenRemainingInFile) {
- lenFromFile = lenRemainingInFile;
+
+ // check for getting EOS
+ if (len > lenRemainingInFile) {
+ len = lenRemainingInFile;
_eos = true;
}
-
- // Are we in cache?
- if (_inCache && isCacheValid()) {
- uint32 offsetInCache = _pos - _cacheStartOffset;
- // We can read at most what's in the cache or the remaining size of the file
- lenFromCache = MIN2(lenFromFile, CACHE_SIZE - offsetInCache); // unsure
-
- PSP_DEBUG_PRINT("reading 0x%x bytes from cache to %p. pos[0x%x] physPos[0x%x] cacheStart[0x%x]\n", lenFromCache, destPtr, _pos, _physicalPos, _cacheStartOffset);
-
- memcpy(destPtr, &_cache[offsetInCache], lenFromCache);
- _pos += lenFromCache;
-
- if (lenFromCache < lenFromFile) { // there's more to copy from the file
- lenFromFile -= lenFromCache;
- lenRemainingInFile -= lenFromCache; // since we moved pos
- destPtr += lenFromCache;
- } else { // we're done
-#ifdef DEBUG_BUFFERS
- printBuffer((byte *)ptr, len);
-#endif
-
- return lenFromCache; // how much we actually read
- }
- }
if (PowerMan.beginCriticalSection())
- PSP_DEBUG_PRINT_FUNC("Suspended\n");
-
+ PSP_DEBUG_PRINT_FUNC("suspended\n");
- synchronizePhysicalPos(); // we need to update our physical position
+ // check if we need to seek
+ if (_pos != _physicalPos)
+ PSP_DEBUG_PRINT("seeking from %x to %x\n", _physicalPos, _pos);
+ if (!physicalSeekFromCur(_pos - _physicalPos)) {
+ _error = true;
+ return 0;
+ }
- if (lenFromFile <= MIN_READ_SIZE) { // We load the cache in case the read is small enough
- // This optimization is based on the principle that reading 1 byte is as expensive as 1000 bytes
- uint32 lenToCopyToCache = MIN2((uint32)MIN_READ_SIZE, lenRemainingInFile); // at most remaining file size
-
- PSP_DEBUG_PRINT("filling cache with 0x%x bytes from physicalPos[0x%x]. cacheStart[0x%x], pos[0x%x], fileSize[0x%x]\n", lenToCopyToCache, _physicalPos, _cacheStartOffset, _pos, _fileSize);
-
- int ret = sceIoRead(_handle, _cache, lenToCopyToCache);
- if (ret != (int)lenToCopyToCache) {
- PSP_ERROR("in filling cache, failed to get 0x%x bytes. Only got 0x%x\n", lenToCopyToCache, ret);
- _ferror = true;
- }
- _cacheStartOffset = _physicalPos;
- _inCache = true;
-
- _physicalPos += ret;
-
- PSP_DEBUG_PRINT("copying 0x%x bytes from cache to %p\n", lenFromFile, destPtr);
-
- // Copy to the destination buffer from cache
- memcpy(destPtr, _cache, lenFromFile);
- _pos += lenFromFile;
-
- } else { // Too big for cache. No caching
- PSP_DEBUG_PRINT("reading 0x%x bytes from file to %p. Pos[0x%x], physPos[0x%x]\n", lenFromFile, destPtr, _pos, _physicalPos);
- int ret = sceIoRead(_handle, destPtr, lenFromFile);
-
- _physicalPos += ret; // Update pos
- _pos = _physicalPos;
-
- if (ret != (int)lenFromFile) { // error
- PSP_ERROR("fread returned [0x%x] instead of len[0x%x]\n", ret, lenFromFile);
- _ferror = true;
- _errorSource = 4;
- }
- _inCache = false;
- }
+ int ret = sceIoRead(_handle, ptr, len);
PowerMan.endCriticalSection();
-
-#ifdef DEBUG_BUFFERS
- printBuffer((byte *)ptr, len);
-#endif
-
- return lenFromCache + lenFromFile; // total of what was copied
-}
-
-// TODO: Test if seeking backwards/forwards has any effect on performance
-inline bool PSPIoStream::synchronizePhysicalPos() {
- if (_pos != _physicalPos) {
- if (sceIoLseek32(_handle, _pos - _physicalPos, PSP_SEEK_CUR) < 0) {
- _ferror = true;
- return false;
- }
- _physicalPos = _pos;
- }
- return true;
-}
-
-inline bool PSPIoStream::isOffsetInCache(uint32 offset) {
- if (_cacheStartOffset != -1 &&
- offset >= (uint32)_cacheStartOffset &&
- offset < (uint32)(_cacheStartOffset + CACHE_SIZE))
- return true;
- return false;
-}
+ _physicalPos += ret; // Update position
+ _pos = _physicalPos;
+
+ if (ret != (int)len) { // error
+ PSP_ERROR("sceIoRead returned [0x%x] instead of len[0x%x]\n", ret, len);
+ _error = true;
+ _errorSource = 4;
+ }
+ return ret;
+}
-uint32 PSPIoStream::write(const void *ptr, uint32 len) {
+uint32 PspIoStream::write(const void *ptr, uint32 len) {
DEBUG_ENTER_FUNC();
- // Check if we can access the file
- if (PowerMan.beginCriticalSection())
- PSP_DEBUG_PRINT_FUNC("Suspended\n");
+ PSP_DEBUG_PRINT_FUNC("filename[%s], len[0x%x], ptr[%p], _pos[%x], _physPos[%x]\n", _path.c_str(), len, ptr, _pos, _physicalPos);
- PSP_DEBUG_PRINT_FUNC("filename[%s], len[0x%x]\n", _path.c_str(), len);
-
- if (!len || _ferror) // we actually get calls with len=0
+ if (!len || _error) // we actually get some calls with len == 0!
return 0;
+
+ _eos = false; // we can't have eos with write
- _eos = false; // we can't have eos with write
- synchronizePhysicalPos();
+ if (PowerMan.beginCriticalSection())
+ PSP_DEBUG_PRINT_FUNC("suspended\n");
+
+ // check if we need to seek
+ if (_pos != _physicalPos)
+ if (!physicalSeekFromCur(_pos - _physicalPos)) {
+ _error = true;
+ return 0;
+ }
int ret = sceIoWrite(_handle, ptr, len);
-
- // If we're making the file bigger, adjust the size
- if (_physicalPos + ret > _fileSize)
- _fileSize = _physicalPos + ret;
-
- _physicalPos += ret;
- _pos = _physicalPos;
- _inCache = false;
- _cacheStartOffset = -1; // invalidate cache
-
- if (ret != (int)len) { // Set error
- _ferror = true;
+
+ PowerMan.endCriticalSection();
+
+ if (ret != (int)len) {
+ _error = true;
_errorSource = 5;
- PSP_ERROR("fwrite returned[0x%x] instead of len[0x%x]\n", ret, len);
+ PSP_ERROR("sceIoWrite returned[0x%x] instead of len[0x%x]\n", ret, len);
}
- PowerMan.endCriticalSection();
-
+ _physicalPos += ret;
+ _pos = _physicalPos;
+
+ if (_pos > _fileSize)
+ _fileSize = _pos;
+
return ret;
}
-bool PSPIoStream::flush() {
-
+bool PspIoStream::flush() {
return true;
}
// For the PSP, since we're building in suspend support, we moved opening
-// the actual file to an open function since we need an actual PSPIoStream object to suspend.
+// the actual file to an open function since we need an actual PspIoStream object to suspend.
//
-PSPIoStream *PSPIoStream::makeFromPath(const Common::String &path, bool writeMode) {
+PspIoStream *PspIoStream::makeFromPath(const Common::String &path, bool writeMode) {
DEBUG_ENTER_FUNC();
- PSPIoStream *stream = new PSPIoStream(path, writeMode);
+ PspIoStream *stream = new PspIoStream(path, writeMode);
if (stream->open() <= 0) {
delete stream;
@@ -359,7 +287,7 @@ PSPIoStream *PSPIoStream::makeFromPath(const Common::String &path, bool writeMod
* Function to suspend the IO stream (called by PowerManager)
* we can have no output here
*/
-int PSPIoStream::suspend() {
+int PspIoStream::suspend() {
DEBUG_ENTER_FUNC();
_suspendCount++;
@@ -380,7 +308,7 @@ int PSPIoStream::suspend() {
/*
* Function to resume the IO stream (called by Power Manager)
*/
-int PSPIoStream::resume() {
+int PspIoStream::resume() {
DEBUG_ENTER_FUNC();
int ret = 0;
_suspendCount--;
@@ -388,15 +316,15 @@ int PSPIoStream::resume() {
// We reopen our file descriptor
_handle = sceIoOpen(_path.c_str(), _writeMode ? PSP_O_RDWR | PSP_O_CREAT : PSP_O_RDONLY, 0777); // open
if (_handle <= 0) {
- PSP_ERROR("Couldn't reopen file %s\n", _path.c_str());
+ _errorSuspend = ResumeError;
+ _errorPos = _pos;
}
- // Resume our previous position
+ // Resume our previous position if needed
if (_handle > 0 && _pos > 0) {
ret = sceIoLseek32(_handle, _pos, PSP_SEEK_SET);
_physicalPos = _pos;
- _inCache = false;
if (ret < 0) { // Check for problem
_errorSuspend = ResumeError;
@@ -407,5 +335,4 @@ int PSPIoStream::resume() {
return ret;
}
-
#endif /* __PSP__ */
diff --git a/backends/fs/psp/psp-stream.h b/backends/fs/psp/psp-stream.h
index ca9d40c720..be3a1220de 100644
--- a/backends/fs/psp/psp-stream.h
+++ b/backends/fs/psp/psp-stream.h
@@ -33,18 +33,33 @@
#include "common/stream.h"
#include "common/str.h"
-/*
+class PspIoBufferedReadStream : public Common::BufferedSeekableReadStream {
+public:
+ PspIoBufferedReadStream(SeekableReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::YES) : BufferedSeekableReadStream(parentStream, bufSize, disposeParentStream) {}
+protected:
+ virtual void allocBuf(uint32 bufSize) { _buf = (byte *)memalign(64, bufSize); } // want 64 byte alignment for cache
+ virtual void deallocBuf() { free(_buf); }
+};
+
+class PspIoBufferedWriteStream : public Common::BufferedWriteStream {
+public:
+ PspIoBufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::YES) : BufferedWriteStream(parentStream, bufSize, disposeParentStream) {}
+protected:
+ virtual void allocBuf(uint32 bufSize) { _buf = (byte *)memalign(64, bufSize); }
+ virtual void deallocBuf() { free(_buf); }
+};
+
+/**
* Class to handle special suspend/resume needs of PSP IO Streams
*/
-class PSPIoStream : public Common::SeekableReadStream, public Common::WriteStream, public Common::NonCopyable, public Suspendable {
+class PspIoStream : public Common::SeekableReadStream, public Common::WriteStream, public Common::NonCopyable, public Suspendable {
protected:
SceUID _handle; // file handle
Common::String _path;
int _fileSize;
bool _writeMode; // for resuming in the right mode
- int _physicalPos; // position in the real file
+ int _physicalPos; // physical position in file
int _pos; // position. Sometimes virtual
- bool _inCache; // whether we're in cache (virtual) mode
bool _eos; // EOS flag
enum {
@@ -52,36 +67,26 @@ protected:
ResumeError = 3
};
- enum {
- CACHE_SIZE = 1024,
- MIN_READ_SIZE = 1024 // reading less than 1024 takes exactly the same time as 1024
- };
-
- // For caching
- char *_cache;
- int _cacheStartOffset; // starting offset of the cache. -1 when cache is invalid
-
- mutable int _ferror; // file error state
+ // debug stuff
+ mutable int _error; // file error state
int _errorSuspend; // for debugging
mutable int _errorSource;
int _errorPos;
SceUID _errorHandle;
int _suspendCount;
-
- bool synchronizePhysicalPos(); // synchronize the physical and virtual positions
- bool isOffsetInCache(uint32 pos); // check if an offset is found in cache
- bool isCacheValid() { return _cacheStartOffset != -1; }
+
+ bool physicalSeekFromCur(int32 offset);
public:
/**
* Given a path, invoke fopen on that path and wrap the result in a
- * PSPIoStream instance.
+ * PspIoStream instance.
*/
- static PSPIoStream *makeFromPath(const Common::String &path, bool writeMode);
+ static PspIoStream *makeFromPath(const Common::String &path, bool writeMode);
- PSPIoStream(const Common::String &path, bool writeMode);
- virtual ~PSPIoStream();
+ PspIoStream(const Common::String &path, bool writeMode);
+ virtual ~PspIoStream();
void * open(); // open the file pointed to by the file path
@@ -96,7 +101,8 @@ public:
virtual int32 size() const;
virtual bool seek(int32 offs, int whence = SEEK_SET);
virtual uint32 read(void *dataPtr, uint32 dataSize);
-
+
+ // for suspending
int suspend(); /* Suspendable interface (power manager) */
int resume(); /* " " */
};
diff --git a/backends/platform/dingux/dingux-events.cpp b/backends/platform/dingux/dingux-events.cpp
new file mode 100644
index 0000000000..b6070f68ca
--- /dev/null
+++ b/backends/platform/dingux/dingux-events.cpp
@@ -0,0 +1,215 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "backends/platform/dingux/dingux.h"
+
+#include "graphics/scaler/aspect.h" // for aspect2Real
+
+#if defined (DINGUX)
+
+#define PAD_UP SDLK_UP
+#define PAD_DOWN SDLK_DOWN
+#define PAD_LEFT SDLK_LEFT
+#define PAD_RIGHT SDLK_RIGHT
+#define BUT_A SDLK_LCTRL
+#define BUT_B SDLK_LALT
+#define BUT_X SDLK_SPACE
+#define BUT_Y SDLK_LSHIFT
+#define BUT_SELECT SDLK_ESCAPE
+#define BUT_START SDLK_RETURN
+#define TRIG_L SDLK_TAB
+#define TRIG_R SDLK_BACKSPACE
+
+static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) {
+ if (key >= SDLK_F1 && key <= SDLK_F9) {
+ return key - SDLK_F1 + Common::ASCII_F1;
+ } else if (key >= SDLK_KP0 && key <= SDLK_KP9) {
+ return key - SDLK_KP0 + '0';
+ } else if (key >= SDLK_UP && key <= SDLK_PAGEDOWN) {
+ return key;
+ } else if (unicode) {
+ return unicode;
+ } else if (key >= 'a' && key <= 'z' && (mod & KMOD_SHIFT)) {
+ return key & ~0x20;
+ } else if (key >= SDLK_NUMLOCK && key <= SDLK_EURO) {
+ return 0;
+ }
+ return key;
+}
+
+bool OSystem_SDL_Dingux::remapKey(SDL_Event &ev, Common::Event &event) {
+ if (ev.key.keysym.sym == PAD_UP) {
+ if (ev.type == SDL_KEYDOWN) {
+ _km.y_vel = -1;
+ _km.y_down_count = 1;
+ } else {
+ _km.y_vel = 0;
+ _km.y_down_count = 0;
+ }
+
+ event.type = Common::EVENT_MOUSEMOVE;
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+ } else if (ev.key.keysym.sym == PAD_DOWN) {
+ if (ev.type == SDL_KEYDOWN) {
+ _km.y_vel = 1;
+ _km.y_down_count = 1;
+ } else {
+ _km.y_vel = 0;
+ _km.y_down_count = 0;
+ }
+
+ event.type = Common::EVENT_MOUSEMOVE;
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+ } else if (ev.key.keysym.sym == PAD_LEFT) {
+ if (ev.type == SDL_KEYDOWN) {
+ _km.x_vel = -1;
+ _km.x_down_count = 1;
+ } else {
+ _km.x_vel = 0;
+ _km.x_down_count = 0;
+ }
+
+ event.type = Common::EVENT_MOUSEMOVE;
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+ } else if (ev.key.keysym.sym == PAD_RIGHT) {
+ if (ev.type == SDL_KEYDOWN) {
+ _km.x_vel = 1;
+ _km.x_down_count = 1;
+ } else {
+ _km.x_vel = 0;
+ _km.x_down_count = 0;
+ }
+
+ event.type = Common::EVENT_MOUSEMOVE;
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+ } else if (ev.key.keysym.sym == BUT_Y) { // left mouse button
+ if (ev.type == SDL_KEYDOWN) {
+ event.type = Common::EVENT_LBUTTONDOWN;
+ } else {
+ event.type = Common::EVENT_LBUTTONUP;
+ }
+
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+ } else if (ev.key.keysym.sym == BUT_B) { // right mouse button
+ if (ev.type == SDL_KEYDOWN) {
+ event.type = Common::EVENT_RBUTTONDOWN;
+ } else {
+ event.type = Common::EVENT_RBUTTONUP;
+ }
+
+ fillMouseEvent(event, _km.x, _km.y);
+
+ return true;
+ } else if (ev.key.keysym.sym == BUT_X) { // '.' skip dialogue
+ ev.key.keysym.sym = SDLK_PERIOD;
+ ev.key.keysym.mod = (SDLMod)0;
+ ev.key.keysym.unicode = '.';
+ } else if (ev.key.keysym.sym == TRIG_L) { // global menu
+ ev.key.keysym.sym = SDLK_F5;
+ event.kbd.keycode = Common::KEYCODE_F5;
+ event.kbd.ascii = Common::ASCII_F5;
+ event.kbd.flags = Common::KBD_CTRL;
+
+ if (ev.type == SDL_KEYDOWN) {
+ event.type = Common::EVENT_KEYDOWN;
+ } else {
+ event.type = Common::EVENT_KEYUP;
+ }
+
+ return true;
+ } else if (ev.key.keysym.sym == BUT_A) { // virtual keyboard
+ ev.key.keysym.sym = SDLK_0;
+
+ event.kbd.keycode = Common::KEYCODE_0;
+ event.kbd.ascii = '0';
+ event.kbd.flags = 0;
+
+ if (ev.type == SDL_KEYDOWN) {
+ event.type = Common::EVENT_KEYDOWN;
+ } else {
+ event.type = Common::EVENT_KEYUP;
+ }
+
+ return true;
+ } else if (ev.key.keysym.sym == BUT_SELECT) { // virtual keyboard
+ ev.key.keysym.sym = SDLK_F7;
+
+ } else if (ev.key.keysym.sym == BUT_START) { // F5, menu in some games
+ ev.key.keysym.sym = SDLK_F5;
+
+ } else if (ev.key.keysym.sym == TRIG_R) { // ESC
+ ev.key.keysym.sym = SDLK_ESCAPE;
+ } else {
+ event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym;
+ event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
+ }
+
+ return false;
+}
+
+void OSystem_SDL_Dingux::fillMouseEvent(Common::Event &event, int x, int y) {
+ if (_videoMode.mode == GFX_HALF && !_overlayVisible) {
+ event.mouse.x = x * 2;
+ event.mouse.y = y * 2;
+ } else {
+ event.mouse.x = x;
+ event.mouse.y = y;
+ }
+
+ // Update the "keyboard mouse" coords
+ _km.x = x;
+ _km.y = y;
+
+ // Adjust for the screen scaling
+ if (!_overlayVisible) {
+ event.mouse.x /= _videoMode.scaleFactor;
+ event.mouse.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ event.mouse.y = aspect2Real(event.mouse.y);
+ }
+}
+
+void OSystem_SDL_Dingux::warpMouse(int x, int y) {
+ if (_mouseCurState.x != x || _mouseCurState.y != y) {
+ if (_videoMode.mode == GFX_HALF && !_overlayVisible) {
+ x = x / 2;
+ y = y / 2;
+ }
+ }
+ OSystem_SDL::warpMouse(x, y);
+}
+
+#endif
+
diff --git a/backends/platform/dingux/dingux-graphics.cpp b/backends/platform/dingux/dingux-graphics.cpp
new file mode 100644
index 0000000000..bbd4a58636
--- /dev/null
+++ b/backends/platform/dingux/dingux-graphics.cpp
@@ -0,0 +1,468 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "backends/platform/dingux/dingux.h"
+
+#include "common/mutex.h"
+#include "graphics/scaler.h"
+#include "graphics/scaler/aspect.h"
+#include "graphics/scaler/downscaler.h"
+#include "graphics/surface.h"
+
+#if defined (DINGUX)
+
+static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
+ {"1x", "Standard", GFX_NORMAL},
+ {0, 0, 0}
+};
+
+int OSystem_SDL_Dingux::getDefaultGraphicsMode() const {
+ return GFX_NORMAL;
+}
+
+const OSystem::GraphicsMode *OSystem_SDL_Dingux::getSupportedGraphicsModes() const {
+ return s_supportedGraphicsModes;
+}
+
+bool OSystem_SDL_Dingux::setGraphicsMode(int mode) {
+ Common::StackLock lock(_graphicsMutex);
+
+ assert(_transactionMode == kTransactionActive);
+
+ if (_oldVideoMode.setup && _oldVideoMode.mode == mode)
+ return true;
+
+ int newScaleFactor = 1;
+
+ switch (mode) {
+ case GFX_NORMAL:
+ newScaleFactor = 1;
+ break;
+ case GFX_HALF:
+ newScaleFactor = 1;
+ break;
+ default:
+ warning("unknown gfx mode %d", mode);
+ return false;
+ }
+
+ _transactionDetails.normal1xScaler = (mode == GFX_NORMAL);
+ if (_oldVideoMode.setup && _oldVideoMode.scaleFactor != newScaleFactor)
+ _transactionDetails.needHotswap = true;
+
+ _transactionDetails.needUpdatescreen = true;
+
+ _videoMode.mode = mode;
+ _videoMode.scaleFactor = newScaleFactor;
+
+ return true;
+}
+
+void OSystem_SDL_Dingux::setGraphicsModeIntern() {
+ Common::StackLock lock(_graphicsMutex);
+ ScalerProc *newScalerProc = 0;
+
+ switch (_videoMode.mode) {
+ case GFX_NORMAL:
+ newScalerProc = Normal1x;
+ break;
+ case GFX_HALF:
+ newScalerProc = DownscaleAllByHalf;
+ break;
+
+ default:
+ error("Unknown gfx mode %d", _videoMode.mode);
+ }
+
+ _scalerProc = newScalerProc;
+
+ if (!_screen || !_hwscreen)
+ return;
+
+ // Blit everything to the screen
+ _forceFull = true;
+
+ // Even if the old and new scale factors are the same, we may have a
+ // different scaler for the cursor now.
+ blitCursor();
+}
+
+void OSystem_SDL_Dingux::initSize(uint w, uint h) {
+ assert(_transactionMode == kTransactionActive);
+
+ // Avoid redundant res changes
+ if ((int)w == _videoMode.screenWidth && (int)h == _videoMode.screenHeight)
+ return;
+
+ _videoMode.screenWidth = w;
+ _videoMode.screenHeight = h;
+ if (w > 320 || h > 240) {
+ setGraphicsMode(GFX_HALF);
+ setGraphicsModeIntern();
+ toggleMouseGrab();
+ }
+
+ _transactionDetails.sizeChanged = true;
+}
+
+void OSystem_SDL_Dingux::drawMouse() {
+ if (!_mouseVisible || !_mouseSurface) {
+ _mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0;
+ return;
+ }
+
+ SDL_Rect dst;
+ int scale;
+ int hotX, hotY;
+
+ if (_videoMode.mode == GFX_HALF && !_overlayVisible) {
+ dst.x = _mouseCurState.x / 2;
+ dst.y = _mouseCurState.y / 2;
+ } else {
+ dst.x = _mouseCurState.x;
+ dst.y = _mouseCurState.y;
+ }
+
+ if (!_overlayVisible) {
+ scale = _videoMode.scaleFactor;
+ dst.w = _mouseCurState.vW;
+ dst.h = _mouseCurState.vH;
+ hotX = _mouseCurState.vHotX;
+ hotY = _mouseCurState.vHotY;
+ } else {
+ scale = 1;
+ dst.w = _mouseCurState.rW;
+ dst.h = _mouseCurState.rH;
+ hotX = _mouseCurState.rHotX;
+ hotY = _mouseCurState.rHotY;
+ }
+
+ // The mouse is undrawn using virtual coordinates, i.e. they may be
+ // scaled and aspect-ratio corrected.
+
+ _mouseBackup.x = dst.x - hotX;
+ _mouseBackup.y = dst.y - hotY;
+ _mouseBackup.w = dst.w;
+ _mouseBackup.h = dst.h;
+
+ // We draw the pre-scaled cursor image, so now we need to adjust for
+ // scaling, shake position and aspect ratio correction manually.
+
+ if (!_overlayVisible) {
+ dst.y += _currentShakePos;
+ }
+
+ if (_videoMode.aspectRatioCorrection && !_overlayVisible)
+ dst.y = real2Aspect(dst.y);
+
+ dst.x = scale * dst.x - _mouseCurState.rHotX;
+ dst.y = scale * dst.y - _mouseCurState.rHotY;
+ dst.w = _mouseCurState.rW;
+ dst.h = _mouseCurState.rH;
+
+ // Note that SDL_BlitSurface() and addDirtyRect() will both perform any
+ // clipping necessary
+
+ if (SDL_BlitSurface(_mouseSurface, NULL, _hwscreen, &dst) != 0)
+ error("SDL_BlitSurface failed: %s", SDL_GetError());
+
+ // The screen will be updated using real surface coordinates, i.e.
+ // they will not be scaled or aspect-ratio corrected.
+ addDirtyRect(dst.x, dst.y, dst.w, dst.h, true);
+}
+
+void OSystem_SDL_Dingux::undrawMouse() {
+ const int x = _mouseBackup.x;
+ const int y = _mouseBackup.y;
+
+ // When we switch bigger overlay off mouse jumps. Argh!
+ // This is intended to prevent undrawing offscreen mouse
+ if (!_overlayVisible && (x >= _videoMode.screenWidth || y >= _videoMode.screenHeight))
+ return;
+
+ if (_mouseBackup.w != 0 && _mouseBackup.h != 0) {
+ if (_videoMode.mode == GFX_HALF && !_overlayVisible) {
+ addDirtyRect(x*2, y*2, _mouseBackup.w*2, _mouseBackup.h*2);
+ } else {
+ addDirtyRect(x, y, _mouseBackup.w, _mouseBackup.h);
+ }
+ }
+}
+
+void OSystem_SDL_Dingux::internUpdateScreen() {
+ SDL_Surface *srcSurf, *origSurf;
+ int height, width;
+ ScalerProc *scalerProc;
+ int scale1;
+
+#if defined (DEBUG) && ! defined(_WIN32_WCE) // definitions not available for non-DEBUG here. (needed this to compile in SYMBIAN32 & linux?)
+ assert(_hwscreen != NULL);
+ assert(_hwscreen->map->sw_data != NULL);
+#endif
+
+ // If the shake position changed, fill the dirty area with blackness
+ if (_currentShakePos != _newShakePos) {
+ SDL_Rect blackrect = {0, 0, _videoMode.screenWidth * _videoMode.scaleFactor, _newShakePos * _videoMode.scaleFactor};
+
+ if (_videoMode.aspectRatioCorrection && !_overlayVisible)
+ blackrect.h = real2Aspect(blackrect.h - 1) + 1;
+
+ SDL_FillRect(_hwscreen, &blackrect, 0);
+
+ _currentShakePos = _newShakePos;
+
+ _forceFull = true;
+ }
+
+ // Check whether the palette was changed in the meantime and update the
+ // screen surface accordingly.
+ if (_screen && _paletteDirtyEnd != 0) {
+ SDL_SetColors(_screen, _currentPalette + _paletteDirtyStart,
+ _paletteDirtyStart,
+ _paletteDirtyEnd - _paletteDirtyStart);
+
+ _paletteDirtyEnd = 0;
+
+ _forceFull = true;
+ }
+
+#ifdef USE_OSD
+ // OSD visible (i.e. non-transparent)?
+ if (_osdAlpha != SDL_ALPHA_TRANSPARENT) {
+ // Updated alpha value
+ const int diff = SDL_GetTicks() - _osdFadeStartTime;
+ if (diff > 0) {
+ if (diff >= kOSDFadeOutDuration) {
+ // Back to full transparency
+ _osdAlpha = SDL_ALPHA_TRANSPARENT;
+ } else {
+ // Do a linear fade out...
+ const int startAlpha = SDL_ALPHA_TRANSPARENT + kOSDInitialAlpha * (SDL_ALPHA_OPAQUE - SDL_ALPHA_TRANSPARENT) / 100;
+ _osdAlpha = startAlpha + diff * (SDL_ALPHA_TRANSPARENT - startAlpha) / kOSDFadeOutDuration;
+ }
+ SDL_SetAlpha(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, _osdAlpha);
+ _forceFull = true;
+ }
+ }
+#endif
+
+ if (!_overlayVisible) {
+ origSurf = _screen;
+ srcSurf = _tmpscreen;
+ width = _videoMode.screenWidth;
+ height = _videoMode.screenHeight;
+ scalerProc = _scalerProc;
+ scale1 = _videoMode.scaleFactor;
+ } else {
+ origSurf = _overlayscreen;
+ srcSurf = _tmpscreen2;
+ width = _videoMode.overlayWidth;
+ height = _videoMode.overlayHeight;
+ scalerProc = Normal1x;
+ scale1 = 1;
+ }
+
+ // Add the area covered by the mouse cursor to the list of dirty rects if
+ // we have to redraw the mouse.
+ if (_mouseNeedsRedraw)
+ undrawMouse();
+
+ // Force a full redraw if requested
+ if (_forceFull) {
+ _numDirtyRects = 1;
+ _dirtyRectList[0].x = 0;
+ _dirtyRectList[0].y = 0;
+ _dirtyRectList[0].w = width;
+ _dirtyRectList[0].h = height;
+ }
+
+ // Only draw anything if necessary
+ if (_numDirtyRects > 0 || _mouseNeedsRedraw) {
+ SDL_Rect *r;
+ SDL_Rect dst;
+ uint32 srcPitch, dstPitch;
+ SDL_Rect *lastRect = _dirtyRectList + _numDirtyRects;
+
+ for (r = _dirtyRectList; r != lastRect; ++r) {
+ dst = *r;
+ dst.x++; // Shift rect by one since 2xSai needs to access the data around
+ dst.y++; // any pixel to scale it, and we want to avoid mem access crashes.
+
+ if (SDL_BlitSurface(origSurf, r, srcSurf, &dst) != 0)
+ error("SDL_BlitSurface failed: %s", SDL_GetError());
+ }
+
+ SDL_LockSurface(srcSurf);
+ SDL_LockSurface(_hwscreen);
+
+ srcPitch = srcSurf->pitch;
+ dstPitch = _hwscreen->pitch;
+
+ for (r = _dirtyRectList; r != lastRect; ++r) {
+ register int dst_y = r->y + _currentShakePos;
+ register int dst_h = 0;
+ register int dst_w = r->w;
+ register int orig_dst_y = 0;
+ register int dst_x = r->x;
+ register int src_y;
+ register int src_x;
+
+ if (dst_y < height) {
+ dst_h = r->h;
+ if (dst_h > height - dst_y)
+ dst_h = height - dst_y;
+
+ orig_dst_y = dst_y;
+ src_x = dst_x;
+ src_y = dst_y;
+
+ if (_videoMode.aspectRatioCorrection && !_overlayVisible)
+ dst_y = real2Aspect(dst_y);
+
+ assert(scalerProc != NULL);
+
+ if ((_videoMode.mode == GFX_HALF) && (scalerProc == DownscaleAllByHalf)) {
+ if (dst_x % 2 == 1) {
+ dst_x--;
+ dst_w++;
+ }
+ if (dst_y % 2 == 1) {
+ dst_y--;
+ dst_h++;
+ }
+ src_x = dst_x;
+ src_y = dst_y;
+ dst_x = dst_x / 2;
+ dst_y = dst_y / 2;
+
+ scalerProc((byte *)srcSurf->pixels + (src_x * 2 + 2) + (src_y + 1) * srcPitch, srcPitch,
+ (byte *)_hwscreen->pixels + dst_x * 2 + dst_y * dstPitch, dstPitch, dst_w, dst_h);
+
+ } else {
+ scalerProc((byte *)srcSurf->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch,
+ (byte *)_hwscreen->pixels + r->x * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h);
+ }
+ }
+
+ if (_videoMode.mode == GFX_HALF && scalerProc == DownscaleAllByHalf) {
+ r->w = r->w / 2;
+ r->h = dst_h / 2;
+ } else {
+ r->w = r->w;
+ r->h = dst_h;
+ }
+
+ r->x = dst_x;
+ r->y = dst_y;
+
+
+#ifdef USE_SCALERS
+ if (_videoMode.aspectRatioCorrection && orig_dst_y < height && !_overlayVisible)
+ r->h = stretch200To240((uint8 *) _hwscreen->pixels, dstPitch, r->w, r->h, r->x, r->y, orig_dst_y * scale1);
+#endif
+ }
+ SDL_UnlockSurface(srcSurf);
+ SDL_UnlockSurface(_hwscreen);
+
+ // Readjust the dirty rect list in case we are doing a full update.
+ // This is necessary if shaking is active.
+ if (_forceFull) {
+ _dirtyRectList[0].y = 0;
+ _dirtyRectList[0].h = (_videoMode.mode == GFX_HALF) ? effectiveScreenHeight() / 2 : effectiveScreenHeight();
+ }
+
+ drawMouse();
+
+#ifdef USE_OSD
+ if (_osdAlpha != SDL_ALPHA_TRANSPARENT) {
+ SDL_BlitSurface(_osdSurface, 0, _hwscreen, 0);
+ }
+#endif
+ // Finally, blit all our changes to the screen
+ SDL_UpdateRects(_hwscreen, _numDirtyRects, _dirtyRectList);
+ }
+
+ _numDirtyRects = 0;
+ _forceFull = false;
+ _mouseNeedsRedraw = false;
+}
+
+void OSystem_SDL_Dingux::showOverlay() {
+ if (_videoMode.mode == GFX_HALF) {
+ _mouseCurState.x = _mouseCurState.x / 2;
+ _mouseCurState.y = _mouseCurState.y / 2;
+ }
+ OSystem_SDL::showOverlay();
+}
+
+void OSystem_SDL_Dingux::hideOverlay() {
+ if (_videoMode.mode == GFX_HALF) {
+ _mouseCurState.x = _mouseCurState.x * 2;
+ _mouseCurState.y = _mouseCurState.y * 2;
+ }
+ OSystem_SDL::hideOverlay();
+}
+
+bool OSystem_SDL_Dingux::loadGFXMode() {
+
+ // Forcefully disable aspect ratio correction for games
+ // which starts with a native 240px height resolution.
+ // This fixes games with weird resolutions, like MM Nes (256x240)
+ if(_videoMode.screenHeight == 240) {
+ _videoMode.aspectRatioCorrection = false;
+ }
+
+ fprintf(stdout, "Game ScreenMode = %d*%d\n", _videoMode.screenWidth, _videoMode.screenHeight);
+ if (_videoMode.screenWidth > 320 || _videoMode.screenHeight > 240) {
+ _videoMode.aspectRatioCorrection = false;
+ setGraphicsMode(GFX_HALF);
+ fprintf(stdout, "GraphicsMode set to HALF\n");
+ } else {
+ setGraphicsMode(GFX_NORMAL);
+ fprintf(stdout, "GraphicsMode set to NORMAL\n");
+ }
+
+ if ((_videoMode.mode == GFX_HALF) && !_overlayVisible) {
+ _videoMode.overlayWidth = _videoMode.screenWidth / 2;
+ _videoMode.overlayHeight = _videoMode.screenHeight / 2;
+ _videoMode.fullscreen = true;
+ } else {
+
+ _videoMode.overlayWidth = _videoMode.screenWidth * _videoMode.scaleFactor;
+ _videoMode.overlayHeight = _videoMode.screenHeight * _videoMode.scaleFactor;
+
+ if (_videoMode.aspectRatioCorrection)
+ _videoMode.overlayHeight = real2Aspect(_videoMode.overlayHeight);
+
+ _videoMode.hardwareWidth = _videoMode.screenWidth * _videoMode.scaleFactor;
+ _videoMode.hardwareHeight = effectiveScreenHeight();
+ }
+
+
+ return OSystem_SDL::loadGFXMode();
+}
+
+#endif
+
diff --git a/backends/platform/dingux/dingux.cpp b/backends/platform/dingux/dingux.cpp
new file mode 100644
index 0000000000..cdf10600ce
--- /dev/null
+++ b/backends/platform/dingux/dingux.cpp
@@ -0,0 +1,58 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "backends/platform/dingux/dingux.h"
+
+#if defined(DINGUX)
+
+bool OSystem_SDL_Dingux::hasFeature(Feature f) {
+ return
+ (f == kFeatureAspectRatioCorrection) ||
+ (f == kFeatureCursorHasPalette);
+}
+
+void OSystem_SDL_Dingux::setFeatureState(Feature f, bool enable) {
+ switch (f) {
+ case kFeatureAspectRatioCorrection:
+ setAspectRatioCorrection(enable);
+ break;
+ default:
+ break;
+ }
+}
+
+bool OSystem_SDL_Dingux::getFeatureState(Feature f) {
+ assert(_transactionMode == kTransactionNone);
+
+ switch (f) {
+ case kFeatureAspectRatioCorrection:
+ return _videoMode.aspectRatioCorrection;
+ default:
+ return false;
+ }
+}
+
+#endif
+
diff --git a/backends/platform/dingux/dingux.h b/backends/platform/dingux/dingux.h
new file mode 100644
index 0000000000..846ad3faf9
--- /dev/null
+++ b/backends/platform/dingux/dingux.h
@@ -0,0 +1,69 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef SDL_DINGUX_COMMON_H
+#define SDL_DINGUX_COMMON_H
+
+#include <SDL.h>
+
+#include "backends/base-backend.h"
+#include "backends/platform/sdl/sdl.h"
+
+#if defined(DINGUX)
+
+enum {
+ GFX_HALF = 12
+};
+
+class OSystem_SDL_Dingux : public OSystem_SDL {
+public:
+ virtual bool hasFeature(Feature f);
+ virtual void setFeatureState(Feature f, bool enable);
+ virtual bool getFeatureState(Feature f);
+ virtual int getDefaultGraphicsMode() const;
+
+ void initSize(uint w, uint h);
+ const OSystem::GraphicsMode *getSupportedGraphicsModes() const;
+ bool setGraphicsMode(const char *name);
+ bool setGraphicsMode(int mode);
+ void setGraphicsModeIntern();
+ void internUpdateScreen();
+ void showOverlay();
+ void hideOverlay();
+ bool loadGFXMode();
+ void drawMouse();
+ void undrawMouse();
+ void warpMouse(int, int);
+ void fillMouseEvent(Common::Event&, int, int);
+
+protected:
+ virtual bool remapKey(SDL_Event &ev, Common::Event &event);
+};
+
+
+#endif
+
+#endif
+
diff --git a/backends/platform/dingux/main.cpp b/backends/platform/dingux/main.cpp
new file mode 100644
index 0000000000..7b02151c1a
--- /dev/null
+++ b/backends/platform/dingux/main.cpp
@@ -0,0 +1,53 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "backends/platform/dingux/dingux.h"
+#include "backends/plugins/sdl/sdl-provider.h"
+//#include "backends/plugins/posix/posix-provider.h"
+#include "base/main.h"
+
+#if defined(DINGUX)
+
+#include <unistd.h>
+
+int main(int argc, char* argv[]) {
+
+ g_system = new OSystem_SDL_Dingux();
+ assert(g_system);
+
+#ifdef DYNAMIC_MODULES
+ PluginManager::instance().addPluginProvider(new SDLPluginProvider());
+// PluginManager::instance().addPluginProvider(new POSIXPluginProvider());
+#endif
+
+ // Invoke the actual ScummVM main entry point:
+ int res = scummvm_main(argc, argv);
+ ((OSystem_SDL *)g_system)->deinit();
+ return res;
+
+}
+
+#endif
+
diff --git a/backends/platform/dingux/module.mk b/backends/platform/dingux/module.mk
new file mode 100644
index 0000000000..309fb94442
--- /dev/null
+++ b/backends/platform/dingux/module.mk
@@ -0,0 +1,13 @@
+MODULE := backends/platform/dingux
+
+MODULE_OBJS := \
+ main.o \
+ dingux.o \
+ dingux-events.o \
+ dingux-graphics.o \
+
+MODULE_DIRS += \
+ backends/platform/dingux/
+
+# We don't use the rules.mk here on purpose
+OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS)
diff --git a/backends/platform/gp2xwiz/caanoo/build.sh b/backends/platform/gp2xwiz/caanoo/build.sh
new file mode 100755
index 0000000000..8000d2595d
--- /dev/null
+++ b/backends/platform/gp2xwiz/caanoo/build.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+echo Quick script to make building all the time less painful.
+
+# Set the paths up here to support the build.
+
+cd ../../../..
+
+echo Building ScummVM for GP2X Caanoo.
+make
+
+echo Build for GP2X Caanoo - complete - Please check build logs.
diff --git a/backends/platform/gp2xwiz/caanoo/bundle-debug.sh b/backends/platform/gp2xwiz/caanoo/bundle-debug.sh
new file mode 100755
index 0000000000..2d5cefe80e
--- /dev/null
+++ b/backends/platform/gp2xwiz/caanoo/bundle-debug.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+echo Quick script to make building a distribution of the GP2X Caanoo backend more consistent.
+
+cd ../../../..
+
+echo Building ScummVM for GP2X Caanoo.
+
+make caanoo-bundle-debug
diff --git a/backends/platform/gp2xwiz/caanoo/bundle.sh b/backends/platform/gp2xwiz/caanoo/bundle.sh
new file mode 100755
index 0000000000..76fd31cec6
--- /dev/null
+++ b/backends/platform/gp2xwiz/caanoo/bundle.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+echo Quick script to make building a distribution of the GP2X Caanoo backend more consistent.
+
+cd ../../../..
+
+echo Building ScummVM for GP2X Caanoo.
+
+make caanoo-bundle
diff --git a/backends/platform/gp2xwiz/caanoo/caanoo-bundle.mk b/backends/platform/gp2xwiz/caanoo/caanoo-bundle.mk
new file mode 100755
index 0000000000..f8ac26382d
--- /dev/null
+++ b/backends/platform/gp2xwiz/caanoo/caanoo-bundle.mk
@@ -0,0 +1,67 @@
+# Special target to create bundles for the GP2X Caanoo.
+
+#bundle_name = release/scummvm-caanoo-`date '+%Y-%m-%d'`
+bundle_name = release/scummvm-caanoo
+f=$(shell which $(STRIP))
+libloc = $(shell dirname $(f))
+
+caanoo-bundle: $(EXECUTABLE)
+ $(MKDIR) "$(bundle_name)"
+ $(MKDIR) "$(bundle_name)/scummvm"
+ $(MKDIR) "$(bundle_name)/scummvm/saves"
+ $(MKDIR) "$(bundle_name)/scummvm/engine-data"
+ $(MKDIR) "$(bundle_name)/scummvm/lib"
+
+ echo "Please put your save games in this dir" >> "$(bundle_name)/scummvm/saves/PUT_SAVES_IN_THIS_DIR"
+
+ $(CP) $(srcdir)/backends/platform/gp2xwiz/caanoo/scummvm.gpe $(bundle_name)/scummvm/
+ $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.png $(bundle_name)/scummvm/
+ $(CP) $(srcdir)/backends/platform/gp2xwiz/build/README-GP2XWIZ $(bundle_name)/scummvm/README-CAANOO
+ $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.ini $(bundle_name)/
+
+ $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/scummvm/
+ $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/scummvm/
+ $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/scummvm/engine-data
+ $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/scummvm/
+
+ $(STRIP) $(EXECUTABLE) -o $(bundle_name)/scummvm/$(EXECUTABLE)
+
+ifdef DYNAMIC_MODULES
+ $(INSTALL) -d "$(bundle_name)/scummvm/plugins"
+ $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/scummvm/plugins"
+ $(STRIP) $(bundle_name)/scummvm/plugins/*
+endif
+
+ tar -C $(bundle_name) -cvjf $(bundle_name).tar.bz2 .
+ rm -R ./$(bundle_name)
+
+caanoo-bundle-debug: $(EXECUTABLE)
+ $(MKDIR) "$(bundle_name)"
+ $(MKDIR) "$(bundle_name)/scummvm"
+ $(MKDIR) "$(bundle_name)/scummvm/saves"
+ $(MKDIR) "$(bundle_name)/scummvm/engine-data"
+ $(MKDIR) "$(bundle_name)/scummvm/lib"
+
+ echo "Please put your save games in this dir" >> "$(bundle_name)/scummvm/saves/PUT_SAVES_IN_THIS_DIR"
+
+ $(CP) $(srcdir)/backends/platform/gp2xwiz/caanoo/scummvm-gdb.gpe $(bundle_name)/scummvm/scummvm.gpe
+ $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.png $(bundle_name)/scummvm/
+ $(CP) $(srcdir)/backends/platform/gp2xwiz/build/README-GP2XWIZ $(bundle_name)/scummvm/README-CAANOO
+ $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.ini $(bundle_name)/
+
+ $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/scummvm/
+ $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/scummvm/
+ $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/scummvm/engine-data
+ $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/scummvm/
+
+ $(INSTALL) -c -m 777 $(srcdir)/$(EXECUTABLE) $(bundle_name)/scummvm/$(EXECUTABLE)
+
+ifdef DYNAMIC_MODULES
+ $(INSTALL) -d "$(bundle_name)/scummvm/plugins"
+ $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/scummvm/plugins"
+endif
+
+ tar -C $(bundle_name) -cvjf $(bundle_name)-debug.tar.bz2 .
+ rm -R ./$(bundle_name)
+
+.PHONY: caanoo-bundle caanoo-bundle-debug
diff --git a/backends/platform/gp2xwiz/caanoo/clean.sh b/backends/platform/gp2xwiz/caanoo/clean.sh
new file mode 100755
index 0000000000..5ec1b9e62c
--- /dev/null
+++ b/backends/platform/gp2xwiz/caanoo/clean.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+echo Quick script to make building all the time less painful.
+
+cd ../../../..
+
+echo Cleaning ScummVM for the GP2X Wiz.
+make clean
diff --git a/backends/platform/gp2xwiz/caanoo/config-alleng.sh b/backends/platform/gp2xwiz/caanoo/config-alleng.sh
new file mode 100755
index 0000000000..7a097c268b
--- /dev/null
+++ b/backends/platform/gp2xwiz/caanoo/config-alleng.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+echo Quick script to make running configure all the time less painful
+echo and let all the build work be done from the backend/build folder.
+
+# Assume Caanoo toolchain/build env.
+. /opt/arm-caanoo/environment-setup
+
+# Export the tool names for cross-compiling
+export DEFINES=-DNDEBUG
+
+# Edit the configure line to suit.
+cd ../../../..
+./configure --backend=caanoo --disable-mt32emu --host=caanoo --disable-alsa --disable-flac --disable-nasm --disable-vorbis --disable-hq-scalers --with-sdl-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr/bin --with-mpeg2-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr --enable-tremor --with-tremor-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr --enable-zlib --with-zlib-prefix=/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr --enable-mad --with-mad-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr --enable-all-engines --enable-vkeybd --enable-plugins --default-dynamic
+
+echo Generating config for GP2X Caanoo complete. Check for errors.
diff --git a/backends/platform/gp2xwiz/caanoo/config.sh b/backends/platform/gp2xwiz/caanoo/config.sh
new file mode 100755
index 0000000000..73ce5da624
--- /dev/null
+++ b/backends/platform/gp2xwiz/caanoo/config.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+echo Quick script to make running configure all the time less painful
+echo and let all the build work be done from the backend/build folder.
+
+# Assume Caanoo toolchain/build env.
+. /opt/arm-caanoo/environment-setup
+
+# Export the tool names for cross-compiling
+export DEFINES=-DNDEBUG
+
+# Edit the configure line to suit.
+cd ../../../..
+./configure --backend=caanoo --disable-mt32emu --host=caanoo --disable-alsa --disable-flac --disable-nasm --disable-vorbis --disable-hq-scalers --with-sdl-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr/bin --with-mpeg2-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr --enable-tremor --with-tremor-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr --enable-zlib --with-zlib-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr --enable-mad --with-mad-prefix=/opt/arm-caanoo/arm-none-linux-gnueabi/usr --enable-vkeybd --enable-plugins --default-dynamic
+
+echo Generating config for GP2X Caanoo complete. Check for errors.
diff --git a/backends/platform/gp2xwiz/caanoo/scummvm-gdb.gpe b/backends/platform/gp2xwiz/caanoo/scummvm-gdb.gpe
new file mode 100755
index 0000000000..a8f2aae0fe
--- /dev/null
+++ b/backends/platform/gp2xwiz/caanoo/scummvm-gdb.gpe
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# Export the location of any libs ScummVM depends on
+# (to avoid installing to the NAND and overwriting the broken ones there).
+export LD_LIBRARY_PATH=`pwd`/lib:$LD_LIBRARY_PATH
+
+# Run ScummVM via GDB (so make sure you have a terminal open or serial).
+# Oh, and GDB installed of course ;)
+gdb --args ./scummvm.caanoo --fullscreen --gfx-mode=1x --config=$(pwd)/.scummvmrc
+
+# Sync the SD card to check that everything is written.
+sync
+
+# Return to the GPH menu screen
+cd /usr/gp2x
+exec /usr/gp2x/gp2xmenu
diff --git a/backends/platform/gp2xwiz/caanoo/scummvm.gpe b/backends/platform/gp2xwiz/caanoo/scummvm.gpe
new file mode 100755
index 0000000000..8341ffc3d7
--- /dev/null
+++ b/backends/platform/gp2xwiz/caanoo/scummvm.gpe
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Export the location of any libs ScummVM depends on
+# (to avoid installing to the NAND and overwriting the broken ones there).
+export LD_LIBRARY_PATH=`pwd`/lib:$LD_LIBRARY_PATH
+
+# Run ScummVM, important this bit.
+./scummvm.caanoo --fullscreen --gfx-mode=1x --config=$(pwd)/.scummvmrc
+
+# Sync the SD card to check that everything is written.
+sync
+
+# Return to the GPH menu screen
+cd /usr/gp2x
+exec /usr/gp2x/gp2xmenu
diff --git a/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp b/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp
index f6ad226d42..9b8a41a7cf 100644
--- a/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp
+++ b/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp
@@ -35,11 +35,9 @@
static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
{"1x", "Fullscreen", GFX_NORMAL},
-// {"½x", "Downscale", GFX_HALF},
{0, 0, 0}
};
-
const OSystem::GraphicsMode *OSystem_GP2XWIZ::getSupportedGraphicsModes() const {
return s_supportedGraphicsModes;
}
@@ -111,7 +109,6 @@ void OSystem_GP2XWIZ::setGraphicsModeIntern() {
blitCursor();
}
-
void OSystem_GP2XWIZ::initSize(uint w, uint h) {
assert(_transactionMode == kTransactionActive);
@@ -131,13 +128,30 @@ void OSystem_GP2XWIZ::initSize(uint w, uint h) {
}
bool OSystem_GP2XWIZ::loadGFXMode() {
- _videoMode.overlayWidth = 320;
- _videoMode.overlayHeight = 240;
- _videoMode.fullscreen = true;
-
- if (_videoMode.screenHeight != 200 && _videoMode.screenHeight != 400)
+ if (_videoMode.screenWidth > 320 || _videoMode.screenHeight > 240) {
_videoMode.aspectRatioCorrection = false;
+ setGraphicsMode(GFX_HALF);
+ printf("GFX_HALF\n");
+ } else {
+ setGraphicsMode(GFX_NORMAL);
+ printf("GFX_NORMAL\n");
+ }
+
+ if ((_videoMode.mode == GFX_HALF) && !_overlayVisible) {
+ _videoMode.overlayWidth = _videoMode.screenWidth / 2;
+ _videoMode.overlayHeight = _videoMode.screenHeight / 2;
+ _videoMode.fullscreen = true;
+ } else {
+
+ _videoMode.overlayWidth = _videoMode.screenWidth * _videoMode.scaleFactor;
+ _videoMode.overlayHeight = _videoMode.screenHeight * _videoMode.scaleFactor;
+
+ if (_videoMode.aspectRatioCorrection)
+ _videoMode.overlayHeight = real2Aspect(_videoMode.overlayHeight);
+ _videoMode.hardwareWidth = _videoMode.screenWidth * _videoMode.scaleFactor;
+ _videoMode.hardwareHeight = effectiveScreenHeight();
+ }
return OSystem_SDL::loadGFXMode();
}
@@ -149,6 +163,7 @@ void OSystem_GP2XWIZ::drawMouse() {
SDL_Rect dst;
int scale;
+ int width, height;
int hotX, hotY;
if (_videoMode.mode == GFX_HALF && !_overlayVisible){
@@ -161,12 +176,16 @@ void OSystem_GP2XWIZ::drawMouse() {
if (!_overlayVisible) {
scale = _videoMode.scaleFactor;
+ width = _videoMode.screenWidth;
+ height = _videoMode.screenHeight;
dst.w = _mouseCurState.vW;
dst.h = _mouseCurState.vH;
hotX = _mouseCurState.vHotX;
hotY = _mouseCurState.vHotY;
} else {
scale = 1;
+ width = _videoMode.overlayWidth;
+ height = _videoMode.overlayHeight;
dst.w = _mouseCurState.rW;
dst.h = _mouseCurState.rH;
hotX = _mouseCurState.rHotX;
@@ -231,7 +250,7 @@ void OSystem_GP2XWIZ::internUpdateScreen() {
ScalerProc *scalerProc;
int scale1;
-#if defined (DEBUG) && ! defined(_WIN32_WCE) // definitions not available for non-DEBUG here. (needed this to compile in SYMBIAN32 & linux?)
+#if defined (DEBUG)
assert(_hwscreen != NULL);
assert(_hwscreen->map->sw_data != NULL);
#endif
@@ -295,7 +314,6 @@ void OSystem_GP2XWIZ::internUpdateScreen() {
width = _videoMode.overlayWidth;
height = _videoMode.overlayHeight;
scalerProc = Normal1x;
-
scale1 = 1;
}
@@ -358,7 +376,7 @@ void OSystem_GP2XWIZ::internUpdateScreen() {
assert(scalerProc != NULL);
- if (_videoMode.mode == GFX_HALF && scalerProc == DownscaleAllByHalf){
+ if ((_videoMode.mode == GFX_HALF) && (scalerProc == DownscaleAllByHalf)) {
if (dst_x%2==1){
dst_x--;
dst_w++;
@@ -371,9 +389,13 @@ void OSystem_GP2XWIZ::internUpdateScreen() {
src_y = dst_y;
dst_x = dst_x / 2;
dst_y = dst_y / 2;
- }
- scalerProc((byte *)srcSurf->pixels + (src_x * 2 + 2) + (src_y + 1) * srcPitch, srcPitch,
+
+ scalerProc((byte *)srcSurf->pixels + (src_x * 2 + 2) + (src_y + 1) * srcPitch, srcPitch,
(byte *)_hwscreen->pixels + dst_x * 2 + dst_y * dstPitch, dstPitch, dst_w, dst_h);
+ } else {
+ scalerProc((byte *)srcSurf->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch,
+ (byte *)_hwscreen->pixels + r->x * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h);
+ }
}
if (_videoMode.mode == GFX_HALF && scalerProc == DownscaleAllByHalf){
diff --git a/backends/platform/gp2xwiz/gp2xwiz-main.cpp b/backends/platform/gp2xwiz/gp2xwiz-main.cpp
index 394c3090c3..839afa6a95 100644
--- a/backends/platform/gp2xwiz/gp2xwiz-main.cpp
+++ b/backends/platform/gp2xwiz/gp2xwiz-main.cpp
@@ -30,7 +30,6 @@
#include "backends/platform/gp2xwiz/gp2xwiz-hw.h"
#include "backends/plugins/posix/posix-provider.h"
#include "base/main.h"
-#include "base/internal_version.h"
#include "common/archive.h"
#include "common/config-manager.h"
@@ -55,13 +54,11 @@
#include <time.h> // for getTimeAndDate()
/* Dump console info to files. */
-// #define DUMP_STDOUT
+#define DUMP_STDOUT
int main(int argc, char *argv[]) {
-
g_system = new OSystem_GP2XWIZ();
assert(g_system);
-
#ifdef DYNAMIC_MODULES
PluginManager::instance().addPluginProvider(new POSIXPluginProvider());
#endif
diff --git a/backends/platform/linuxmoto/linuxmoto-main.cpp b/backends/platform/linuxmoto/linuxmoto-main.cpp
index b971a65f7e..97f12e8ce1 100644
--- a/backends/platform/linuxmoto/linuxmoto-main.cpp
+++ b/backends/platform/linuxmoto/linuxmoto-main.cpp
@@ -31,7 +31,6 @@
#include "backends/platform/linuxmoto/linuxmoto-sdl.h"
#include "base/main.h"
-#include "base/internal_version.h"
int main(int argc, char *argv[]) {
g_system = new OSystem_LINUXMOTO();
diff --git a/backends/platform/n64/README.N64 b/backends/platform/n64/README.N64
index 276436b676..c6ae6f021e 100644
--- a/backends/platform/n64/README.N64
+++ b/backends/platform/n64/README.N64
@@ -111,5 +111,6 @@ Notes
** TODO **
==========
+
Write the rest of this README.
diff --git a/backends/platform/n64/osys_n64.h b/backends/platform/n64/osys_n64.h
index f7560eb4d3..707bb1b7ae 100644
--- a/backends/platform/n64/osys_n64.h
+++ b/backends/platform/n64/osys_n64.h
@@ -98,7 +98,7 @@ protected:
uint16 _gameWidth, _gameHeight;
uint16 _frameBufferWidth; // Width of framebuffer in N64 memory
uint8 _offscrPixels; // Pixels to skip on each line before start drawing, used to center image
- uint8 _maxFps;
+ uint8 _maxFps; // Max frames-per-second which can be shown on screen
int _shakeOffset;
@@ -123,7 +123,7 @@ protected:
uint8 _controllerPort;
int8 _mousePort;
- bool _controllerHasRumble;
+ bool _controllerHasRumble; // Gets enabled if rumble-pak is detected
bool _dirtyOffscreen;
@@ -133,8 +133,8 @@ public:
uint16 _audioBufferSize;
uint32 _viClockRate; // Clock rate of video system, depending on VI mode
- int _timerCallbackNext;
- int _timerCallbackTimer;
+ uint32 _timerCallbackNext;
+ uint32 _timerCallbackTimer;
TimerProc _timerCallback;
/* *** */
diff --git a/backends/platform/n64/osys_n64_base.cpp b/backends/platform/n64/osys_n64_base.cpp
index 5e4b84ba3f..06ff38e586 100644
--- a/backends/platform/n64/osys_n64_base.cpp
+++ b/backends/platform/n64/osys_n64_base.cpp
@@ -346,8 +346,7 @@ int16 OSystem_N64::getWidth() {
}
void OSystem_N64::setPalette(const byte *colors, uint start, uint num) {
- for (int i = 0; i < num; ++i) {
- uint8 c[4];
+ for (uint i = 0; i < num; ++i) {
_screenPalette[start + i] = colRGB888toBGR555(colors[2], colors[1], colors[0]);
colors += 4;
}
@@ -413,7 +412,7 @@ void OSystem_N64::grabPalette(byte *colors, uint start, uint num) {
}
void OSystem_N64::setCursorPalette(const byte *colors, uint start, uint num) {
- for (int i = 0; i < num; ++i) {
+ for (uint i = 0; i < num; ++i) {
_cursorPalette[start + i] = colRGB888toBGR555(colors[2], colors[1], colors[0]);
colors += 4;
}
@@ -878,6 +877,8 @@ FilesystemFactory *OSystem_N64::getFilesystemFactory() {
}
void OSystem_N64::setTimerCallback(TimerProc callback, int interval) {
+ assert (interval > 0);
+
if (callback != NULL) {
_timerCallbackTimer = interval;
_timerCallbackNext = getMillis() + interval;
diff --git a/backends/platform/n64/osys_n64_utilities.cpp b/backends/platform/n64/osys_n64_utilities.cpp
index bc4661889f..88a2970d7d 100644
--- a/backends/platform/n64/osys_n64_utilities.cpp
+++ b/backends/platform/n64/osys_n64_utilities.cpp
@@ -42,9 +42,6 @@ void disableAudioPlayback(void) {
_audioEnabled = false;
- OSystem_N64 *osys = (OSystem_N64 *)g_system;
- Audio::MixerImpl *localmixer = (Audio::MixerImpl *)osys->getMixer();
-
while (AI_busy()); // Wait for audio to stop
}
diff --git a/backends/platform/psp/display_manager.cpp b/backends/platform/psp/display_manager.cpp
index 544e5a1b25..e65d6f4fd0 100644
--- a/backends/platform/psp/display_manager.cpp
+++ b/backends/platform/psp/display_manager.cpp
@@ -53,10 +53,9 @@
uint32 __attribute__((aligned(16))) MasterGuRenderer::_displayList[2048];
const OSystem::GraphicsMode DisplayManager::_supportedModes[] = {
- { "320x200 (centered)", "320x200 16-bit centered", CENTERED_320X200 },
- { "435x272 (best-fit, centered)", "435x272 16-bit centered", CENTERED_435X272 },
- { "480x272 (full screen)", "480x272 16-bit stretched", STRETCHED_480X272 },
- { "362x272 (4:3, centered)", "362x272 16-bit centered", CENTERED_362X272 },
+ { "Original Resolution", "Original Resolution", ORIGINAL_RESOLUTION },
+ { "Keep Aspect Ratio", "Keep Aspect Ratio", KEEP_ASPECT_RATIO },
+ { "Full Screen", "Full Screen", STRETCHED_FULL_SCREEN },
{0, 0, 0}
};
@@ -263,38 +262,50 @@ bool DisplayManager::setGraphicsMode(int mode) {
_graphicsMode = mode;
+ calculateScaleParams();
+
+ return true;
+}
+
+void DisplayManager::calculateScaleParams() {
+
+ if (!_displayParams.screenSource.width || !_displayParams.screenSource.height)
+ return; // we can't calculate anything without these
+
switch (_graphicsMode) {
- case CENTERED_320X200:
- _displayParams.screenOutput.width = 320;
- _displayParams.screenOutput.height = 200;
- break;
- case CENTERED_435X272:
- _displayParams.screenOutput.width = 435;
- _displayParams.screenOutput.height = 272;
+ case ORIGINAL_RESOLUTION:
+ // check if we can fit the original resolution inside the screen
+ if ((_displayParams.screenSource.width < PSP_SCREEN_WIDTH) &&
+ (_displayParams.screenSource.height < PSP_SCREEN_HEIGHT)) {
+ _displayParams.screenOutput.width = _displayParams.screenSource.width;
+ _displayParams.screenOutput.height = _displayParams.screenSource.height;
+ } else { // revert to stretch to fit
+ _displayParams.screenOutput.width = PSP_SCREEN_WIDTH;
+ _displayParams.screenOutput.height = PSP_SCREEN_HEIGHT;
+ }
break;
- case STRETCHED_480X272:
- _displayParams.screenOutput.width = 480;
- _displayParams.screenOutput.height = 272;
+ case KEEP_ASPECT_RATIO: { // maximize the height while keeping aspect ratio
+ float aspectRatio = (float)_displayParams.screenSource.width / (float)_displayParams.screenSource.height;
+
+ _displayParams.screenOutput.height = PSP_SCREEN_HEIGHT; // always full height
+ _displayParams.screenOutput.width = (uint32)(PSP_SCREEN_HEIGHT * aspectRatio);
+
+ if (_displayParams.screenOutput.width > PSP_SCREEN_WIDTH) // we can't have wider than the screen
+ _displayParams.screenOutput.width = PSP_SCREEN_WIDTH;
+ }
break;
- case CENTERED_362X272:
- _displayParams.screenOutput.width = 362;
- _displayParams.screenOutput.height = 272;
+ case STRETCHED_FULL_SCREEN: // we simply stretch to the whole screen
+ _displayParams.screenOutput.width = PSP_SCREEN_WIDTH;
+ _displayParams.screenOutput.height = PSP_SCREEN_HEIGHT;
break;
default:
PSP_ERROR("Unsupported graphics mode[%d].\n", _graphicsMode);
}
+
+ // calculate scale factors for X and Y
+ _displayParams.scaleX = ((float)_displayParams.screenOutput.width) / _displayParams.screenSource.width;
+ _displayParams.scaleY = ((float)_displayParams.screenOutput.height) / _displayParams.screenSource.height;
- calculateScaleParams();
-
- return true;
-}
-
-void DisplayManager::calculateScaleParams() {
- if (_displayParams.screenOutput.width && _displayParams.screenSource.width &&
- _displayParams.screenOutput.height && _displayParams.screenSource.height) {
- _displayParams.scaleX = ((float)_displayParams.screenOutput.width) / _displayParams.screenSource.width;
- _displayParams.scaleY = ((float)_displayParams.screenOutput.height) / _displayParams.screenSource.height;
- }
}
// return true if we really rendered or no dirty. False otherwise
diff --git a/backends/platform/psp/display_manager.h b/backends/platform/psp/display_manager.h
index 72f252faae..626415696a 100644
--- a/backends/platform/psp/display_manager.h
+++ b/backends/platform/psp/display_manager.h
@@ -61,10 +61,9 @@ class PSPKeyboard;
class DisplayManager {
public:
enum GraphicsModeID { ///> Possible output formats onscreen
- CENTERED_320X200,
- CENTERED_435X272,
- STRETCHED_480X272,
- CENTERED_362X272
+ ORIGINAL_RESOLUTION,
+ KEEP_ASPECT_RATIO,
+ STRETCHED_FULL_SCREEN
};
DisplayManager() : _screen(0), _cursor(0), _overlay(0), _keyboard(0), _lastUpdateTime(0), _graphicsMode(0) {}
~DisplayManager();
@@ -74,7 +73,7 @@ public:
bool setGraphicsMode(int mode);
bool setGraphicsMode(const char *name);
int getGraphicsMode() const { return _graphicsMode; }
- uint32 getDefaultGraphicsMode() const { return STRETCHED_480X272; }
+ uint32 getDefaultGraphicsMode() const { return STRETCHED_FULL_SCREEN; }
const OSystem::GraphicsMode* getSupportedGraphicsModes() const { return _supportedModes; }
// Setters
diff --git a/backends/platform/psp/mp3.cpp b/backends/platform/psp/mp3.cpp
index e25891396b..98e8a0404b 100644
--- a/backends/platform/psp/mp3.cpp
+++ b/backends/platform/psp/mp3.cpp
@@ -60,6 +60,21 @@ bool Mp3PspStream::_decoderFail = true; // pretend the decoder failed
bool Mp3PspStream::_decoderFail = false; // has the decoder failed to load
#endif
+// Arranged in groups of 3 (layers), starting with MPEG-1 and ending with MPEG 2.5
+static uint32 mp3SamplesPerFrame[9] = {384, 1152, 1152, 384, 1152, 576, 384, 1152, 576};
+
+// The numbering below doesn't correspond to the way they are in the header
+enum {
+ MPEG_VER1 = 0,
+ MPEG_VER1_HEADER = 0x3,
+ MPEG_VER2 = 1,
+ MPEG_VER2_HEADER = 0x2,
+ MPEG_VER2_5 = 2,
+ MPEG_VER2_5_HEADER = 0x0
+};
+
+#define HEADER_GET_MPEG_VERSION(x) ((((x)[1])>>3) & 0x3)
+
bool Mp3PspStream::initDecoder() {
DEBUG_ENTER_FUNC();
@@ -104,7 +119,7 @@ bool Mp3PspStream::stopDecoder() {
return true;
// Based on PSP firmware version, we need to do different things to do Media Engine processing
- if (sceKernelDevkitVersion() == 0x01050001){
+ if (sceKernelDevkitVersion() == 0x01050001){ // TODO: how do we unload?
/* if (!unloadAudioModule("flash0:/kd/me_for_vsh.prx", PSP_MEMORY_PARTITION_KERNEL) ||
!unloadAudioModule("flash0:/kd/audiocodec.prx", PSP_MEMORY_PARTITION_KERNEL) {
PSP_ERROR("failed to unload audio module\n");
@@ -172,17 +187,16 @@ Mp3PspStream::Mp3PspStream(Common::SeekableReadStream *inStream, DisposeAfterUse
initStream(); // init needed stuff for the stream
- while (_state != MP3_STATE_EOS)
- findValidHeader(); // get a first header so we can read basic stuff
+ findValidHeader(); // get a first header so we can read basic stuff
_sampleRate = _header.samplerate; // copy it before it gets destroyed
+
+ while (_state != MP3_STATE_EOS)
+ findValidHeader(); // get a first header so we can read basic stuff
_length = Timestamp(mad_timer_count(_totalTime, MAD_UNITS_MILLISECONDS), getRate());
- //initStreamME(); // init the stuff needed for the ME to work
-
deinitStream();
- //releaseStreamME();
_state = MP3_STATE_INIT;
}
@@ -213,7 +227,6 @@ int Mp3PspStream::initStream() {
bool Mp3PspStream::initStreamME() {
// The following will eventually go into the thread
- sceAudiocodecReleaseEDRAM(_codecParams); // do we need this?
memset(_codecParams, 0, sizeof(_codecParams));
@@ -285,27 +298,23 @@ void Mp3PspStream::decodeMP3Data() {
findValidHeader(); // seach for next valid header
- while (_state == MP3_STATE_READY) {
+ while (_state == MP3_STATE_READY) { // not a real 'while'. Just for easy flow
_stream.error = MAD_ERROR_NONE;
uint32 frame_size = _stream.next_frame - _stream.this_frame;
- uint32 samplesPerFrame = _header.layer == MAD_LAYER_III ? 576 : 1152; // Varies by layer
- // calculate frame size -- try
- //uint32 calc_frame_size = ((144 * _header.bitrate) / 22050) + (_header.flags & MAD_FLAG_PADDING ? 1 : 0);
- // Get stereo/mono
- uint32 multFactor = 1;
- if (_header.mode != MAD_MODE_SINGLE_CHANNEL) // mono - x2 for 16bit
- multFactor *= 2; // stereo - x4 for 16bit
-
- PSP_DEBUG_PRINT("MP3 frame size[%d]. Samples[%d]. Multfactor[%d] pad[%d]\n", frame_size, samplesPerFrame, multFactor, _header.flags & MAD_FLAG_PADDING);
+ updatePcmLength(); // Retrieve the number of PCM samples.
+ // We seem to change this, so it needs to be dynamic
+
+ PSP_DEBUG_PRINT("MP3 frame size[%d]. pcmLength[%d]\n", frame_size, _pcmLength);
+
memcpy(_codecInBuffer, _stream.this_frame, frame_size); // we need it aligned
// set up parameters for ME
_codecParams[6] = (unsigned long)_codecInBuffer;
_codecParams[8] = (unsigned long)_pcmSamples;
_codecParams[7] = frame_size;
- _codecParams[9] = samplesPerFrame * multFactor; // x2 for stereo
+ _codecParams[9] = _pcmLength * 2; // x2 for stereo, though this one's not so important
// debug
#ifdef PRINT_BUFFERS
@@ -320,7 +329,6 @@ void Mp3PspStream::decodeMP3Data() {
int ret = sceAudiocodecDecode(_codecParams, 0x1002);
if (ret < 0) {
PSP_INFO_PRINT("failed to decode MP3 data in ME. sceAudiocodecDecode returned 0x%x\n", ret);
- // handle error here
}
#ifdef PRINT_BUFFERS
@@ -330,7 +338,6 @@ void Mp3PspStream::decodeMP3Data() {
}
PSP_DEBUG_PRINT("\n");
#endif
- _pcmLength = samplesPerFrame;
_posInFrame = 0;
break;
}
@@ -340,6 +347,27 @@ void Mp3PspStream::decodeMP3Data() {
_state = MP3_STATE_EOS;
}
+inline void Mp3PspStream::updatePcmLength() {
+ uint32 mpegVer = HEADER_GET_MPEG_VERSION(_stream.this_frame); // sadly, MAD can't do this for us
+ PSP_DEBUG_PRINT("mpeg ver[%x]\n", mpegVer);
+ switch (mpegVer) {
+ case MPEG_VER1_HEADER:
+ mpegVer = MPEG_VER1;
+ break;
+ case MPEG_VER2_HEADER:
+ mpegVer = MPEG_VER2;
+ break;
+ case MPEG_VER2_5_HEADER:
+ mpegVer = MPEG_VER2_5;
+ break;
+ default:
+ PSP_ERROR("Unknown MPEG version %x\n", mpegVer);
+ break;
+ }
+ PSP_DEBUG_PRINT("layer[%d]\n", _header.layer);
+ _pcmLength = mp3SamplesPerFrame[(mpegVer * 3) + _header.layer - 1];
+}
+
void Mp3PspStream::readMP3DataIntoBuffer() {
DEBUG_ENTER_FUNC();
@@ -393,10 +421,6 @@ bool Mp3PspStream::seek(const Timestamp &where) {
initStreamME();
}
- // The ME will need clear data no matter what once we seek?
- //if (mad_timer_compare(destination, _totalTime) > 0 && _state != MP3_STATE_EOS)
- // initStreamME();
-
// Skip ahead
while (mad_timer_compare(destination, _totalTime) > 0 && _state != MP3_STATE_EOS)
findValidHeader();
@@ -463,9 +487,6 @@ int Mp3PspStream::readBuffer(int16 *buffer, const int numSamples) {
_posInFrame++; // always skip an extra sample since ME always outputs stereo
}
- //memcpy(buffer, &_pcmSamples[_posInFrame], len << 1); // 16 bits
- //_posInFrame += len; // next time we start from the middle
-
if (_posInFrame >= _pcmLength) {
// We used up all PCM data in the current frame -- read & decode more
decodeMP3Data();
@@ -482,6 +503,4 @@ int Mp3PspStream::readBuffer(int16 *buffer, const int numSamples) {
return samples;
}
-} // End of namespace Audio
-
-
+} // End of namespace Audio \ No newline at end of file
diff --git a/backends/platform/psp/mp3.h b/backends/platform/psp/mp3.h
index 029b3e498c..983f4cb7f4 100644
--- a/backends/platform/psp/mp3.h
+++ b/backends/platform/psp/mp3.h
@@ -46,7 +46,7 @@ protected:
MP3_STATE_EOS // end of data reached (may need to loop)
};
- #define MAX_SAMPLES_PER_FRAME 2048 * 2
+ #define MAX_SAMPLES_PER_FRAME 1152 * 2 /* x2 for stereo */
int16 _pcmSamples[MAX_SAMPLES_PER_FRAME] __attribute__((aligned(64))); // samples to output PCM data into
byte _codecInBuffer[3072] __attribute__((aligned(64))); // the codec always needs alignment
unsigned long _codecParams[65]__attribute__((aligned(64))); // TODO: change to struct
@@ -54,7 +54,7 @@ protected:
Common::SeekableReadStream *_inStream;
DisposeAfterUse::Flag _disposeAfterUse;
- uint32 _pcmLength; // how many pcm samples we have (/2 for mono)
+ uint32 _pcmLength; // how many pcm samples we have for this type of file (x2 this for stereo)
uint _posInFrame; // position in frame
State _state; // what state the stream is in
@@ -83,7 +83,8 @@ protected:
int initStream();
void findValidHeader();
void deinitStream();
-
+ void updatePcmLength();
+
// to init and uninit ME decoder
static bool initDecoder();
static bool stopDecoder();
diff --git a/backends/platform/psp/tests.cpp b/backends/platform/psp/tests.cpp
index d1bdb9e640..f65c13ae83 100644
--- a/backends/platform/psp/tests.cpp
+++ b/backends/platform/psp/tests.cpp
@@ -43,7 +43,9 @@
#include "backends/platform/psp/rtc.h"
#include "backends/platform/psp/thread.h"
#include "backends/platform/psp/memory.h"
-
+#include "common/stream.h"
+#include "common/file.h"
+#include "common/fs.h"
#define UNCACHED(x) ((byte *)(((uint32)(x)) | 0x40000000)) /* make an uncached access */
#define CACHED(x) ((byte *)(((uint32)(x)) & 0xBFFFFFFF)) /* make an uncached access into a cached one */
@@ -445,6 +447,7 @@ void PspSpeedTests::fastCopySpeed() {
class PspUnitTests {
public:
void testFastCopy();
+ bool testFileSystem();
private:
enum {
@@ -453,6 +456,7 @@ private:
void fastCopySpecificSize(byte *dst, byte *src, uint32 bytes, bool swap = false);
void fastCopyDifferentSizes(byte *dst, byte *src, bool swap = false);
+
};
void PspUnitTests::testFastCopy() {
@@ -537,6 +541,171 @@ void PspUnitTests::fastCopySpecificSize(byte *dst, byte *src, uint32 bytes, bool
}
}
+// This function leaks. For now I don't care
+bool PspUnitTests::testFileSystem() {
+ // create memory
+ const uint32 BufSize = 32 * 1024;
+ char* buffer = new char[BufSize];
+ int i;
+ Common::WriteStream *wrStream;
+ Common::SeekableReadStream *rdStream;
+
+ PSP_INFO_PRINT("testing fileSystem...\n");
+
+ // fill buffer
+ for (i=0; i<(int)BufSize; i += 4) {
+ buffer[i] = 'A';
+ buffer[i + 1] = 'B';
+ buffer[i + 2] = 'C';
+ buffer[i + 3] = 'D';
+ }
+
+ // create a file
+ const char *path = "./file.test";
+ Common::FSNode file(path);
+
+ PSP_INFO_PRINT("creating write stream...\n");
+
+ wrStream = file.createWriteStream();
+ if (!wrStream) {
+ PSP_ERROR("%s couldn't be created.\n", path);
+ return false;
+ }
+
+ // write contents
+ char* index = buffer;
+ int32 totalLength = BufSize;
+ int32 curLength = 50;
+
+ PSP_INFO_PRINT("writing...\n");
+
+ while(totalLength - curLength > 0) {
+ if ((int)wrStream->write(index, curLength) != curLength) {
+ PSP_ERROR("couldn't write %d bytes\n", curLength);
+ return false;
+ }
+ totalLength -= curLength;
+ index += curLength;
+ //curLength *= 2;
+ //PSP_INFO_PRINT("write\n");
+ }
+
+ // write the rest
+ if ((int)wrStream->write(index, totalLength) != totalLength) {
+ PSP_ERROR("couldn't write %d bytes\n", curLength);
+ return false;
+ }
+
+ delete wrStream;
+
+ PSP_INFO_PRINT("reading...\n");
+
+ rdStream = file.createReadStream();
+ if (!rdStream) {
+ PSP_ERROR("%s couldn't be created.\n", path);
+ return false;
+ }
+
+ // seek to beginning
+ if (!rdStream->seek(0, SEEK_SET)) {
+ PSP_ERROR("couldn't seek to the beginning after writing the file\n");
+ return false;
+ }
+
+ // read the contents
+ char *readBuffer = new char[BufSize + 4];
+ memset(readBuffer, 0, (BufSize + 4));
+ index = readBuffer;
+ while (rdStream->read(index, 100) == 100) {
+ index += 100;
+ }
+
+ if (!rdStream->eos()) {
+ PSP_ERROR("didn't find EOS at end of stream\n");
+ return false;
+ }
+
+ // compare
+ for (i=0; i<(int)BufSize; i++)
+ if (buffer[i] != readBuffer[i]) {
+ PSP_ERROR("reading/writing mistake at %x. Got %x instead of %x\n", i, readBuffer[i], buffer[i]);
+ return false;
+ }
+
+ // Check for exceeding limit
+ for (i=0; i<4; i++) {
+ if (readBuffer[BufSize + i]) {
+ PSP_ERROR("read exceeded limits. %d = %x\n", BufSize + i, readBuffer[BufSize + i]);
+ }
+ }
+
+ delete rdStream;
+
+ PSP_INFO_PRINT("writing...\n");
+
+ wrStream = file.createWriteStream();
+ if (!wrStream) {
+ PSP_ERROR("%s couldn't be created.\n", path);
+ return false;
+ }
+
+ const char *phrase = "Jello is really fabulous";
+ uint32 phraseLen = strlen(phrase);
+
+ int ret;
+ if ((ret = wrStream->write(phrase, phraseLen)) != (int)phraseLen) {
+ PSP_ERROR("couldn't write phrase. Got %d instead of %d\n", ret, phraseLen);
+ return false;
+ }
+
+ PSP_INFO_PRINT("reading...\n");
+
+ delete wrStream;
+ rdStream = file.createReadStream();
+ if (!rdStream) {
+ PSP_ERROR("%s couldn't be created.\n", path);
+ return false;
+ }
+
+ char *readPhrase = new char[phraseLen + 2];
+ memset(readPhrase, 0, phraseLen + 2);
+
+ if ((ret = rdStream->read(readPhrase, phraseLen) != phraseLen)) {
+ PSP_ERROR("read error on phrase. Got %d instead of %d\n", ret, phraseLen);
+ return false;
+ }
+
+ for (i=0; i<(int)phraseLen; i++) {
+ if (readPhrase[i] != phrase[i]) {
+ PSP_ERROR("bad read/write in phrase. At %d, %x != %x\n", i, readPhrase[i], phrase[i]);
+ return false;
+ }
+ }
+
+ // check for exceeding
+ if (readPhrase[i] != 0) {
+ PSP_ERROR("found excessive copy in phrase. %c at %d\n", readPhrase[i], i);
+ return false;
+ }
+
+ PSP_INFO_PRINT("trying to read end...\n");
+
+ // seek to end
+ if (!rdStream->seek(0, SEEK_END)) {
+ PSP_ERROR("couldn't seek to end for append\n");
+ return false;
+ };
+
+ // try to read
+ if (rdStream->read(readPhrase, 2) || !rdStream->eos()) {
+ PSP_ERROR("was able to read at end of file\n");
+ return false;
+ }
+
+ PSP_INFO_PRINT("ok\n");
+ return true;
+}
+
void psp_tests() {
PSP_INFO_PRINT("in tests\n");
@@ -558,7 +727,8 @@ void psp_tests() {
// Unit tests
PspUnitTests unitTests;
- unitTests.testFastCopy();
+ //unitTests.testFastCopy();
+ unitTests.testFileSystem();
#endif
}
diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp
index a97a153f3c..9bf71d1c33 100644
--- a/backends/platform/sdl/graphics.cpp
+++ b/backends/platform/sdl/graphics.cpp
@@ -56,6 +56,8 @@ static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
{0, 0, 0}
};
+DECLARE_TRANSLATION_ADDITIONAL_CONTEXT("Normal (no scaling)", "lowres")
+
// Table of relative scalers magnitudes
// [definedScale - 1][scaleFactor - 1]
static ScalerProc *scalersMagn[3][3] = {
@@ -537,7 +539,7 @@ bool OSystem_SDL::loadGFXMode() {
assert(_inited);
_forceFull = true;
-#if !defined(__MAEMO__) && !defined(GP2XWIZ) && !defined(LINUXMOTO)
+#if !defined(__MAEMO__) && !defined(GP2XWIZ) && !defined(LINUXMOTO) && !defined(DINGUX)
_videoMode.overlayWidth = _videoMode.screenWidth * _videoMode.scaleFactor;
_videoMode.overlayHeight = _videoMode.screenHeight * _videoMode.scaleFactor;
@@ -1393,9 +1395,11 @@ void OSystem_SDL::setMousePos(int x, int y) {
void OSystem_SDL::warpMouse(int x, int y) {
int y1 = y;
- // Don't change mouse position, when mouse is outside of our window (in case of windowed mode)
- if (!(SDL_GetAppState( ) & SDL_APPMOUSEFOCUS))
+ // Don't change actual mouse position, when mouse is outside of our window (in case of windowed mode)
+ if (!(SDL_GetAppState( ) & SDL_APPMOUSEFOCUS)) {
+ setMousePos(x, y); // but change game cursor position
return;
+ }
if (_videoMode.aspectRatioCorrection && !_overlayVisible)
y1 = real2Aspect(y);
diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp
index 52bbb59165..9d116d325a 100644
--- a/backends/platform/sdl/main.cpp
+++ b/backends/platform/sdl/main.cpp
@@ -38,7 +38,7 @@
// Several SDL based ports use a custom main, and hence do not want to compile
// of this file. The following "#if" ensures that.
-#if !defined(__MAEMO__) && !defined(_WIN32_WCE) && !defined(GP2XWIZ)&& !defined(LINUXMOTO) && !defined(__SYMBIAN32__)
+#if !defined(__MAEMO__) && !defined(_WIN32_WCE) && !defined(GP2XWIZ)&& !defined(LINUXMOTO) && !defined(__SYMBIAN32__) && !defined(DINGUX)
#include "backends/platform/sdl/sdl.h"
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index 6686249416..22fc561b0f 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -150,7 +150,7 @@ void OSystem_SDL::initBackend() {
memset(&_videoMode, 0, sizeof(_videoMode));
memset(&_transactionDetails, 0, sizeof(_transactionDetails));
-#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) && defined(USE_SCALERS)
+#if !defined(_WIN32_WCE) && !defined(DINGUX) && !defined(__SYMBIAN32__) && defined(USE_SCALERS)
_videoMode.mode = GFX_DOUBLESIZE;
_videoMode.scaleFactor = 2;
_videoMode.aspectRatioCorrection = ConfMan.getBool("aspect_ratio");
diff --git a/backends/platform/symbian/AdaptAllMMPs.pl b/backends/platform/symbian/AdaptAllMMPs.pl
index 2fba99b873..8b7151c180 100644
--- a/backends/platform/symbian/AdaptAllMMPs.pl
+++ b/backends/platform/symbian/AdaptAllMMPs.pl
@@ -33,6 +33,7 @@ chdir("../../../");
"mmp/scummvm_draci.mmp",
"mmp/scummvm_teenagent.mmp",
"mmp/scummvm_mohawk.mmp",
+ "mmp/scummvm_hugo.mmp",
# Target Platform Project Files
"S60/ScummVM_S60.mmp",
"S60v3/ScummVM_S60v3.mmp",
@@ -79,9 +80,9 @@ my @excludes_snd = (
"fluidsynth.cpp",
"i386.cpp",
"part.*",
- "synth.cpp",
"tables.cpp",
"freeverb.cpp",
+ "synth.cpp",
"rate.*" # not really needed, USE_ARM_SOUND_ASM currently not parsed correctly,
# "rate[_arm|_arm_asm].(cpp|s)" will be added later based on WINS/ARM build!
# These #defines for compile time are set in portdefs.h
@@ -136,6 +137,7 @@ ParseModule("_sci", "sci", \@section_empty);
ParseModule("_draci", "draci", \@section_empty);
ParseModule("_teenagent","teenagent", \@section_empty);
ParseModule("_mohawk" ,"mohawk", \@section_empty);
+ParseModule("_hugo" ,"hugo", \@section_empty);
print "
=======================================================================================
Done. Enjoy :P
diff --git a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
index a9e7aa562a..b6ebbafe74 100644
--- a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
+++ b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
@@ -4,27 +4,24 @@
@WorkingEngines = qw(
scumm agos sky queen gob groovie saga drascula
kyra lure agi touche parallaction cine
- cruise made m4 tinsel tucker sword1 sword2 draci sci teenagent mohawk
+ cruise made m4 tinsel tucker sword1 sword2 draci sci teenagent mohawk hugo
);
@WorkingEngines_1st = qw(
scumm queen groovie saga drascula
touche parallaction cine
- cruise made m4 tucker
+? cruise made m4 tucker
);
@WorkingEngines_2nd = qw(
agos sky gob
kyra lure agi tinsel
- sword1 sword2 draci teenagent
+ sword1 sword2 draci sci teenagent hugo
);
@TestingEngines = qw(
- );
-
- @BrokenEngines = qw(
- );
+ );
@EnablableEngines = (@WorkingEngines, @TestingEngines);
@@ -249,7 +246,7 @@
$SDK_RootDirs{'S60v3'}= "G:\\S60v3";
#$SDK_RootDirs{'S80'}= "D:\\S80";
#$SDK_RootDirs{'S90'}= "D:\\S90";
- $ECompXL_BinDir= "D:\\ECompXL\\";
+ #$ECompXL_BinDir= "D:\\ECompXL\\";
if (0) # so we can turn them on/off easily
{
# $SDK_LibraryDirs{'ALL'}{'zlib.lib'} = "C:\\S\\zlib-1.2.2\\epoc";
@@ -305,7 +302,8 @@
# the first one includes all SDKs & release-ready engines
$VariationSets{'ALL'}{'all'} = "$DefaultFeatures @WorkingEngines @EnablableSubEngines";
-
+ $VariationSets{'ALL'}{'1St'} = "$DefaultFeatures @WorkingEngines_1st @EnablableSubEngines";
+ $VariationSets{'ALL'}{'2nd'} = "$DefaultFeatures @WorkingEngines_2nd @EnablableSubEngines";
# now one for each ready-for-release engine
if (0)
{
diff --git a/backends/platform/symbian/mmp/scummvm_base.mmp.in b/backends/platform/symbian/mmp/scummvm_base.mmp.in
index c178440fa9..ceb62ec843 100644
--- a/backends/platform/symbian/mmp/scummvm_base.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_base.mmp.in
@@ -98,6 +98,8 @@ SOURCEPATH ..\..\..\..\sound
// empty base file, will be updated by Perl build scripts
//STOP_AUTO_OBJECTS_SOUND_//
+SOURCE softsynth\fmtowns_pc98\towns_pc98_fmsynth.cpp // Included since its excluded by filter
+
#if defined (WINS)
SOURCE rate.cpp // WINS emulator version: add regular .cpp
#else
diff --git a/backends/platform/symbian/mmp/scummvm_hugo.mmp.in b/backends/platform/symbian/mmp/scummvm_hugo.mmp.in
new file mode 100644
index 0000000000..4d44ebc944
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_hugo.mmp.in
@@ -0,0 +1,64 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2010 The ScummVM project
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_hugo.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\hugo
+
+//START_AUTO_OBJECTS_HUGO_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_HUGO_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\sound ..\src
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
diff --git a/backends/platform/wii/osystem.h b/backends/platform/wii/osystem.h
index eaaf616538..ed33b43a81 100644
--- a/backends/platform/wii/osystem.h
+++ b/backends/platform/wii/osystem.h
@@ -117,6 +117,7 @@ private:
void deinitGfx();
void updateScreenResolution();
void switchVideoMode(int mode);
+ bool needsScreenUpdate();
void initSfx();
void deinitSfx();
diff --git a/backends/platform/wii/osystem_events.cpp b/backends/platform/wii/osystem_events.cpp
index 488834fc20..5d0bca453f 100644
--- a/backends/platform/wii/osystem_events.cpp
+++ b/backends/platform/wii/osystem_events.cpp
@@ -300,6 +300,9 @@ bool OSystem_Wii::pollEvent(Common::Event &event) {
return true;
}
+ if (needsScreenUpdate())
+ updateScreen();
+
u32 bd = 0, bh = 0, bu = 0;
if (PAD_ScanPads() & 1) {
diff --git a/backends/platform/wii/osystem_gfx.cpp b/backends/platform/wii/osystem_gfx.cpp
index 3ce6343800..09575bb83d 100644
--- a/backends/platform/wii/osystem_gfx.cpp
+++ b/backends/platform/wii/osystem_gfx.cpp
@@ -441,6 +441,22 @@ void OSystem_Wii::copyRectToScreen(const byte *buf, int pitch, int x, int y,
_gameDirty = true;
}
+bool OSystem_Wii::needsScreenUpdate() {
+ if (getMillis() - _lastScreenUpdate < 1000 / MAX_FPS)
+ return false;
+
+ if (_gameRunning && _gameDirty)
+ return true;
+
+ if (_overlayVisible && _overlayDirty)
+ return true;
+
+ if (_mouseVisible && _texMouse.palette && _cursorPaletteDirty)
+ return true;
+
+ return false;
+}
+
void OSystem_Wii::updateScreen() {
static f32 ar;
static gfx_screen_coords_t cc;
diff --git a/base/internal_version.h b/base/internal_version.h
index 2e6b7a24ad..5fd0535142 100644
--- a/base/internal_version.h
+++ b/base/internal_version.h
@@ -1,3 +1,7 @@
+#ifndef INCLUDED_FROM_BASE_VERSION_CPP
+#error This file may only be included by base/version.cpp
+#endif
+
#ifndef SCUMMVM_SVN_REVISION
#define SCUMMVM_SVN_REVISION
#endif
diff --git a/base/internal_version.h.in b/base/internal_version.h.in
index 4eecf90d87..adf5f94d21 100644
--- a/base/internal_version.h.in
+++ b/base/internal_version.h.in
@@ -1,3 +1,7 @@
+#ifndef INCLUDED_FROM_BASE_VERSION_CPP
+#error This file may only be included by base/version.cpp
+#endif
+
#ifndef SCUMMVM_SVN_REVISION
#define SCUMMVM_SVN_REVISION
#endif
diff --git a/base/plugins.cpp b/base/plugins.cpp
index c0ff6f6dfa..b14783abee 100644
--- a/base/plugins.cpp
+++ b/base/plugins.cpp
@@ -115,6 +115,9 @@ public:
#if PLUGIN_ENABLED_STATIC(GROOVIE)
LINK_PLUGIN(GROOVIE)
#endif
+ #if PLUGIN_ENABLED_STATIC(HUGO)
+ LINK_PLUGIN(HUGO)
+ #endif
#if PLUGIN_ENABLED_STATIC(KYRA)
LINK_PLUGIN(KYRA)
#endif
@@ -200,6 +203,11 @@ public:
LINK_PLUGIN(ADLIB)
LINK_PLUGIN(PCSPK)
LINK_PLUGIN(PCJR)
+ #ifndef DISABLE_SID
+ LINK_PLUGIN(C64)
+ #endif
+ LINK_PLUGIN(AMIGA)
+ LINK_PLUGIN(APPLEIIGS)
LINK_PLUGIN(TOWNS)
#if defined (UNIX)
LINK_PLUGIN(TIMIDITY)
diff --git a/base/version.cpp b/base/version.cpp
index 17058d4a03..055067a656 100644
--- a/base/version.cpp
+++ b/base/version.cpp
@@ -24,9 +24,11 @@
*/
#include "common/scummsys.h"
-#include "base/internal_version.h"
#include "base/version.h"
+#define INCLUDED_FROM_BASE_VERSION_CPP
+#include "base/internal_version.h"
+
/*
* Version string and build date string. These can be used by anything that
* wants to display this information to the user (e.g. about dialog).
diff --git a/common/archive.h b/common/archive.h
index 1cc983f77b..c12ca79be0 100644
--- a/common/archive.h
+++ b/common/archive.h
@@ -79,7 +79,8 @@ public:
/**
- * Archive allows searches of (file)names into an arbitrary container.
+ * Archive allows managing of member of arbitrary containers in a uniform
+ * fashion, allowing lookup by (file)names.
* It also supports opening a file and returning an usable input stream.
*/
class Archive {
@@ -87,24 +88,23 @@ public:
virtual ~Archive() { }
/**
- * Check if a name is present in the Archive. Patterns are not allowed,
- * as this is meant to be a quick File::exists() replacement.
+ * Check if a member with the given name is present in the Archive.
+ * Patterns are not allowed, as this is meant to be a quick File::exists()
+ * replacement.
*/
virtual bool hasFile(const String &name) = 0;
/**
- * Add all the names present in the Archive which match pattern to
- * list. Returned names can be used as parameters to createReadStreamForMember.
- * Must not remove elements from the list.
+ * Add all members of the Archive matching the specified pattern to list.
+ * Must only append to list, and not remove elements from it.
*
- * @return the number of names added to list
+ * @return the number of members added to list
*/
virtual int listMatchingMembers(ArchiveMemberList &list, const String &pattern);
/**
- * Add all the names present in the Archive to list. Returned
- * names can be used as parameters to createReadStreamForMember.
- * Must not remove elements from the list.
+ * Add all members of the Archive to list.
+ * Must only append to list, and not remove elements from it.
*
* @return the number of names added to list
*/
@@ -116,8 +116,8 @@ public:
virtual ArchiveMemberPtr getMember(const String &name) = 0;
/**
- * Create a stream bound to a member in the archive. If no member with the
- * specified name exists, then 0 is returned.
+ * Create a stream bound to a member with the specified name in the
+ * archive. If no member with this name exists, 0 is returned.
* @return the newly created input stream
*/
virtual SeekableReadStream *createReadStreamForMember(const String &name) const = 0;
diff --git a/common/config-manager.cpp b/common/config-manager.cpp
index abc5bfb52d..554a99ea95 100644
--- a/common/config-manager.cpp
+++ b/common/config-manager.cpp
@@ -219,32 +219,27 @@ void ConfigManager::flushToDisk() {
stream = dump;
}
+ // Write the application domain
+ writeDomain(*stream, kApplicationDomain, _appDomain);
+
+#ifdef ENABLE_KEYMAPPER
+ // Write the keymapper domain
+ writeDomain(*stream, kKeymapperDomain, _keymapperDomain);
+#endif
+
// First write the domains in _domainSaveOrder, in that order.
// Note: It's possible for _domainSaveOrder to list domains which
- // are not present anymore.
+ // are not present anymore, so we validate each name.
Array<String>::const_iterator i;
for (i = _domainSaveOrder.begin(); i != _domainSaveOrder.end(); ++i) {
- if (kApplicationDomain == *i) {
- writeDomain(*stream, *i, _appDomain);
-#ifdef ENABLE_KEYMAPPER
- } else if (kKeymapperDomain == *i) {
- writeDomain(*stream, *i, _keymapperDomain);
-#endif
- } else if (_gameDomains.contains(*i)) {
+ if (_gameDomains.contains(*i)) {
writeDomain(*stream, *i, _gameDomains[*i]);
}
}
DomainMap::const_iterator d;
-
// Now write the domains which haven't been written yet
- if (find(_domainSaveOrder.begin(), _domainSaveOrder.end(), kApplicationDomain) == _domainSaveOrder.end())
- writeDomain(*stream, kApplicationDomain, _appDomain);
-#ifdef ENABLE_KEYMAPPER
- if (find(_domainSaveOrder.begin(), _domainSaveOrder.end(), kKeymapperDomain) == _domainSaveOrder.end())
- writeDomain(*stream, kKeymapperDomain, _keymapperDomain);
-#endif
for (d = _gameDomains.begin(); d != _gameDomains.end(); ++d) {
if (find(_domainSaveOrder.begin(), _domainSaveOrder.end(), d->_key) == _domainSaveOrder.end())
writeDomain(*stream, d->_key, d->_value);
diff --git a/common/endian.h b/common/endian.h
index db47ff2d07..32f92fd02c 100644
--- a/common/endian.h
+++ b/common/endian.h
@@ -189,22 +189,22 @@
#elif defined(__GNUC__) && (__GNUC__ >= 4)
FORCEINLINE uint16 READ_UINT16(const void *ptr) {
- struct Unaligned16 { uint16 val; } __attribute__ ((__packed__));
+ struct Unaligned16 { uint16 val; } __attribute__ ((__packed__, __may_alias__));
return ((const Unaligned16 *)ptr)->val;
}
FORCEINLINE uint32 READ_UINT32(const void *ptr) {
- struct Unaligned32 { uint32 val; } __attribute__ ((__packed__));
+ struct Unaligned32 { uint32 val; } __attribute__ ((__packed__, __may_alias__));
return ((const Unaligned32 *)ptr)->val;
}
FORCEINLINE void WRITE_UINT16(void *ptr, uint16 value) {
- struct Unaligned16 { uint16 val; } __attribute__ ((__packed__));
+ struct Unaligned16 { uint16 val; } __attribute__ ((__packed__, __may_alias__));
((Unaligned16 *)ptr)->val = value;
}
FORCEINLINE void WRITE_UINT32(void *ptr, uint32 value) {
- struct Unaligned32 { uint32 val; } __attribute__ ((__packed__));
+ struct Unaligned32 { uint32 val; } __attribute__ ((__packed__, __may_alias__));
((Unaligned32 *)ptr)->val = value;
}
diff --git a/common/macresman.cpp b/common/macresman.cpp
index df7351d55a..eb6a5939b6 100644
--- a/common/macresman.cpp
+++ b/common/macresman.cpp
@@ -557,6 +557,7 @@ void MacResManager::convertCrsrCursor(byte *data, int datasize, byte **cursor, i
*hotspot_y = dis.readUint16BE();
*hotspot_x = dis.readUint16BE();
*w = *h = 16;
+ *keycolor = 0xff;
// Use b/w cursor on backends which don't support cursor palettes
if (!colored)
diff --git a/common/macresman.h b/common/macresman.h
index c067b6d2b8..2168235670 100644
--- a/common/macresman.h
+++ b/common/macresman.h
@@ -94,7 +94,7 @@ public:
* The memory will be malloc()'ed
* @param palSize Pointer to integer where the palette size will be stored.
*/
- void convertCrsrCursor(byte *data, int datasize, byte **cursor, int *w, int *h,
+ static void convertCrsrCursor(byte *data, int datasize, byte **cursor, int *w, int *h,
int *hotspot_x, int *hotspot_y, int *keycolor, bool colored, byte **palette, int *palSize);
/**
diff --git a/common/messages.cpp b/common/messages.cpp
deleted file mode 100644
index b21454d02d..0000000000
--- a/common/messages.cpp
+++ /dev/null
@@ -1,2722 +0,0 @@
-// generated by po2c 1.0.2-scummvm - Do not modify
-
-static const char * const _messageIds[] = {
- /* 0 */ "",
- /* 1 */ " Are you sure you want to quit ? ",
- /* 2 */ " (Active)",
- /* 3 */ " (Game)",
- /* 4 */ " (Global)",
- /* 5 */ "(built on %s)",
- /* 6 */ ", error while mounting the share",
- /* 7 */ ", share not mounted",
- /* 8 */ "... progress ...",
- /* 9 */ "11kHz",
- /* 10 */ "22 kHz",
- /* 11 */ "44 kHz",
- /* 12 */ "48 kHz",
- /* 13 */ "8 kHz",
- /* 14 */ "<default>",
- /* 15 */ "About ScummVM",
- /* 16 */ "AdLib Emulator",
- /* 17 */ "AdLib emulator:",
- /* 18 */ "AdLib is used for music in many games",
- /* 19 */ "Add Game...",
- /* 20 */ "Antialiased Renderer (16bpp)",
- /* 21 */ "Aspect ratio correction",
- /* 22 */ "Associated key : %s",
- /* 23 */ "Associated key : none",
- /* 24 */ "Audio",
- /* 25 */ "Autosave:",
- /* 26 */ "Available engines:",
- /* 27 */ "A~b~out...",
- /* 28 */ "Bind Keys",
- /* 29 */ "Both",
- /* 30 */ "Brightness:",
- /* 31 */ "Cancel",
- /* 32 */ "Cannot create file",
- /* 33 */ "Change game options",
- /* 34 */ "Change global ScummVM options",
- /* 35 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer",
- /* 36 */ "Choose",
- /* 37 */ "Choose an action to map",
- /* 38 */ "Clear value",
- /* 39 */ "Close",
- /* 40 */ "Correct aspect ratio for 320x200 games",
- /* 41 */ "Could not find any engine capable of running the selected game",
- /* 42 */ "Current video mode:",
- /* 43 */ "Cursor Down",
- /* 44 */ "Cursor Left",
- /* 45 */ "Cursor Right",
- /* 46 */ "Cursor Up",
- /* 47 */ "DOSBox OPL emulator",
- /* 48 */ "DVD",
- /* 49 */ "DVD Mounted successfully",
- /* 50 */ "DVD not mounted",
- /* 51 */ "Date: ",
- /* 52 */ "Debugger",
- /* 53 */ "Default",
- /* 54 */ "Delete",
- /* 55 */ "Disable power off",
- /* 56 */ "Disabled GFX",
- /* 57 */ "Discovered %d new games ...",
- /* 58 */ "Discovered %d new games.",
- /* 59 */ "Display ",
- /* 60 */ "Display keyboard",
- /* 61 */ "Do you really want to delete this savegame?",
- /* 62 */ "Do you really want to remove this game configuration?",
- /* 63 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.",
- /* 64 */ "Do you want to load or save the game?",
- /* 65 */ "Do you want to perform an automatic scan ?",
- /* 66 */ "Do you want to quit ?",
- /* 67 */ "Double-strike",
- /* 68 */ "Down",
- /* 69 */ "Enable Roland GS Mode",
- /* 70 */ "Engine does not support debug level '%s'",
- /* 71 */ "English",
- /* 72 */ "Error running game:",
- /* 73 */ "Error while mounting the DVD",
- /* 74 */ "Extra Path:",
- /* 75 */ "FM Towns Emulator",
- /* 76 */ "Fast mode",
- /* 77 */ "Features compiled in:",
- /* 78 */ "Free look",
- /* 79 */ "Full title of the game",
- /* 80 */ "Fullscreen mode",
- /* 81 */ "GC Pad acceleration:",
- /* 82 */ "GC Pad sensitivity:",
- /* 83 */ "GFX",
- /* 84 */ "GM Device:",
- /* 85 */ "GUI Language:",
- /* 86 */ "GUI Renderer:",
- /* 87 */ "Game",
- /* 88 */ "Game Data not found",
- /* 89 */ "Game Id not supported",
- /* 90 */ "Game Path:",
- /* 91 */ "Global menu",
- /* 92 */ "Go to previous directory level",
- /* 93 */ "Go up",
- /* 94 */ "Graphics",
- /* 95 */ "Graphics mode:",
- /* 96 */ "Hardware scale (fast, but low quality)",
- /* 97 */ "Hercules Amber",
- /* 98 */ "Hercules Green",
- /* 99 */ "Hide Toolbar",
- /* 100 */ "High quality audio (slower) (reboot)",
- /* 101 */ "Higher value specifies better sound quality but may be not supported by your soundcard",
- /* 102 */ "Hold Shift for Mass Add",
- /* 103 */ "Horizontal underscan:",
- /* 104 */ "IBM PCjr Emulator",
- /* 105 */ "ID:",
- /* 106 */ "Init network",
- /* 107 */ "Initial top screen scale:",
- /* 108 */ "Initialising MT-32 Emulator",
- /* 109 */ "Initialising network",
- /* 110 */ "Input",
- /* 111 */ "Invalid Path",
- /* 112 */ "Key mapper",
- /* 113 */ "Keyboard",
- /* 114 */ "Keymap:",
- /* 115 */ "Keys",
- /* 116 */ "Language of ScummVM GUI",
- /* 117 */ "Language of the game. This will not turn your Spanish game version into English",
- /* 118 */ "Language:",
- /* 119 */ "Left",
- /* 120 */ "Left Click",
- /* 121 */ "Load",
- /* 122 */ "Load game:",
- /* 123 */ "Load savegame for selected game",
- /* 124 */ "MAME OPL emulator",
- /* 125 */ "MIDI",
- /* 126 */ "MIDI gain:",
- /* 127 */ "MT-32",
- /* 128 */ "MT-32 Device:",
- /* 129 */ "MT-32 Emulator",
- /* 130 */ "Main screen scaling:",
- /* 131 */ "Map",
- /* 132 */ "Mass Add...",
- /* 133 */ "Menu",
- /* 134 */ "Misc",
- /* 135 */ "Mixed AdLib/MIDI mode",
- /* 136 */ "Mount DVD",
- /* 137 */ "Mount SMB",
- /* 138 */ "Mouse click",
- /* 139 */ "Multi Function",
- /* 140 */ "Music Device:",
- /* 141 */ "Music volume:",
- /* 142 */ "Mute All",
- /* 143 */ "Name:",
- /* 144 */ "Network down",
- /* 145 */ "Network not initialsed (%d)",
- /* 146 */ "Network up",
- /* 147 */ "Network up, share mounted",
- /* 148 */ "Never",
- /* 149 */ "No",
- /* 150 */ "No date saved",
- /* 151 */ "No music",
- /* 152 */ "No playtime saved",
- /* 153 */ "No time saved",
- /* 154 */ "None",
- /* 155 */ "Normal (no scaling)",
- /* 156 */ "OK",
- /* 157 */ "Output rate:",
- /* 158 */ "Override global MIDI settings",
- /* 159 */ "Override global MT-32 settings",
- /* 160 */ "Override global audio settings",
- /* 161 */ "Override global graphic settings",
- /* 162 */ "Override global volume settings",
- /* 163 */ "PC Speaker Emulator",
- /* 164 */ "Password:",
- /* 165 */ "Path not a directory",
- /* 166 */ "Path not a file",
- /* 167 */ "Path not exists",
- /* 168 */ "Paths",
- /* 169 */ "Pause",
- /* 170 */ "Pick the game:",
- /* 171 */ "Platform the game was originally designed for",
- /* 172 */ "Platform:",
- /* 173 */ "Playtime: ",
- /* 174 */ "Please select an action",
- /* 175 */ "Plugins Path:",
- /* 176 */ "Preferred Device:",
- /* 177 */ "Press the key to associate",
- /* 178 */ "Quit",
- /* 179 */ "Quit ScummVM",
- /* 180 */ "Read permission denied",
- /* 181 */ "Reading failed",
- /* 182 */ "Remap keys",
- /* 183 */ "Remove game from the list. The game data files stay intact",
- /* 184 */ "Render mode:",
- /* 185 */ "Right",
- /* 186 */ "Right Click",
- /* 187 */ "Right click",
- /* 188 */ "Rotate",
- /* 189 */ "SFX volume:",
- /* 190 */ "SMB",
- /* 191 */ "Save",
- /* 192 */ "Save Path:",
- /* 193 */ "Save Path: ",
- /* 194 */ "Save game:",
- /* 195 */ "Scan complete!",
- /* 196 */ "Scanned %d directories ...",
- /* 197 */ "ScummVM Main Menu",
- /* 198 */ "ScummVM could not find any engine capable of running the selected game!",
- /* 199 */ "ScummVM could not find any game in the specified directory!",
- /* 200 */ "ScummVM couldn't open the specified directory!",
- /* 201 */ "Search in game list",
- /* 202 */ "Search:",
- /* 203 */ "Select SoundFont",
- /* 204 */ "Select a Theme",
- /* 205 */ "Select additional game directory",
- /* 206 */ "Select an action and click 'Map'",
- /* 207 */ "Select directory for GUI themes",
- /* 208 */ "Select directory for extra files",
- /* 209 */ "Select directory for plugins",
- /* 210 */ "Select directory for saved games",
- /* 211 */ "Select directory for savegames",
- /* 212 */ "Select directory with game data",
- /* 213 */ "Sensitivity",
- /* 214 */ "Server:",
- /* 215 */ "Share:",
- /* 216 */ "Short game identifier used for referring to savegames and running the game from the command line",
- /* 217 */ "Show Keyboard",
- /* 218 */ "Show mouse cursor",
- /* 219 */ "Show subtitles and play speech",
- /* 220 */ "Show/Hide Cursor",
- /* 221 */ "Skip",
- /* 222 */ "Skip line",
- /* 223 */ "Skip text",
- /* 224 */ "Snap to edges",
- /* 225 */ "Software scale (good quality, but slower)",
- /* 226 */ "Sound on/off",
- /* 227 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity",
- /* 228 */ "SoundFont:",
- /* 229 */ "Spch",
- /* 230 */ "Special dithering modes supported by some games",
- /* 231 */ "Special sound effects volume",
- /* 232 */ "Specifies default sound device for General MIDI output",
- /* 233 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output",
- /* 234 */ "Specifies output sound device or sound card emulator",
- /* 235 */ "Specifies path to additional data used by all games or ScummVM",
- /* 236 */ "Specifies path to additional data used the game",
- /* 237 */ "Specifies preferred sound device or sound card emulator",
- /* 238 */ "Specifies where your savegames are put",
- /* 239 */ "Speech",
- /* 240 */ "Speech volume:",
- /* 241 */ "Standard Renderer (16bpp)",
- /* 242 */ "Start selected game",
- /* 243 */ "Status:",
- /* 244 */ "Subs",
- /* 245 */ "Subtitle speed:",
- /* 246 */ "Subtitles",
- /* 247 */ "Swap character",
- /* 248 */ "Tap for left click, double tap right click",
- /* 249 */ "Text and Speech:",
- /* 250 */ "The chosen directory cannot be written to. Please select another one.",
- /* 251 */ "Theme Path:",
- /* 252 */ "Theme:",
- /* 253 */ "This game ID is already taken. Please choose another one.",
- /* 254 */ "This game does not support loading games from the launcher.",
- /* 255 */ "Time: ",
- /* 256 */ "Timeout while initialising network",
- /* 257 */ "Touch X Offset",
- /* 258 */ "Touch Y Offset",
- /* 259 */ "Touchpad mode disabled.",
- /* 260 */ "Touchpad mode enabled.",
- /* 261 */ "True Roland MT-32 (disable GM emulation)",
- /* 262 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack",
- /* 263 */ "Unknown",
- /* 264 */ "Unknown Error",
- /* 265 */ "Unmount DVD",
- /* 266 */ "Unmount SMB",
- /* 267 */ "Unscaled (you must scroll left and right)",
- /* 268 */ "Unsupported Color Mode",
- /* 269 */ "Untitled savestate",
- /* 270 */ "Up",
- /* 271 */ "Use both MIDI and AdLib sound generation",
- /* 272 */ "Use laptop trackpad-style cursor control",
- /* 273 */ "Username:",
- /* 274 */ "Using SDL driver ",
- /* 275 */ "Vertical underscan:",
- /* 276 */ "Video",
- /* 277 */ "Virtual keyboard",
- /* 278 */ "Volume",
- /* 279 */ "Windows MIDI",
- /* 280 */ "Write permission denied",
- /* 281 */ "Writing data failed",
- /* 282 */ "Yes",
- /* 283 */ "You have to restart ScummVM to take the effect.",
- /* 284 */ "Zone",
- /* 285 */ "Zoom down",
- /* 286 */ "Zoom up",
- /* 287 */ "every 10 mins",
- /* 288 */ "every 15 mins",
- /* 289 */ "every 30 mins",
- /* 290 */ "every 5 mins",
- /* 291 */ "~A~bout",
- /* 292 */ "~A~dd Game...",
- /* 293 */ "~C~ancel",
- /* 294 */ "~C~lose",
- /* 295 */ "~E~dit Game...",
- /* 296 */ "~H~elp",
- /* 297 */ "~I~ndy fight controls",
- /* 298 */ "~K~eys",
- /* 299 */ "~L~eft handed mode",
- /* 300 */ "~L~oad",
- /* 301 */ "~L~oad...",
- /* 302 */ "~N~ext",
- /* 303 */ "~O~K",
- /* 304 */ "~O~ptions",
- /* 305 */ "~O~ptions...",
- /* 306 */ "~P~revious",
- /* 307 */ "~Q~uit",
- /* 308 */ "~R~emove Game",
- /* 309 */ "~R~esume",
- /* 310 */ "~R~eturn to Launcher",
- /* 311 */ "~S~ave",
- /* 312 */ "~S~tart",
- /* 313 */ "~T~ransitions Enabled",
- /* 314 */ "~W~ater Effect Enabled",
- /* 315 */ "~Z~ip Mode Activated",
- NULL
-};
-
-struct PoMessageEntry {
- int msgid;
- const char *msgstr;
-};
-
-static const PoMessageEntry _translation_ru_RU[] = {
- { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko <sev@scummvm.org>\nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: Russian\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" },
- { 1, " \262\353 \343\322\325\340\325\335\353, \347\342\336 \345\336\342\330\342\325 \322\353\331\342\330? " },
- { 2, " (\260\332\342\330\322\335\320\357)" },
- { 3, " (\270\323\340\353)" },
- { 4, " (\263\333\336\321\320\333\354\335\320\357)" },
- { 5, "(\341\336\321\340\320\335 %s)" },
- { 6, ", \336\350\330\321\332\320 \322\336 \322\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 \337\320\337\332\330" },
- { 7, ", \337\320\337\332\320 \335\325 \337\336\324\332\333\356\347\325\335\320" },
- { 8, "... \330\351\343 ..." },
- { 9, "11 \332\263\346" },
- { 10, "22 \332\263\346" },
- { 11, "44 \332\263\346" },
- { 12, "48 \332\263\346" },
- { 13, "8 \332\263\346" },
- { 14, "<\337\336 \343\334\336\333\347\320\335\330\356>" },
- { 15, "\276 \337\340\336\323\340\320\334\334\325 ScummVM" },
- { 16, "\315\334\343\333\357\342\336\340 AdLib" },
- { 17, "\315\334\343\333\357\342\336\340 AdLib:" },
- { 18, "\267\322\343\332\336\322\320\357 \332\320\340\342\320 AdLib \330\341\337\336\333\354\327\343\325\342\341\357 \334\335\336\323\330\334\330 \330\323\340\320\334\330" },
- { 19, "\275\336\322\320\357 \330\323\340\320..." },
- { 20, "\300\320\341\342\325\340\330\327\320\342\336\340 \341\336 \341\323\333\320\326\330\322\320\335\330\325\334 (16bpp)" },
- { 21, "\272\336\340\340\325\332\346\330\357 \341\336\336\342\335\336\350\325\335\330\357 \341\342\336\340\336\335" },
- { 22, "\275\320\327\335\320\347\325\335\335\320\357 \332\333\320\322\330\350\320 : %s" },
- { 23, "\275\320\327\335\320\347\325\335\335\320\357 \332\333\320\322\330\350\320 : \335\325\342" },
- { 24, "\260\343\324\330\336" },
- { 25, "\260\322\342\336\341\336\345\340\320\335\325\335\330\325:" },
- { 26, "\264\336\341\342\343\337\335\353\325 \324\322\330\326\332\330:" },
- { 27, "\276 \337~\340~\336\323\340\320\334\334\325..." },
- { 28, "\275\320\327\335\320\347\330\342\354 \332\333\320\322\330\350\330" },
- { 29, "\262\341\361" },
- { 30, "\317\340\332\336\341\342\354:" },
- { 31, "\276\342\334\325\335\320" },
- { 32, "\275\325 \334\336\323\343 \341\336\327\324\320\342\354 \344\320\331\333" },
- { 33, "\270\327\334\325\335\330\342\354 \336\337\346\330\330 \330\323\340\353" },
- { 34, "\270\327\334\325\335\330\342\354 \323\333\336\321\320\333\354\335\353\325 \336\337\346\330\330 ScummVM" },
- { 35, "\276\342\334\325\342\354\342\325, \325\341\333\330 \343 \322\320\341 \337\336\324\332\333\356\347\325\335\336 Roland-\341\336\322\334\325\341\342\330\334\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330 \322\353 \345\336\342\330\342\325 \325\323\336 \330\341\337\336\333\354\327\336\322\320\342\354" },
- { 36, "\262\353\321\340\320\342\354" },
- { 37, "\262\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325 \324\333\357 \335\320\327\335\320\347\325\335\330\357" },
- { 38, "\276\347\330\341\342\330\342\354 \327\335\320\347\325\335\330\325" },
- { 39, "\267\320\332\340\353\342\354" },
- { 40, "\272\336\340\340\325\332\342\330\340\336\322\320\342\354 \341\336\336\342\335\336\350\325\335\330\325 \341\342\336\340\336\335 \324\333\357 \330\323\340 \341 \340\320\327\340\325\350\325\335\330\325\334 320x200" },
- { 41, "\275\325 \334\336\323\343 \335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\320 \322\353\321\340\320\335\335\336\331 \330\323\340\353" },
- { 42, "\302\325\332\343\351\330\331 \322\330\324\325\336\340\325\326\330\334:" },
- { 43, "\272\343\340\341\336\340 \322\335\330\327" },
- { 44, "\272\343\340\341\336\340 \322\333\325\322\336" },
- { 45, "\272\343\340\341\336\340 \322\337\340\320\322\336" },
- { 46, "\272\343\340\341\336\340 \322\322\325\340\345" },
- { 47, "\315\334\343\333\357\342\336\340 DOSBox OPL" },
- { 48, "DVD" },
- { 49, "DVD \337\336\324\332\333\356\347\325\335 \343\341\337\325\350\335\336" },
- { 50, "DVD \335\325 \337\336\324\332\333\356\347\325\335" },
- { 51, "\264\320\342\320: " },
- { 52, "\276\342\333\320\324\347\330\332" },
- { 53, "\277\336 \343\334\336\333\347\320\335\330\356" },
- { 54, "\303\324\320\333\330\342\354" },
- { 55, "\267\320\337\340\325\342\330\342\354 \322\353\332\333\356\347\325\335\330\325" },
- { 56, "\261\325\327 \323\340\320\344\330\332\330" },
- { 57, "\275\320\331\324\325\335\336 %d \335\336\322\353\345 \330\323\340 ..." },
- { 58, "\275\320\331\324\325\335\336 %d \335\336\322\353\345 \330\323\340." },
- { 59, "\277\336\332\320\327\320\342\354 " },
- { 60, "\277\336\332\320\327\320\342\354 \332\333\320\322\330\320\342\343\340\343" },
- { 61, "\262\353 \324\325\331\341\342\322\330\342\325\333\354\335\336 \345\336\342\330\342\325 \343\324\320\333\330\342\354 \355\342\336 \341\336\345\340\320\335\325\335\330\325?" },
- { 62, "\262\353 \324\325\331\341\342\322\330\342\325\333\354\335\336 \345\336\342\330\342\325 \343\324\320\333\330\342\354 \343\341\342\320\335\336\322\332\330 \324\333\357 \355\342\336\331 \330\323\340\353?" },
- { 63, "\262\353 \324\325\331\341\342\322\330\342\325\333\354\335\336 \345\336\342\330\342\325 \327\320\337\343\341\342\330\342\354 \324\325\342\325\332\342\336\340 \322\341\325\345 \330\323\340? \315\342\336 \337\336\342\325\335\346\330\320\333\354\335\336 \334\336\326\325\342 \324\336\321\320\322\330\342\354 \321\336\333\354\350\336\325 \332\336\333\330\347\325\341\342\322\336 \330\323\340." },
- { 64, "\262\353 \345\336\342\330\342\325 \327\320\323\340\343\327\330\342\354 \333\330\321\336 \341\336\345\340\320\335\330\342\354 \330\323\340\343?" },
- { 65, "\262\353 \345\336\342\330\342\325 \337\340\336\330\327\322\325\341\342\330 \320\322\342\336\334\320\342\330\347\325\341\332\330\331 \337\336\330\341\332?" },
- { 66, "\262\353 \345\336\342\330\342\325 \322\353\331\342\330?" },
- { 67, "\264\322\336\331\335\336\331 \343\324\320\340" },
- { 68, "\262\335\330\327" },
- { 69, "\262\332\333\356\347\330\342\354 \340\325\326\330\334 Roland GS" },
- { 70, "\264\322\330\326\336\332 \335\325 \337\336\324\324\325\340\326\330\322\320\325\342 \343\340\336\322\325\335\354 \336\342\333\320\324\332\330 '%s'" },
- { 71, "English" },
- { 72, "\276\350\330\321\332\320 \327\320\337\343\341\332\320 \330\323\340\353:" },
- { 73, "\276\350\330\321\332\320 \322\336 \322\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 DVD" },
- { 74, "\264\336\337. \337\343\342\354:" },
- { 75, "\315\334\343\333\357\342\336\340 FM Towns" },
- { 76, "\261\353\341\342\340\353\331 \340\325\326\330\334" },
- { 77, "\262\332\333\356\347\325\335\335\353\325 \322 \321\330\333\324 \336\337\346\330\330:" },
- { 78, "\301\322\336\321\336\324\335\353\331 \336\321\327\336\340" },
- { 79, "\277\336\333\335\336\325 \335\320\327\322\320\335\330\325 \330\323\340\353" },
- { 80, "\277\336\333\335\336\355\332\340\320\335\335\353\331 \340\325\326\330\334" },
- { 81, "\303\341\332\336\340\325\335\330\325 GC \337\320\324\320:" },
- { 82, "\307\343\322\341\342\322\330\342\325\333\354\335\336\341\342\354 GC \337\320\324\320:" },
- { 83, "\263\340\344" },
- { 84, "\303\341\342\340\336\331\341\342\322\336 GM:" },
- { 85, "\317\327\353\332 GUI:" },
- { 86, "\300\330\341\336\322\320\333\332\320 GUI:" },
- { 87, "\270\323\340\320" },
- { 88, "\275\325\342 \344\320\331\333\336\322 \330\323\340\353" },
- { 89, "Game Id \335\325 \337\336\324\324\325\340\326\330\322\320\325\342\341\357" },
- { 90, "\263\324\325 \330\323\340\320: " },
- { 91, "\263\333\336\321\320\333\354\335\336\325 \334\325\335\356" },
- { 92, "\277\325\340\325\331\342\330 \335\320 \324\330\340\325\332\342\336\340\330\356 \343\340\336\322\335\325\334 \322\353\350\325" },
- { 93, "\262\322\325\340\345" },
- { 94, "\263\340\320\344\330\332\320" },
- { 95, "\263\340\320\344. \340\325\326\330\334:" },
- { 96, "\305\320\340\324\322\320\340\335\336\325 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\325 (\321\353\341\342\340\336, \335\336 \335\330\327\332\336\323\336 \332\320\347\325\341\342\322\320)" },
- { 97, "Hercules \317\335\342\320\340\335\353\331" },
- { 98, "Hercules \267\325\333\325\335\353\331" },
- { 99, "\301\337\340\357\342\320\342\354 \337\320\335\325\333\354 \330\335\341\342\340\343\334\325\335\342\336\322" },
- { 100, "\262\353\341\336\332\336\325 \332\320\347\325\341\342\322\336 \327\322\343\332\320 (\334\325\324\333\325\335\335\325\325) (\340\325\321\343\342)" },
- { 101, "\261\276\333\354\350\330\325 \327\335\320\347\325\335\330\357 \327\320\324\320\356\342 \333\343\347\350\325\325 \332\320\347\325\341\342\322\336 \327\322\343\332\320, \336\324\335\320\332\336 \336\335\330 \334\336\323\343\342 \335\325 \337\336\324\324\325\340\326\330\322\320\342\354\341\357 \322\320\350\325\331 \327\322\343\332\336\322\336\331 \332\320\340\342\336\331" },
- { 102, "\303\324\325\340\326\330\322\320\331\342\325 \332\333\320\322\330\350\343 Shift \324\333\357 \342\336\323\336, \347\342\336\321\353 \324\336\321\320\322\330\342\354 \335\325\341\332\336\333\354\332\336 \330\323\340" },
- { 103, "\263\336\340\330\327\336\335\342\320\333\354\335\353\331 underscan:" },
- { 104, "\315\334\343\333\357\342\336\340 IBM PCjr" },
- { 105, "ID:" },
- { 106, "\270\335\330\346\330\320\333\330\327\320\346\330\357 \341\325\342\330" },
- { 107, "\275\320\347\320\333\354\335\353\331 \334\320\341\350\342\320\321 \322\325\340\345\335\325\323\336 \355\332\340\320\335\320:" },
- { 108, "\275\320\341\342\340\320\330\322\320\356 \355\334\343\333\357\342\336\340 MT-32" },
- { 109, "\275\320\341\342\340\320\330\322\320\356 \341\325\342\354" },
- { 110, "\262\322\336\324" },
- { 111, "\275\325\322\325\340\335\353\331 \337\343\342\354" },
- { 112, "\275\320\327\335\320\347\325\335\330\325 \332\333\320\322\330\350" },
- { 113, "\272\333\320\322\330\320\342\343\340\320" },
- { 114, "\302\320\321\333\330\346\320 \332\333\320\322\330\350:" },
- { 115, "\272\333\320\322\330\350\330" },
- { 116, "\317\327\353\332 \323\340\320\344\330\347\325\341\332\336\323\336 \330\335\342\325\340\344\325\331\341\320 ScummVM" },
- { 117, "\317\327\353\332 \330\323\340\353. \270\327\334\325\335\325\335\330\325 \355\342\336\323\336 \337\320\340\320\334\325\342\340\320 \335\325 \337\340\325\322\340\320\342\330\342 \330\323\340\343 \335\320 \320\335\323\333\330\331\341\332\336\334 \322 \340\343\341\341\332\343\356" },
- { 118, "\317\327\353\332:" },
- { 119, "\262\333\325\322\336" },
- { 120, "\273\325\322\353\331 \351\325\333\347\336\332" },
- { 121, "\267\320\323\340\343\327\330\342\354" },
- { 122, "\267\320\323\340\343\327\330\342\354 \330\323\340\343:" },
- { 123, "\267\320\323\340\343\327\330\342\354 \341\336\345\340\335\325\335\330\325 \324\333\357 \322\353\321\340\320\335\335\336\331 \330\323\340\353" },
- { 124, "\315\334\343\333\357\342\336\340 MAME OPL" },
- { 125, "MIDI" },
- { 126, "\303\341\330\333\325\335\330\325 MIDI:" },
- { 127, "MT-32" },
- { 128, "\303\341\342\340. MT-32:" },
- { 129, "\315\334\343\333\357\342\336\340 MT-32" },
- { 130, "\274\320\341\350\342\320\321 \323\333\320\322\335\336\323\336 \355\332\340\320\335\320:" },
- { 131, "\275\320\327\335\320\347\330\342\354" },
- { 132, "\274\335\336\323\336 \330\323\340..." },
- { 133, "\274\325\335\356" },
- { 134, "\300\320\327\335\336\325" },
- { 135, "\301\334\325\350\320\335\335\353\331 \340\325\326\330\334 AdLib/MIDI" },
- { 136, "\277\336\324\332\333\356\347\330\342\354 DVD" },
- { 137, "\277\336\324\332\333\356\347\330\342\354 SMB" },
- { 138, "\272\333\330\332 \334\353\350\354\356" },
- { 139, "\274\343\333\354\342\330\344\343\335\332\346\330\357" },
- { 140, "\267\322\343\332\336\322\336\325 \343\341\342-\322\336:" },
- { 141, "\263\340\336\334\332. \334\343\327\353\332\330:" },
- { 142, "\262\353\332\333. \322\341\361" },
- { 143, "\275\320\327\322:" },
- { 144, "\301\325\342\354 \322\353\332\333\356\347\325\335\320" },
- { 145, "\301\325\342\354 \335\325 \335\320\341\342\340\336\325\335\320 (%d)" },
- { 146, "\301\325\342\354 \340\320\321\336\342\320\325\342" },
- { 147, "\301\325\342\354 \340\320\321\336\342\320\325\342, \337\320\337\332\320 \337\336\324\332\333\356\347\325\335\320" },
- { 148, "\275\330\332\336\323\324\320" },
- { 149, "\275\325\342" },
- { 150, "\264\320\342\320 \335\325 \327\320\337\330\341\320\335\320" },
- { 151, "\261\325\327 \334\343\327\353\332\330" },
- { 152, "\262\340\325\334\357 \330\323\340\353 \335\325 \327\320\337\330\341\320\335\336" },
- { 153, "\262\340\325\334\357 \335\325 \327\320\337\330\341\320\335\336" },
- { 154, "\275\325 \327\320\324\320\335" },
- { 155, "\261\325\327 \343\322\325\333\330\347\325\335\330\357" },
- { 156, "OK" },
- { 157, "\307\320\341\342\336\342\320 \327\322\343\332\320:" },
- { 158, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MIDI" },
- { 159, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MT-32" },
- { 160, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \320\343\324\330\336" },
- { 161, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\320\344\330\332\330" },
- { 162, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\336\334\332\336\341\342\330" },
- { 163, "\315\334\343\333\357\342\336\340 PC \341\337\330\332\325\340\320" },
- { 164, "\277\320\340\336\333\354:" },
- { 165, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \324\330\340\325\332\342\336\340\330\325\331" },
- { 166, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \344\320\331\333\336\334" },
- { 167, "\277\343\342\354 \335\325 \335\320\331\324\325\335" },
- { 168, "\277\343\342\330" },
- { 169, "\277\320\343\327\320" },
- { 170, "\262\353\321\325\340\330\342\325 \330\323\340\343:" },
- { 171, "\277\333\320\342\344\336\340\334\320, \324\333\357 \332\336\342\336\340\336\331 \330\323\340\320 \321\353\333\320 \330\327\335\320\347\320\333\354\335\336 \340\320\327\340\320\321\336\342\320\335\320" },
- { 172, "\277\333\320\342\344\336\340\334\320:" },
- { 173, "\262\340\325\334\357 \330\323\340\353: " },
- { 174, "\277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325" },
- { 175, "\277\343\342\354 \332 \337\333\320\323\330\335\320\334:" },
- { 176, "\267\322\343\332\336\322\336\325 \343\341\342-\322\336:" },
- { 177, "\275\320\326\334\330\342\325 \332\333\320\322\330\350\343 \324\333\357 \335\320\327\335\320\347\325\335\330\357" },
- { 178, "\262\353\345\336\324" },
- { 179, "\262\353\345\336\324 \330\327 ScummVM" },
- { 180, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \347\342\325\335\330\357" },
- { 181, "\276\350\330\321\332\320 \347\342\325\335\330\357" },
- { 182, "\277\325\340\325\335\320\327\335\320\347\330\342\354 \332\333\320\322\330\350\330" },
- { 183, "\303\324\320\333\330\342\354 \330\323\340\343 \330\327 \341\337\330\341\332\320. \275\325 \343\324\320\333\357\325\342 \330\323\340\343 \341 \326\325\341\342\332\336\323\336 \324\330\341\332\320" },
- { 184, "\300\325\326\330\334 \340\320\341\342\340\320:" },
- { 185, "\262\337\340\320\322\336" },
- { 186, "\277\340\320\322\353\331 \351\325\333\347\336\332" },
- { 187, "\277\340\320\322\353\331 \351\325\333\347\336\332" },
- { 188, "\277\336\322\325\340\335\343\342\354" },
- { 189, "\263\340\336\334\332. SFX:" },
- { 190, "SMB" },
- { 191, "\267\320\337\330\341\320\342\354" },
- { 192, "\277\343\342\354 \341\336\345\340: " },
- { 193, "\301\336\345\340\320\335\325\335\330\357 \330\323\340:" },
- { 194, "\301\336\345\340\320\335\330\342\354 \330\323\340\343: " },
- { 195, "\277\336\330\341\332 \327\320\332\336\335\347\325\335!" },
- { 196, "\277\340\336\341\334\336\342\340\325\335\336 %d \324\330\340\325\332\342\336\340\330\331 ..." },
- { 197, "\263\333\320\322\335\336\325 \334\325\335\356 ScummVM" },
- { 198, "ScummVM \335\325 \341\334\336\323 \335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\320 \322\353\321\340\320\335\335\336\331 \330\323\340\353!" },
- { 199, "ScummVM \335\325 \334\336\326\325\342 \335\320\331\342\330 \330\323\340\343 \322 \343\332\320\327\320\335\335\336\331 \324\330\340\325\332\342\336\340\330\330!" },
- { 200, "ScummVM \335\325 \334\336\326\325\342 \336\342\332\340\353\342\354 \343\332\320\327\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356!" },
- { 201, "\277\336\330\341\332 \322 \341\337\330\341\332\325 \330\323\340" },
- { 202, "\277\336\330\341\332:" },
- { 203, "\262\353\321\325\340\330\342\325 SoundFont" },
- { 204, "\262\353\321\325\340\330\342\325 \342\325\334\343" },
- { 205, "\262\353\321\325\340\330\342\325 \324\336\337\336\333\335\330\342\325\333\354\335\343\356 \324\330\340\325\332\342\336\340\330\356 \330\323\340\353" },
- { 206, "\262\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325 \330 \332\333\330\332\335\330\342\325 '\275\320\327\335\320\347\330\342\354'" },
- { 207, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \342\325\334 GUI" },
- { 208, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \324\336\337\336\333\335\330\342\325\333\354\335\353\334\330 \344\320\331\333\320\334\330" },
- { 209, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \337\333\320\323\330\335\320\334\330" },
- { 210, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" },
- { 211, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" },
- { 212, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \344\320\331\333\320\334\330 \330\323\340\353" },
- { 213, "\307\343\322\341\342\322\330\342\325\333\354\335\336\341\342\354" },
- { 214, "\301\325\340\322\325\340:" },
- { 215, "\301\325\342\325\322\320\357 \337\320\337\332\320:" },
- { 216, "\272\336\340\336\342\332\330\331 \330\324\325\335\342\330\344\330\332\320\342\336\340, \330\341\337\336\333\354\327\343\325\334\353\331 \324\333\357 \330\334\325\335 \341\336\345\340\320\335\325\335\330\331 \330\323\340 \330 \324\333\357 \327\320\337\343\341\332\320 \330\327 \332\336\334\320\335\324\335\336\331 \341\342\340\336\332\330" },
- { 217, "\277\336\332\320\327\320\342\354 \332\333\320\322\330\320\342\343\340\343" },
- { 218, "\277\336\332\320\327\353\322\320\342\354 \332\343\340\341\336\340 \334\353\350\330" },
- { 219, "\277\336\332\320\327\353\322\320\342\354 \341\343\321\342\330\342\340\353 \330 \322\336\341\337\340\336\330\327\322\336\324\330\342\354 \340\325\347\354" },
- { 220, "\277\336\332\320\327\320\342\354/\303\321\340\320\342\354 \332\343\340\341\336\340" },
- { 221, "\277\340\336\337\343\341\342\330\342\354" },
- { 222, "\277\340\336\337\343\341\342\330\342\354 \341\342\340\336\332\343" },
- { 223, "\277\340\336\337\343\341\342\330\342\354 \342\325\332\341\342" },
- { 224, "\277\340\330\332\340\325\337\330\342\354 \332 \323\340\320\335\330\346\320\334" },
- { 225, "\277\340\336\323\340\320\334\334\335\336\325 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\325 (\345\336\340\336\350\325\325 \332\320\347\325\341\342\322\336, \335\336 \334\325\324\333\325\335\335\325\325)" },
- { 226, "\267\322\343\332 \322\332\333/\322\353\332\333" },
- { 227, "SoundFont\353 \337\336\324\324\325\340\324\326\330\322\320\356\342\341\357 \335\325\332\336\342\336\340\353\334\330 \327\322\343\332\336\322\353\334\330 \332\320\340\342\320\334\330, Fluidsynth \330 Timidity" },
- { 228, "SoundFont:" },
- { 229, "\276\327\322" },
- { 230, "\301\337\325\346\330\320\333\354\335\353\325 \340\325\326\330\334\353 \340\325\335\324\325\340\330\335\323\320, \337\336\324\324\325\340\326\330\322\320\325\334\353\325 \335\325\332\336\342\336\340\353\334\330 \330\323\340\320\334\330" },
- { 231, "\263\340\336\334\332\336\341\342\354 \341\337\325\346\330\320\333\354\335\353\345 \327\322\343\332\336\322\353\345 \355\344\344\325\332\342\336\322" },
- { 232, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \324\333\357 MIDI" },
- { 233, "\303\332\320\327\353\322\320\325\342 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \337\336 \343\334\336\333\347\320\335\330\357 \324\333\357 \322\353\322\336\324\320 \335\320 Roland MT-32/LAPC1/CM32l/CM64" },
- { 234, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" },
- { 235, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345, \330\341\337\336\333\354\327\343\325\334\353\345 \322\341\325\334\330 \330\323\340\320\334\330, \333\330\321\336 ScummVM" },
- { 236, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345 \324\333\357 \330\323\340\353" },
- { 237, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" },
- { 238, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \341\336\345\340\320\335\325\335\330\357\334 \330\323\340\353" },
- { 239, "\276\327\322\343\347\332\320" },
- { 240, "\263\340\336\334\332. \336\327\322\343\347\332\330:" },
- { 241, "\301\342\320\335\324\320\340\342\335\353\331 \340\320\341\342\325\340\330\327\320\342\336\340 (16bpp)" },
- { 242, "\267\320\337\343\341\342\330\342\354 \322\353\321\340\320\335\335\343\356 \330\323\340\343" },
- { 243, "\301\336\341\342\336\357\335\330\325:" },
- { 244, "\301\343\321" },
- { 245, "\301\332\336\340\336\341\342\354 \342\330\342\340\336\322:" },
- { 246, "\301\343\321\342\330\342\340\353" },
- { 247, "\301\334\325\335\330\342\354 \323\325\340\336\357" },
- { 248, "\302\320\337 \324\333\357 \333\325\322\336\323\336 \351\325\333\347\332\320, \324\322\336\331\335\336\331 \342\320\337 \324\333\357 \337\340\320\322\336\323\336 \351\325\333\347\332\320" },
- { 249, "\302\325\332\341\342 \330 \336\327\322\343\347\332\320:" },
- { 250, "\275\325 \334\336\323\343 \337\330\341\320\342\354 \322 \322\353\321\340\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356. \277\336\326\320\333\343\331\341\342\320, \343\332\320\326\330\342\325 \324\340\343\323\343\356." },
- { 251, "\263\324\325 \342\325\334\353:" },
- { 252, "\302\325\334\320:" },
- { 253, "\315\342\336\342 ID \330\323\340\353 \343\326\325 \330\341\337\336\333\354\327\343\325\342\341\357. \277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\340\343\323\336\331." },
- { 254, "\315\342\320 \330\323\340\320 \335\325 \337\336\324\324\325\340\326\330\322\320\325\342 \327\320\323\340\343\327\332\343 \341\336\345\340\320\335\325\335\330\331 \347\325\340\325\327 \323\333\320\322\335\336\325 \334\325\335\356." },
- { 255, "\262\340\325\334\357: " },
- { 256, "\262\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 \332 \341\325\342\330 \330\341\342\325\332\333\336" },
- { 257, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 X" },
- { 258, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 Y" },
- { 259, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\353\332\333\356\347\325\335." },
- { 260, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\332\333\356\347\325\335." },
- { 261, "\275\320\341\342\336\357\351\330\331 Roland MT-32 (\327\320\337\340\325\342\330\342\354 \355\334\343\333\357\346\330\356 GM)" },
- { 262, "\262\353\332\333\356\347\320\325\342 \334\320\337\337\330\335\323 General MIDI \324\333\357 \330\323\340 \341 \327\322\343\332\336\322\336\331 \324\336\340\336\326\332\336\331 \324\333\357 Roland MT-32" },
- { 263, "\275\325\330\327\322\325\341\342\335\336" },
- { 264, "\275\325\330\327\322\325\341\342\335\320\357 \336\350\330\321\332\320" },
- { 265, "\276\342\332\333\356\347\330\342\354 DVD" },
- { 266, "\276\342\332\333\356\347\342\354 SMB" },
- { 267, "\261\325\327 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\357 (\335\343\326\335\336 \321\343\324\325\342 \337\340\336\332\340\343\347\330\322\320\342\354 \322\333\325\322\336 \330 \322\337\340\320\322\336)" },
- { 268, "\275\325\337\336\324\324\325\340\326\330\322\320\325\334\353\331 \340\325\326\330\334 \346\322\325\342\320" },
- { 269, "\301\336\345\340\320\335\325\335\330\325 \321\325\327 \330\334\325\335\330" },
- { 270, "\262\322\325\340\345" },
- { 271, "\270\341\337\336\333\354\327\336\322\320\342\354 \330 MIDI \330 AdLib \324\333\357 \323\325\335\325\340\320\346\330\330 \327\322\343\332\320" },
- { 272, "\270\341\337\336\333\354\327\336\322\320\342\354 \343\337\340\320\322\333\325\335\330\325 \332\343\340\341\336\340\336\334 \332\320\332 \335\320 \342\340\325\332\337\320\324\325 \333\325\337\342\336\337\336\322" },
- { 273, "\277\336\333\354\327\336\322\320\342\325\333\354:" },
- { 274, "\270\341\337\336\333\354\327\343\356 \324\340\320\331\322\325\340 SDL " },
- { 275, "\262\325\340\342\330\332\320\333\354\335\353\331 underscan:" },
- { 276, "\262\330\324\325\336" },
- { 277, "\262\330\340\342\343\320\333\354\335\320\357 \332\333\320\322\330\320\342\343\340\320" },
- { 278, "\263\340\336\334\332\336\341\342\354" },
- { 279, "Windows MIDI" },
- { 280, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \327\320\337\330\341\330" },
- { 281, "\276\350\330\321\332\320 \327\320\337\330\341\330 \324\320\335\335\353\345" },
- { 282, "\264\320" },
- { 283, "\262\353 \324\336\333\326\335\353 \337\325\340\325\327\320\337\343\341\342\330\342\354 ScummVM \347\342\336\321\353 \337\340\330\334\325\335\330\342\354 \330\327\334\325\335\325\335\330\357." },
- { 284, "\267\336\335\320" },
- { 285, "\303\334\325\335\354\350. \334\320\341\350\342\320\321" },
- { 286, "\303\322\325\333. \334\320\341\350\342\320\321" },
- { 287, "\332\320\326\324\353\325 10 \334\330\335\343\342" },
- { 288, "\332\320\326\324\353\325 15 \334\330\335\343\342" },
- { 289, "\332\320\326\324\353\325 30 \334\330\335\343\342" },
- { 290, "\332\320\326\324\353\325 5 \334\330\335\343\342" },
- { 291, "\276 \337\340\336~\323~\340\320\334\334\325" },
- { 292, "~\264~\336\321. \330\323\340\343..." },
- { 293, "\276~\342~\334\325\335\320" },
- { 294, "~\267~\320\332\340\353\342\354" },
- { 295, "\276~\337~\346\330\330 \330\323\340\353..." },
- { 296, "~\277~\336\334\336\351\354" },
- { 297, "\303\337\340\320\322\333\325\335\330\325 \321\336\357\334\330 \322 Indy" },
- { 298, "~\272~\333\320\322\330\350\330" },
- { 299, "\273\325\322\336\340\343\332\330\331 \340\325\326\330\334" },
- { 300, "~\267~\320\323\340\343\327\330\342\354" },
- { 301, "~\267~\320\323\340\343\327\330\342\354..." },
- { 302, "~\301~\333\325\324" },
- { 303, "~O~K" },
- { 304, "~\276~\337\346\330\330" },
- { 305, "~\276~\337\346\330\330..." },
- { 306, "~\277~\340\325\324" },
- { 307, "~\262~\353\345\336\324" },
- { 308, "~\303~\324\320\333\330\342\354 \330\323\340\343" },
- { 309, "\277\340\336\324\336\333~\326~\330\342\354" },
- { 310, "~\262~\353\331\342\330 \322 \323\333\320\322\335\336\325 \334\325\335\356" },
- { 311, "~\267~\320\337\330\341\320\342\354" },
- { 312, "\277~\343~\341\332" },
- { 313, "\277\325\340\325\345\336\324\353 \320\332\342\330\322\330\340\336\322\320\335\353" },
- { 314, "\315\344\344\325\332\342\353 \322\336\324\353 \322\332\333\356\347\325\335\353" },
- { 315, "\300\325\326\330\334 \321\353\341\342\340\336\323\336 \337\325\340\325\345\336\324\320 \320\332\342\330\322\330\340\336\322\320\335" },
- { -1, NULL }
-};
-
-static const PoMessageEntry _translation_it_IT[] = {
- { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff <matteo.maff at gmail dot com>\nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" },
- { 1, " Sei sicuro di voler uscire? " },
- { 2, " (Attivo)" },
- { 3, " (Gioco)" },
- { 4, " (Globale)" },
- { 5, "(build creata il %s)" },
- { 6, ", errore nel montare la condivisione" },
- { 7, ", condivisione non montata" },
- { 8, "... progresso ..." },
- { 9, "11kHz" },
- { 10, "22 kHz" },
- { 11, "44 kHz" },
- { 12, "48 kHz" },
- { 13, "8 kHz" },
- { 14, "<predefinito>" },
- { 15, "Informazioni su ScummVM" },
- { 16, "Emulatore AdLib" },
- { 17, "Emulatore AdLib:" },
- { 18, "AdLib \350 utilizzato per la musica in molti giochi" },
- { 19, "Aggiungi gioco..." },
- { 20, "Renderer con antialiasing (16bpp)" },
- { 21, "Correzione proporzioni" },
- { 22, "Tasto associato: %s" },
- { 23, "Tasto associato: nessuno" },
- { 24, "Audio" },
- { 25, "Autosalva:" },
- { 26, "Motori disponibili:" },
- { 27, "~I~nfo..." },
- { 28, "Associa tasti" },
- { 29, "Entrambi" },
- { 30, "Luminosit\340:" },
- { 31, "Annulla" },
- { 32, "Impossibile creare il file" },
- { 33, "Modifica le opzioni di gioco" },
- { 34, "Modifica le opzioni globali di ScummVM" },
- { 35, "Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland che \350 connesso al tuo computer" },
- { 36, "Scegli" },
- { 37, "Scegli un'azione da mappare" },
- { 38, "Cancella" },
- { 39, "Chiudi" },
- { 40, "Corregge le proporzioni dei giochi 320x200" },
- { 41, "Impossibile trovare un motore in grado di eseguire il gioco selezionato" },
- { 42, "Modalit\340 video attuale:" },
- { 43, "Cursore gi\371" },
- { 44, "Cursore a sinistra" },
- { 45, "Cursore a destra" },
- { 46, "Cursore su" },
- { 47, "Emulatore OPL DOSBox" },
- { 48, "DVD" },
- { 49, "DVD montato con successo" },
- { 50, "DVD non montato" },
- { 51, "Data: " },
- { 52, "Debugger" },
- { 53, "Predefinito" },
- { 54, "Elimina" },
- { 55, "Disattiva spegnimento in chiusura" },
- { 56, "Grafica disattivata" },
- { 57, "Rilevati %d nuovi giochi..." },
- { 58, "Rilevati %d nuovi giochi." },
- { 59, "Visualizza " },
- { 60, "Mostra tastiera" },
- { 61, "Sei sicuro di voler eliminare questo salvataggio?" },
- { 62, "Sei sicuro di voler rimuovere questa configurazione di gioco?" },
- { 63, "Vuoi davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere un numero enorme di giochi." },
- { 64, "Vuoi caricare o salvare il gioco?" },
- { 65, "Vuoi eseguire una scansione automatica?" },
- { 66, "Sei sicuro di voler uscire?" },
- { 67, "Double-strike" },
- { 68, "Gi\371" },
- { 69, "Attiva la modalit\340 Roland GS" },
- { 70, "Il motore non supporta il livello di debug '%s'" },
- { 71, "Inglese" },
- { 72, "Errore nell'esecuzione del gioco:" },
- { 73, "Errore nel montare il DVD" },
- { 74, "Percorso extra:" },
- { 75, "Emulatore FM Towns" },
- { 76, "Modalit\340 veloce" },
- { 77, "Funzionalit\340 compilate in:" },
- { 78, "Osservazione libera" },
- { 79, "Titolo completo del gioco" },
- { 80, "Modalit\340 a schermo intero" },
- { 81, "Accelerazione pad GC:" },
- { 82, "Sensibilit\340 pad GC:" },
- { 83, "Grafica" },
- { 84, "Dispositivo GM:" },
- { 85, "Lingua GUI:" },
- { 86, "Renderer GUI:" },
- { 87, "Gioco" },
- { 88, "Dati di gioco non trovati" },
- { 89, "ID di gioco non supportato" },
- { 90, "Percorso gioco:" },
- { 91, "Menu globale" },
- { 92, "Vai alla cartella superiore" },
- { 93, "Cartella superiore" },
- { 94, "Grafica" },
- { 95, "Modalit\340:" },
- { 96, "Ridimensionamento hardware (veloce, ma di bassa qualit\340)" },
- { 97, "Hercules ambra" },
- { 98, "Hercules verde" },
- { 99, "Nascondi la barra degli strumenti" },
- { 100, "Audio ad alta qualit\340 (pi\371 lento) (riavviare)" },
- { 101, "Valori pi\371 alti restituiscono un suono di maggior qualit\340, ma potrebbero non essere supportati dalla tua scheda audio" },
- { 102, "Tieni premuto Shift per l'aggiunta in massa" },
- { 103, "Underscan orizzontale:" },
- { 104, "Emulatore IBM PCjr" },
- { 105, "ID:" },
- { 106, "Avvia rete" },
- { 107, "Schermo in primo piano:" },
- { 108, "Avvio in corso dell'emulatore MT-32" },
- { 109, "Avvio rete in corso" },
- { 110, "Input" },
- { 111, "Percorso non valido" },
- { 112, "Programmatore tasti" },
- { 113, "Tastiera" },
- { 114, "Mappa tasti:" },
- { 115, "Tasti" },
- { 116, "Lingua dell'interfaccia grafica di ScummVM" },
- { 117, "Lingua del gioco. Un gioco inglese non potr\340 risultare tradotto in italiano" },
- { 118, "Lingua:" },
- { 119, "Sinistra" },
- { 120, "Clic sinistro" },
- { 121, "Carica" },
- { 122, "Carica gioco:" },
- { 123, "Carica un salvataggio del gioco selezionato" },
- { 124, "Emulatore OPL MAME" },
- { 125, "MIDI" },
- { 126, "Guadagno MIDI:" },
- { 128, "Disposit. MT32:" },
- { 129, "Emulatore MT-32" },
- { 130, "Schermo principale:" },
- { 131, "Mappa" },
- { 132, "Agg. in massa..." },
- { 133, "Menu" },
- { 134, "Varie" },
- { 135, "Modalit\340 mista AdLib/MIDI" },
- { 136, "Monta DVD" },
- { 137, "Monta SMB" },
- { 138, "Clic del mouse" },
- { 139, "Multifunzione" },
- { 140, "Dispositivo GM:" },
- { 141, "Volume musica:" },
- { 142, "Disattiva audio" },
- { 143, "Nome:" },
- { 144, "Rete disattivata" },
- { 145, "Rete non avviata (%d)" },
- { 146, "Rete attiva" },
- { 147, "Rete attiva, condivisione montata" },
- { 148, "Mai" },
- { 149, "No" },
- { 150, "Nessuna data salvata" },
- { 151, "Nessuna musica" },
- { 152, "Nessun tempo salvato" },
- { 153, "Nessun orario salvato" },
- { 154, "Nessuno" },
- { 155, "Normale (nessun ridimensionamento)" },
- { 156, "OK" },
- { 157, "Frequenza:" },
- { 158, "Ignora le impostazioni MIDI globali" },
- { 159, "Ignora le impostazioni MIDI globali" },
- { 160, "Ignora le impostazioni audio globali" },
- { 161, "Ignora le impostazioni grafiche globali" },
- { 162, "Ignora le impostazioni globali di volume" },
- { 163, "Emulatore PC Speaker" },
- { 164, "Password:" },
- { 165, "Il percorso non \350 una cartella" },
- { 166, "Il percorso non \350 un file" },
- { 167, "Il percorso non esiste" },
- { 168, "Percorsi" },
- { 169, "Pausa" },
- { 170, "Scegli il gioco:" },
- { 171, "La piattaforma per la quale il gioco \350 stato concepito" },
- { 172, "Piattaforma:" },
- { 173, "Tempo di gioco: " },
- { 174, "Seleziona un'azione" },
- { 175, "Percorso plugin:" },
- { 176, "Disp. preferito:" },
- { 177, "Premi il tasto da associare" },
- { 178, "Esci" },
- { 179, "Chiudi ScummVM" },
- { 180, "Autorizzazione di lettura negata" },
- { 181, "Lettura fallita" },
- { 182, "Riprogramma tasti" },
- { 183, "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" },
- { 184, "Resa grafica:" },
- { 185, "Destra" },
- { 186, "Clic destro" },
- { 187, "Clic destro" },
- { 188, "Rotazione" },
- { 189, "Volume effetti:" },
- { 190, "SMB" },
- { 191, "Salva" },
- { 192, "Salvataggi:" },
- { 193, "Salvataggi:" },
- { 194, "Salva gioco:" },
- { 195, "Scansione completa!" },
- { 196, "%d cartelle analizzate..." },
- { 197, "Menu principale di ScummVM" },
- { 198, "ScummVM non ha potuto trovare un motore in grado di eseguire il gioco selezionato!" },
- { 199, "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" },
- { 200, "ScummVM non ha potuto aprire la cartella specificata!" },
- { 201, "Cerca nella lista dei giochi" },
- { 202, "Cerca:" },
- { 203, "Seleziona SoundFont" },
- { 204, "Seleziona un tema" },
- { 205, "Seleziona la cartella di gioco aggiuntiva" },
- { 206, "Seleziona un'azione e clicca 'Mappa'" },
- { 207, "Seleziona la cartella dei temi dell'interfaccia" },
- { 208, "Seleziona la cartella dei file aggiuntivi" },
- { 209, "Seleziona la cartella dei plugin" },
- { 210, "Seleziona la cartella dei salvataggi" },
- { 211, "Seleziona la cartella per i salvataggi" },
- { 212, "Seleziona la cartella contenente i file di gioco" },
- { 213, "Sensibilit\340" },
- { 214, "Server:" },
- { 215, "Condivisione:" },
- { 216, "Breve identificatore di gioco utilizzato per il riferimento a salvataggi e per l'esecuzione del gioco dalla riga di comando" },
- { 217, "Mostra tastiera" },
- { 218, "Mostra cursore del mouse" },
- { 219, "Mostra i sottotitoli e attiva le voci" },
- { 220, "Mostra/nascondi cursore" },
- { 221, "Salta" },
- { 222, "Salta battuta" },
- { 223, "Salta testo" },
- { 224, "Aggancia ai bordi" },
- { 225, "Ridimensionamento software (di buona qualit\340, ma pi\371 lento)" },
- { 226, "Suono on/off" },
- { 227, "SoundFont \350 supportato da alcune schede audio, Fluidsynth e Timidity" },
- { 228, "SoundFont:" },
- { 229, "Voci" },
- { 230, "Modalit\340 di resa grafica speciali supportate da alcuni giochi" },
- { 231, "Volume degli effetti sonori" },
- { 232, "Specifica il dispositivo audio predefinito per l'output General MIDI" },
- { 233, "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/CM32l/CM64" },
- { 234, "Specifica il dispositivo di output audio o l'emulatore della scheda audio" },
- { 235, "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" },
- { 236, "Specifica il percorso di ulteriori dati usati dal gioco" },
- { 237, "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" },
- { 238, "Specifica dove archiviare i salvataggi" },
- { 239, "Voci" },
- { 240, "Volume voci:" },
- { 241, "Renderer standard (16bpp)" },
- { 242, "Esegue il gioco selezionato" },
- { 243, "Stato:" },
- { 244, "Sub" },
- { 245, "Velocit\340 testo:" },
- { 246, "Sottotitoli" },
- { 247, "Cambia personaggio" },
- { 248, "Un tocco per il clic sinistro, doppio tocco per il clic destro" },
- { 249, "Testo e voci:" },
- { 250, "La cartella scelta \350 in sola lettura. Si prega di sceglierne un'altra." },
- { 251, "Percorso tema:" },
- { 252, "Tema:" },
- { 253, "Questo ID di gioco \350 gi\340 in uso. Si prega di sceglierne un'altro." },
- { 254, "Questo gioco non supporta il caricamento di salvataggi dalla schermata di avvio." },
- { 255, "Ora: " },
- { 256, "Attesa per l'avvio della rete" },
- { 257, "Compensa X del tocco" },
- { 258, "Compensa Y del tocco" },
- { 259, "Modalit\340 touchpad disattivata." },
- { 260, "Modalit\340 touchpad attivata." },
- { 261, "Roland MT-32 effettivo (disattiva emulazione GM)" },
- { 262, "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland MT-32" },
- { 263, "Sconosciuto" },
- { 264, "Errore sconosciuto" },
- { 265, "Smonta DVD" },
- { 266, "Smonta SMB" },
- { 267, "Non ridimensionato (devi scorrere a sinistra e a destra)" },
- { 268, "Modalit\340 colore non supportata" },
- { 269, "Salvataggio senza titolo" },
- { 270, "Su" },
- { 271, "Utilizza generazione di suono sia MIDI che AdLib" },
- { 272, "Utilizza il controllo del cursore stile trackpad del portatile" },
- { 273, "Nome utente:" },
- { 274, "Utilizzo del driver SDL " },
- { 275, "Underscan verticale:" },
- { 276, "Video" },
- { 277, "Tastiera virtuale" },
- { 278, "Volume" },
- { 279, "MIDI Windows" },
- { 280, "Autorizzazione di scrittura negata" },
- { 281, "Scrittura dati fallita" },
- { 282, "S\354" },
- { 283, "Devi riavviare ScummVM affinch\351 le modifiche abbiano effetto." },
- { 284, "Zona" },
- { 285, "Zoom indietro" },
- { 286, "Zoom avanti" },
- { 287, "ogni 10 minuti" },
- { 288, "ogni 15 minuti" },
- { 289, "ogni 30 minuti" },
- { 290, "ogni 5 minuti" },
- { 291, "~I~nfo" },
- { 292, "~A~ggiungi gioco..." },
- { 293, "~A~nnulla" },
- { 294, "~C~hiudi" },
- { 295, "~M~odifica gioco..." },
- { 296, "~A~iuto" },
- { 297, "Controlli combattimento di ~I~ndy" },
- { 298, "~T~asti" },
- { 299, "~M~odalit\340 mancini" },
- { 300, "~C~arica" },
- { 301, "~C~arica..." },
- { 302, "~S~uccessivi" },
- { 303, "~O~K" },
- { 304, "~O~pzioni" },
- { 305, "~O~pzioni..." },
- { 306, "~P~recedenti" },
- { 307, "C~h~iudi" },
- { 308, "~R~imuovi gioco" },
- { 309, "~R~ipristina" },
- { 310, "~V~ai a schermata di avvio" },
- { 311, "~S~alva" },
- { 312, "~G~ioca" },
- { 313, "~T~ransizioni attive" },
- { 314, "~E~ffetto acqua attivo" },
- { 315, "Modalit\340 ~Z~ip attivata" },
- { -1, NULL }
-};
-
-static const PoMessageEntry _translation_hu_HU[] = {
- { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua <alexbevi@gmail.com>\nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" },
- { 14, "<alap\351rtelmezett>" },
- { 16, "AdLib vezet :" },
- { 17, "AdLib vezet :" },
- { 21, "Aspect adag korrekci\363" },
- { 24, "Hang" },
- { 25, "Automatikus ment\351s:" },
- { 28, "Kulcsok" },
- { 42, "Renderel\351si m\363d:" },
- { 53, "<alap\351rtelmezett>" },
- { 69, "K\351pess\351 Roland GS Mode" },
- { 74, "Extra \332tvonal:" },
- { 76, "Grafikus m\363d:" },
- { 80, "Teljes k\351perny s m\363d:" },
- { 86, "Lek\351pez eszk\366z GUI:" },
- { 90, "Extra \332tvonal:" },
- { 94, "Grafik\341val" },
- { 95, "Grafikus m\363d:" },
- { 115, "Kulcsok" },
- { 124, "AdLib vezet :" },
- { 126, "MIDI nyeres\351g:" },
- { 128, "Zene mennyis\351g:" },
- { 135, "Vegyes AdLib/MIDI m\363d" },
- { 140, "Zene mennyis\351g:" },
- { 141, "Zene mennyis\351g:" },
- { 142, "Muta \326sszes" },
- { 148, "Soha" },
- { 149, "Semmi" },
- { 154, "Semmi" },
- { 156, "Igen" },
- { 157, "Kimeneti teljes\355tm\351ny:" },
- { 168, "\326sv\351nyek" },
- { 169, "\326sv\351nyek" },
- { 184, "Renderel\351si m\363d:" },
- { 189, "SFX mennyis\351ge" },
- { 192, "Extra \332tvonal:" },
- { 214, "Soha" },
- { 239, "Csak a besz\351d" },
- { 240, "Besz\351d mennyis\351g:" },
- { 245, "Felirat sebess\351g:" },
- { 246, "Csak feliratok" },
- { 249, "Sz\366veg \351s besz\351d:" },
- { 252, "T\351ma:" },
- { 255, "T\351ma:" },
- { 261, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" },
- { 274, "Zenei vezet :" },
- { 278, "Volumene" },
- { 284, "Semmi" },
- { 287, "10 percenk\351nt" },
- { 288, "15 percenk\351nt" },
- { 289, "30 percenk\351nt" },
- { 290, "5 percenk\351nt" },
- { 298, "Kulcsok" },
- { 299, "Renderel\351si m\363d:" },
- { 303, "Igen" },
- { -1, NULL }
-};
-
-static const PoMessageEntry _translation_fr_FR[] = {
- { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-30 22:18+0100\nLast-Translator: Thierry Crozat <criezy@scummvm.org>\nLanguage-Team: French <scummvm-devel@lists.sf.net>\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" },
- { 1, "Voulez-vous vraiment quitter?" },
- { 2, "(Actif)" },
- { 3, "(Jeu)" },
- { 4, "(Global)" },
- { 5, "(compil\351 sur %s)" },
- { 6, ", \351chec du montage du disque partag\351" },
- { 7, ", disque partag\351 non mont\351" },
- { 8, "... en cours ..." },
- { 9, "11 kHz" },
- { 10, "22 kHz" },
- { 11, "44 kHz" },
- { 12, "48 kHz" },
- { 13, "8 kHz" },
- { 14, "<defaut>" },
- { 15, "\300 propos de ScummVM" },
- { 16, "\311mulateur AdLib" },
- { 17, "\311mulateur AdLib:" },
- { 18, "AdLib est utilis\351 pour la musique dans de nombreux jeux" },
- { 19, "Ajouter..." },
- { 20, "Anti-cr\351nel\351 (16 bpp)" },
- { 21, "Correction du rapport d'aspect" },
- { 22, "Touche associ\351e: %s" },
- { 23, "Touche associ\351e: aucune" },
- { 24, "Audio" },
- { 25, "Sauvegarde auto:" },
- { 26, "Moteurs disponibles:" },
- { 27, "\300 ~P~ropos..." },
- { 28, "Affecter les touches" },
- { 29, "Les deux" },
- { 30, "Luminosit\351:" },
- { 31, "Annuler" },
- { 32, "Impossible de cr\351er le fichier" },
- { 33, "Change les options du jeu" },
- { 34, "Change les options globales de ScummVM" },
- { 35, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" },
- { 36, "Choisir" },
- { 37, "S\351lectionnez une action \340 affecter" },
- { 38, "Effacer la valeur" },
- { 39, "Fermer" },
- { 40, "Corrige le rapport d'aspect pour les jeu 320x200" },
- { 41, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" },
- { 42, "Mode vid\351o actuel" },
- { 43, "Bas" },
- { 44, "Gauche" },
- { 45, "Droit" },
- { 46, "Haut" },
- { 47, "\311mulateur DOSBox OPL" },
- { 48, "DVD" },
- { 49, "DVD mont\351 avec succ\350s" },
- { 50, "DVD non mont\351" },
- { 51, "Date:" },
- { 52, "Debugger" },
- { 53, "D\351faut" },
- { 54, "Supprimer" },
- { 55, "D\351sactiv\351 l'extinction" },
- { 56, "GFX d\351sactiv\351" },
- { 57, "%d nouveaux jeux trouv\351s ..." },
- { 58, "%d nouveaux jeux trouv\351s." },
- { 59, "Affichage" },
- { 60, "Afficher le clavier" },
- { 61, "Voulez-vous vraiment supprimer cette sauvegarde?" },
- { 62, "Voulez-vous vraiment supprimer ce jeu?" },
- { 63, "Voulez-vous vraiment lancer la d\351tection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." },
- { 64, "Voulez-vous charger ou sauver le jeu?" },
- { 65, "Voulez-vous ex\351cuter une recherche automatique?" },
- { 66, "Voulez-vous quitter?" },
- { 67, "Coup double" },
- { 68, "Bas" },
- { 69, "Activer le mode Roland GS" },
- { 70, "Le niveau de debug '%s' n'est pas support\351 par ce moteur de jeu" },
- { 71, "Anglais" },
- { 72, "Erreur lors de l'\351x\351cution du jeu:" },
- { 73, "\311chec du montage du DVD" },
- { 74, "Extra:" },
- { 75, "\311mulateur FM Towns" },
- { 76, "Mode rapide" },
- { 77, "Options incluses:" },
- { 78, "Regarder autour" },
- { 79, "Nom complet du jeu" },
- { 80, "Plein \351cran" },
- { 81, "Acceleration du pad GC:" },
- { 82, "Sensibilit\351 du pad GC:" },
- { 83, "GFX" },
- { 84, "Sortie GM:" },
- { 85, "Langue:" },
- { 86, "Interface:" },
- { 87, "Jeu" },
- { 88, "Fichier de don\351es introuvable" },
- { 89, "ID de jeu non support\351" },
- { 90, "Chemin du Jeu:" },
- { 91, "Menu global" },
- { 92, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" },
- { 93, "Remonter" },
- { 94, "Graphique" },
- { 95, "Mode graphique:" },
- { 96, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" },
- { 97, "Hercules Ambre" },
- { 98, "Hercules Vert" },
- { 99, "Cach\351 la barre d'outils" },
- { 100, "Audio haute qualit\351 (plus lent) (red\351marrer)" },
- { 101, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" },
- { 102, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" },
- { 103, "Underscan horizontal:" },
- { 104, "\311mulateur IBM PCjr" },
- { 105, "ID:" },
- { 106, "Initialiser le r\351seau" },
- { 107, "\311chelle initiale de l'\351cran du haut" },
- { 108, "Initialisation de l'\311mulateur MT-32" },
- { 109, "Initialisation du r\351seau" },
- { 110, "Entr\351e" },
- { 111, "Chemin Invalide" },
- { 112, "Affectation des touches" },
- { 113, "Clavier" },
- { 114, "Affectation des touches:" },
- { 115, "Touches" },
- { 116, "Langue de l'interface graphique de ScummVM" },
- { 117, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." },
- { 118, "Langue:" },
- { 119, "Gauche" },
- { 120, "Clic Gauche" },
- { 121, "Charger" },
- { 122, "Charger le jeu:" },
- { 123, "Charge une sauvegarde pour le jeu s\351lectionn\351" },
- { 124, "\311mulateur MAME OPL" },
- { 125, "MIDI" },
- { 126, "Gain MIDI:" },
- { 127, "MT-32" },
- { 128, "Sortie MT-32:" },
- { 129, "\311mulateur MT-32" },
- { 130, "\311chelle de l'\351cran principal" },
- { 131, "Affecter" },
- { 132, "Ajout Massif..." },
- { 133, "Menu" },
- { 134, "Divers" },
- { 135, "Mode mixe AdLib/MIDI" },
- { 136, "Monter le DVD" },
- { 137, "Monter SMB" },
- { 138, "Clic de souris" },
- { 139, "Fonction Multiple" },
- { 140, "Sortie Audio:" },
- { 141, "Volume Musique:" },
- { 142, "Silence" },
- { 143, "Nom:" },
- { 144, "R\351seau d\351connect\351" },
- { 145, "R\351seau non initialis\351 (%d)" },
- { 146, "R\351seau connect\351" },
- { 147, "R\351seau connect\351, disque partag\351 mont\351" },
- { 148, "Jamais" },
- { 149, "Non" },
- { 150, "Date non sauv\351e" },
- { 151, "Pas de musique" },
- { 152, "Dur\351e de jeu non sauv\351e" },
- { 153, "Heure non sauv\351e" },
- { 154, "Aucun" },
- { 155, "Normal (\351chelle d'origine)" },
- { 156, "OK" },
- { 157, "Fr\351quence:" },
- { 158, "Utiliser des r\351glages MIDI sp\351cifiques \340 ce jeux" },
- { 159, "Utiliser des r\351glages MT-32 sp\351cifiques \340 ce jeux" },
- { 160, "Utiliser des r\351glages audio sp\351cifiques \340 ce jeux" },
- { 161, "Utiliser des r\351glages graphiques sp\351cifiques \340 ce jeux" },
- { 162, "Utiliser des r\351glages de volume sonore sp\351cifiques \340 ce jeux" },
- { 163, "\311mulateur Haut Parleur PC" },
- { 164, "Mot de passe:" },
- { 165, "Chemin n'est pas un r\351pertoire" },
- { 166, "Chemin n'est pas un fichier" },
- { 167, "Chemin inexistant" },
- { 168, "Chemins" },
- { 169, "Mettre en pause" },
- { 170, "Choisissez le jeu:" },
- { 171, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" },
- { 172, "Plateforme:" },
- { 173, "Dur\351e de jeu:" },
- { 174, "Selectionnez une action" },
- { 175, "Plugins:" },
- { 176, "Sortie Pr\351f\351r\351:" },
- { 177, "Appuyez sur la touche \340 associer" },
- { 178, "Quitter" },
- { 179, "Quitter ScummVM" },
- { 180, "V\351roulli\351 en lecture" },
- { 181, "Echec de la lecture" },
- { 182, "Changer l'affectation des touches" },
- { 183, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" },
- { 184, "Mode de rendu:" },
- { 185, "Droite" },
- { 186, "Clic Droit" },
- { 187, "Clic droit" },
- { 188, "Pivoter" },
- { 189, "Volume Bruitage:" },
- { 190, "SMB" },
- { 191, "Sauver" },
- { 192, "Sauvegardes:" },
- { 193, "Sauvegardes:" },
- { 194, "Sauvegarde:" },
- { 195, "Examen termin\351!" },
- { 196, "%d r\351pertoires examin\351s ..." },
- { 197, "Menu Principal ScummVM" },
- { 198, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." },
- { 199, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." },
- { 200, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." },
- { 201, "Recherche dans la liste de jeux" },
- { 202, "Filtre:" },
- { 203, "Choisir une banque de sons" },
- { 204, "S\351lectionnez un Th\350me" },
- { 205, "S\351lectionner un r\351pertoire suppl\351mentaire" },
- { 206, "Selectionez une action et cliquez 'Affecter'" },
- { 207, "S\351lectionner le r\351pertoire des th\350mes d'interface" },
- { 208, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" },
- { 209, "S\351lectionner le r\351pertoire des plugins" },
- { 210, "S\351lectionner le r\351pertoire pour les sauvegardes" },
- { 211, "S\351lectionner le r\351pertoire pour les sauvegardes" },
- { 212, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" },
- { 213, "Sensibilit\351" },
- { 214, "Serveur:" },
- { 215, "Disque partag\351:" },
- { 216, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" },
- { 217, "Afficher le clavier" },
- { 218, "Afficher le curseur de la souris" },
- { 219, "Affiche les sous-titres et joue les dialogues audio" },
- { 220, "Afficher/Cacher le curseur" },
- { 221, "Passer" },
- { 222, "Passer la phrase" },
- { 223, "Sauter le texte" },
- { 224, "Aligner sur les bords" },
- { 225, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" },
- { 226, "Audio marche/arr\352t" },
- { 227, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" },
- { 228, "Banque de sons:" },
- { 229, "Audio" },
- { 230, "Mode sp\351cial de tramage support\351 par certains jeux" },
- { 231, "Volume des effets sp\351ciaux sonores" },
- { 232, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie General MIDI" },
- { 233, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" },
- { 234, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" },
- { 235, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" },
- { 236, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" },
- { 237, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio pr\351f\351r\351" },
- { 238, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" },
- { 239, "Audio" },
- { 240, "Volume Dialogues:" },
- { 241, "Standard (16bpp)" },
- { 242, "D\351marre le jeu s\351lectionn\351" },
- { 243, "Status:" },
- { 244, "Subs" },
- { 245, "Vitesse des ST:" },
- { 246, "Sous-titres" },
- { 247, "Changement de personnage" },
- { 248, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" },
- { 249, "Dialogue:" },
- { 250, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." },
- { 251, "Th\350mes:" },
- { 252, "Th\350me:" },
- { 253, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." },
- { 254, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." },
- { 255, "Heure:" },
- { 256, "D\351passement du d\351lai lors de l'initialisation du r\351seau" },
- { 257, "D\351calage X du toucher" },
- { 258, "D\351callage Y du toucher" },
- { 259, "Mode touchpad d\351sactiv\351" },
- { 260, "Mode touchpad activ\351" },
- { 261, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" },
- { 262, "D\351sactiver la conversion des pistes MT-32 en General MIDI" },
- { 263, "Inconue" },
- { 264, "Erreur inconnue" },
- { 265, "D\351monter le DVD" },
- { 266, "D\351monter SMB" },
- { 267, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" },
- { 268, "Mode de couleurs non support\351" },
- { 269, "Sauvegarde sans nom" },
- { 270, "Haut" },
- { 271, "Utiliser \340 la fois MIDI et AdLib" },
- { 272, "Activer le contr\364le du curseur de type trackpad" },
- { 273, "Nom d'utilisateur:" },
- { 274, "Utilise le pilote SDL" },
- { 275, "Underscan vertical:" },
- { 276, "Vid\351o" },
- { 277, "Clavier virtuel" },
- { 278, "Volume" },
- { 279, "MIDI Windows" },
- { 280, "Verrouill\351 en \351criture" },
- { 281, "Echec de l'\351criture des donn\351es" },
- { 282, "Oui" },
- { 283, "Vous devez relancer ScummVM pour que le changement soit pris en compte." },
- { 284, "Zone" },
- { 285, "Zoomer" },
- { 286, "D\351zoomer" },
- { 287, "Toutes les 10 mins" },
- { 288, "Toutes les 15 mins" },
- { 289, "Toutes les 30 mins" },
- { 290, "Toutes les 5 mins" },
- { 291, "\300 ~P~ropos" },
- { 292, "~A~jouter..." },
- { 293, "~A~nnuler" },
- { 294, "~F~ermer" },
- { 295, "~E~diter..." },
- { 296, "~A~ide" },
- { 297, "Contr\364le des combats d'~I~ndy" },
- { 298, "~T~ouches" },
- { 299, "Mode ~G~aucher" },
- { 300, "~C~harger" },
- { 301, "~C~harger" },
- { 302, "~S~uivant" },
- { 303, "~O~K" },
- { 304, "~O~ptions" },
- { 305, "~O~ptions..." },
- { 306, "~P~r\351c\351dent" },
- { 307, "~Q~uitter" },
- { 308, "~S~upprimer" },
- { 309, "~R~eprendre" },
- { 310, "Retour au ~L~anceur" },
- { 311, "~S~auver" },
- { 312, "~D~\351marrer" },
- { 313, "T~r~ansitions activ\351" },
- { 314, "~E~ffets de l'Eau Activ\351s" },
- { 315, "Mode ~Z~ip Activ\351" },
- { -1, NULL }
-};
-
-static const PoMessageEntry _translation_uk_UA[] = {
- { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-30 22:19+0100\nLast-Translator: Lubomyr Lisen\nLanguage-Team: Ukrainian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: Ukrainian\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" },
- { 1, " \262\330 \343\337\325\322\335\325\335\366, \351\336 \345\336\347\325\342\325 \322\330\331\342\330? " },
- { 2, " (\260\332\342\330\322\335\320)" },
- { 3, " (\246\323\340\330)" },
- { 4, " (\263\333\336\321\320\333\354\335\320)" },
- { 5, "(\327\366\321\340\320\335\330\331 %s)" },
- { 6, ", \337\336\334\330\333\332\320 \337\366\324 \347\320\341 \337\366\324\332\333\356\347\325\335\335\357 \337\320\337\332\330" },
- { 7, ", \337\320\337\332\320 \335\325 \337\366\324\332\333\356\347\325\335\320" },
- { 8, "... \337\336\350\343\332 ..." },
- { 9, "11 \332\263\346" },
- { 10, "22 \332\263\346" },
- { 11, "44 \332\263\346" },
- { 12, "48 \332\263\346" },
- { 13, "8 \332\263\346" },
- { 14, "<\327\320 \343\334\336\322\347\320\335\335\357\334>" },
- { 15, "\277\340\336 ScummVM" },
- { 16, "\265\334\343\333\357\342\336\340 AdLib" },
- { 17, "\265\334\343\333\357\342\336\340 AdLib:" },
- { 18, "\267\322\343\332\336\322\320 \332\320\340\342\320 AdLib \322\330\332\336\340\330\341\342\336\322\343\364\342\354\341\357 \321\320\323\320\342\354\334\320 \366\323\340\320\334\330" },
- { 19, "\264\336\324. \323\340\343..." },
- { 20, "\300\320\341\342\325\340\330\327\320\342\336\340 \327\366 \327\323\333\320\324\326\343\322\320\335\335\357\334 (16bpp)" },
- { 21, "\272\336\340\325\332\346\366\357 \341\337\366\322\322\366\324\335\336\350\325\335\335\357 \341\342\336\340\366\335" },
- { 22, "\277\340\330\327\335\320\347\325\335\320 \332\333\320\322\366\350\320 : %s" },
- { 23, "\277\340\330\327\335\320\347\325\335\320 \332\333\320\322\366\350\320 : \335\325\334\320\364" },
- { 24, "\260\343\324\366\336" },
- { 25, "\260\322\342\336\327\321\325\340\325\326\325\335\335\357:" },
- { 26, "\264\336\341\342\343\337\335\366 \324\322\330\326\332\330:" },
- { 27, "\277\340\336 \337~\340~\336\323\340\320\334\343..." },
- { 28, "\337\340\330\327\335\320\347\330\342\330 \332\333\320\322\366\350\366" },
- { 29, "\262\341\325" },
- { 30, "\317\341\332\340\320\322\366\341\342\354:" },
- { 31, "\262\366\324\334\366\335\320" },
- { 32, "\275\325 \334\336\326\343 \341\342\322\336\340\330\342\330 \344\320\331\333" },
- { 33, "\267\334\366\335\330\342\330 \336\337\346\366\367 \323\340\330" },
- { 34, "\267\334\366\335\330\342\330 \323\333\336\321\320\333\354\335\366 \336\337\346\366\367 ScummVM" },
- { 35, "\262\366\324\334\366\342\354\342\325, \357\332\351\336 \343 \322\320\341 \337\366\324\332\333\356\347\325\335\330\331 Roland-\341\343\334\366\341\335\330\331 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \366 \322\330 \345\336\347\325\342\325 \331\336\323\336 \322\330\332\336\340\330\341\342\320\342\330" },
- { 36, "\262\330\321\340\320\342\330" },
- { 37, "\262\330\321\325\340\366\342\354 \324\366\356 \324\333\357 \337\340\330\327\335\320\347\325\335\335\357" },
- { 38, "\276\347\330\341\342\330\342\330 \327\335\320\347\325\335\335\357" },
- { 39, "\267\320\332\340\330\342\330" },
- { 40, "\272\336\340\330\323\343\322\320\342\330 \341\337\366\322\322\366\324\335\336\350\325\335\335\357 \341\342\336\340\366\335 \324\333\357 \366\323\336\340 \327 \323\340\320\344\366\332\336\356 320x200" },
- { 41, "\275\325 \334\336\326\343 \327\335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\343 \322\330\321\340\320\335\336\367 \323\340\330" },
- { 42, "\302\325\332\343\347\330\331 \322\366\324\325\336\340\325\326\330\334:" },
- { 43, "\272\343\340\341\336\340 \322\335\330\327" },
- { 44, "\272\343\340\341\336\340 \322\333\366\322\336" },
- { 45, "\272\343\340\341\336\340 \322\337\340\320\322\336" },
- { 46, "\272\343\340\341\336\340 \322\322\325\340\345" },
- { 47, "\265\334\343\333\357\342\336\340 DOSBox OPL" },
- { 48, "DVD" },
- { 49, "DVD \337\366\324\332\333\356\347\325\335\330\331 \343\341\337\366\350\335\336" },
- { 50, "DVD \335\325 \337\366\324\332\333\356\347\325\335\330\331" },
- { 51, "\264\320\342\320: " },
- { 52, "\262\366\324\333\320\324\347\330\332" },
- { 53, "\267\320 \343\334\336\322\347\320\335\335\357\334" },
- { 54, "\262\330\324\320\333\330\342\330" },
- { 55, "\267\320\321\336\340\336\335\330\342\330 \322\330\334\332\335\325\335\335\357" },
- { 56, "\261\325\327 \323\340\320\344\366\332\330" },
- { 57, "\267\335\320\331\324\325\335\336 %d \335\336\322\330\345 \366\323\336\340 ..." },
- { 58, "\267\335\320\331\324\325\335\336 %d \335\336\322\330\345 \366\323\336\340." },
- { 59, "\277\336\332\320\327\320\342\330 " },
- { 60, "\277\336\332\320\327\320\342\330 \332\333\320\322\366\320\342\343\340\343" },
- { 61, "\262\330 \324\366\331\341\335\336 \345\336\347\325\342\325 \322\330\324\320\333\330\342\330 \346\325 \327\321\325\340\325\326\325\335\335\357?" },
- { 62, "\262\330 \324\366\331\341\335\336 \345\336\347\325\342\325 \322\330\324\320\333\330\342\330 \343\341\342\320\335\336\322\332\330 \324\333\357 \346\366\364\367 \323\340\330?" },
- { 63, "\262\330 \324\366\331\341\335\336 \345\336\347\325\342\325 \327\320\337\343\341\342\330\342\330 \324\325\342\325\332\342\336\340 \343\341\366\345 \366\323\336\340? \306\325 \337\336\342\325\335\346\366\331\335\336 \334\336\326\325 \324\336\324\320\342\330 \322\325\333\330\332\343 \332\366\333\354\332\366\341\342\354 \366\323\336\340." },
- { 64, "\262\330 \345\336\347\325\342\325 \327\320\322\320\335\342\320\326\330\342\330 \320\321\336 \327\321\325\340\325\323\342\330 \323\340\343?" },
- { 65, "\262\330 \345\336\347\325\342\325 \327\324\366\331\341\335\330\342\330 \320\322\342\336\334\320\342\330\347\335\330\331 \337\336\350\343\332?" },
- { 66, "\262\330 \345\336\347\330\342\325 \322\330\331\342\330?" },
- { 67, "\277\336\324\322\366\331\335\330\331 \343\324\320\340" },
- { 68, "\262\335\330\327" },
- { 69, "\303\322\366\334\332\335\343\342\330 \340\325\326\330\334 Roland GS" },
- { 70, "\264\322\330\326\336\332 \335\325 \337\366\324\342\340\330\334\343\364 \340\366\322\325\335\354 \322\366\324\333\320\324\332\330 '%s'" },
- { 71, "English" },
- { 72, "\277\336\334\330\333\332\320 \327\320\337\343\341\332\343 \323\340\330:" },
- { 73, "\277\336\334\330\333\332\320 \337\366\324 \347\320\341 \337\366\324\332\333\356\347\325\335\335\357 DVD" },
- { 74, "\264\336\324. \350\333\357\345:" },
- { 75, "\265\334\343\333\357\342\336\340 FM Towns" },
- { 76, "\310\322\330\324\332\330\331 \340\325\326\330\334" },
- { 77, "\262\332\333\356\347\325\335\366 \322 \321\366\333\324 \336\337\346\366\367:" },
- { 78, "\262\366\333\354\335\330\331 \336\323\333\357\324" },
- { 79, "\277\336\322\335\320 \335\320\327\322\320 \323\340\330" },
- { 80, "\277\336\322\335\336\325\332\340\320\335\335\330\331 \340\325\326\330\334" },
- { 81, "\277\340\330\341\332\336\340\325\335\335\357 GC \337\320\324\343:" },
- { 82, "\307\343\342\333\330\322\366\341\342\354 GC \337\320\324\343:" },
- { 83, "\263\340\344" },
- { 84, "\277\340\330\341\342\340\366\331 GM:" },
- { 85, "\274\336\322\320 \366\335\342\325\340\344\325\331\341\343:" },
- { 86, "\300\320\341\342\325\340\330\327\320\342\336\340 GUI:" },
- { 87, "\263\340\320" },
- { 88, "\275\325\334\320\364 \344\320\331\333\366\322 \323\340\330" },
- { 89, "Game Id \335\325 \337\366\324\342\340\330\334\343\364\342\354\341\357" },
- { 90, "\310\333\357\345 \324\336 \323\340\330: " },
- { 91, "\263\333\336\321\320\333\354\335\325 \334\325\335\356" },
- { 92, "\277\325\340\325\331\342\330 \335\320 \337\320\337\332\343 \340\366\322\335\325\334 \322\330\351\325" },
- { 93, "\262\322\325\340\345" },
- { 94, "\263\340\320\344\366\332\320" },
- { 95, "\263\340\320\344\366\347\335\330\331 \340\325\326\330\334:" },
- { 96, "\305\320\340\324\322\320\340\335\336\325 \334\320\341\350\342\320\321\343\322\320\335\335\357 (\350\322\330\324\332\336, \320\333\325 \335\330\327\354\332\336\367 \357\332\336\341\342\366)" },
- { 97, "Hercules \317\335\342\320\340\335\330\331" },
- { 98, "Hercules \267\325\333\325\335\330\331" },
- { 99, "\267\320\345\336\322\320\342\330 \337\320\335\325\333\354 \366\335\341\342\340\343\334\325\335\342\366\322" },
- { 100, "\262\330\341\336\332\320 \357\332\366\341\342\354 \327\322\343\332\343 (\337\336\322\366\333\354\335\366\350\325) (\340\325\321\343\342)" },
- { 101, "\262\325\333\330\332\366 \327\335\320\347\325\335\335\357 \327\320\324\320\356\342\354 \332\340\320\351\343 \357\332\366\341\342\354 \327\322\343\332\343, \337\340\336\342\325 \322\336\335\330 \334\336\326\343\342\354 \335\325 \337\366\324\342\340\330\334\343\322\320\342\330\341\357 \322\320\350\336\356 \327\322\343\332\336\322\336\356 \332\320\340\342\336\356" },
- { 102, "\303\342\340\330\334\343\331\342\325 \332\333\320\322\366\350\343 Shift \324\333\357 \342\336\323\336, \351\336\321 \324\336\324\320\342\330 \324\325\332\366\333\354\332\320 \366\323\336\340" },
- { 103, "\263\336\340\330\327\336\335\342\320\333\354\335\330\331 underscan:" },
- { 104, "\265\334\343\333\357\342\336\340 IBM PCjr" },
- { 105, "ID:" },
- { 106, "\246\335\366\346\366\320\333\366\327\320\346\366\357 \334\325\340\325\326\366" },
- { 107, "\277\336\347\320\342\332\336\322\330\331 \334\320\341\350\342\320\321 \322\325\340\345\335\354\336\323\336 \325\332\340\320\335\343:" },
- { 108, "\275\320\341\342\340\336\356\356 \325\334\343\333\357\342\336\340 MT-32" },
- { 109, "\275\320\333\320\350\342\336\322\343\356 \334\325\340\325\326\343" },
- { 110, "\262\322\366\324" },
- { 111, "\275\325\337\340\320\322\330\333\354\335\330\331 \350\333\357\345" },
- { 112, "\277\340\330\327\335\320\347\325\335\335\357 \332\333\320\322\366\350" },
- { 113, "\272\333\320\322\366\320\342\343\340\320" },
- { 114, "\302\320\321\333\330\346\357 \332\333\320\322\366\350:" },
- { 115, "\272\333\320\322\366\350\366" },
- { 116, "\274\336\322\320 \323\340\320\344\366\347\335\336\323\336 \366\335\342\325\340\344\325\331\341\343 ScummVM" },
- { 117, "\274\336\322\320 \323\340\330. \267\334\366\335\320 \346\354\336\323\336 \337\320\340\320\334\325\342\340\343 \335\325 \337\325\340\325\342\322\336\340\330\342\354 \323\340\343 \335\320 \320\335\323\333\366\331\341\354\332\366\331 \322 \343\332\340\320\367\335\341\354\332\343" },
- { 118, "\274\336\322\320:" },
- { 119, "\262\333\366\322\336" },
- { 120, "\273\366\322\330\331 \332\333\366\332" },
- { 121, "\267\320\322\320\335\342\320\326\330\342\330" },
- { 122, "\267\320\322\320\335\342\320\326\330\342\330 \323\340\343:" },
- { 123, "\267\320\322\320\335\342\320\326\330\342\330 \327\321\325\340\325\326\325\335\335\357 \324\333\357 \322\330\321\340\320\335\336\367 \323\340\330" },
- { 124, "\265\334\343\333\357\342\336\340 MAME OPL:" },
- { 125, "MIDI" },
- { 126, "\277\336\341\330\333\325\335\335\357 MIDI:" },
- { 127, "MT-32" },
- { 128, "\277\340\330\341\342\340\366\331 MT-32:" },
- { 129, "\265\334\343\333\357\342\336\340 MT-32" },
- { 130, "\274\320\341\350\342\320\321 \323\336\333\336\322\335\336\323\336 \325\332\340\320\335\343:" },
- { 131, "\277\340\330\327\335\320\347\330\342\330" },
- { 132, "\264\336\324. \321\320\323\320\342\336..." },
- { 133, "\274\325\335\356" },
- { 134, "\300\366\327\335\325" },
- { 135, "\267\334\366\350\320\335\330\331 \340\325\326\330\334 AdLib/MIDI" },
- { 136, "\277\366\324\332\333\356\347\330\342\330 DVD" },
- { 137, "\277\366\324\332\333\356\347\330\342\330 SMB" },
- { 138, "\272\333\366\332 \334\330\350\332\336\356" },
- { 139, "\274\343\333\354\342\366\344\343\335\332\346\366\357" },
- { 140, "\274\343\327\330\347\335\330\331 \277\340\330\341\342\340\366\331:" },
- { 141, "\263\343\347\335\366\341\342\354 \334\343\327\330\332\330:" },
- { 142, "\262\330\334\332\335\343\342\330 \343\341\325" },
- { 143, "\275\320\327\322\320:" },
- { 144, "\274\325\340\325\326\320 \322\330\334\332\335\325\335\320" },
- { 145, "\274\325\340\325\326\320 \335\325 \335\320\333\320\323\336\324\326\325\335\320 (%d)" },
- { 146, "\274\325\340\325\326\320 \337\340\320\346\356\364" },
- { 147, "\274\325\340\325\326\320 \337\340\320\346\356\364, \337\320\337\332\320 \337\366\324\332\333\356\347\325\335\320" },
- { 148, "\275\366\332\336\333\330" },
- { 149, "\275\366" },
- { 150, "\264\320\342\320 \335\325 \327\320\337\330\341\320\335\320" },
- { 151, "\261\325\327 \334\343\327\330\332\330" },
- { 152, "\307\320\341 \323\340\330 \335\325 \327\320\337\330\341\320\335\336" },
- { 153, "\307\320\341 \335\325 \327\320\337\330\341\320\335\330\331" },
- { 154, "\275\325 \327\320\324\320\335\330\331" },
- { 155, "\261\325\327 \327\321\366\333\354\350\325\335\335\357" },
- { 156, "OK" },
- { 157, "\262\330\345\366\324\335\320 \347\320\341\342\336\342\320:" },
- { 158, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 MIDI" },
- { 159, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 MT-32" },
- { 160, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 \320\343\324\366\336" },
- { 161, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 \323\340\320\344\366\332\330" },
- { 162, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 \323\343\347\335\336\341\342\366" },
- { 163, "\265\334\343\333\357\342\336\340 PC \341\337\366\332\325\340\320" },
- { 164, "\277\320\340\336\333\354:" },
- { 165, "\310\333\357\345 \335\325 \364 \337\320\337\332\336\356" },
- { 166, "\310\333\357\345 \335\325 \364 \344\320\331\333\336\334" },
- { 167, "\310\333\357\345 \335\325 \327\335\320\331\324\325\335\330\331" },
- { 168, "\310\333\357\345\330" },
- { 169, "\277\320\343\327\320" },
- { 170, "\262\330\321\325\340\366\342\354 \323\340\343:" },
- { 171, "\277\333\320\342\344\336\340\334\320, \324\333\357 \357\332\336\367 \323\340\320 \321\343\333\320 \341\337\336\347\320\342\332\343 \340\336\327\340\336\321\333\325\335\320" },
- { 172, "\277\333\320\342\344\336\340\334\320:" },
- { 173, "\307\320\341 \323\340\330: " },
- { 174, "\261\343\324\354 \333\320\341\332\320, \322\330\321\325\340\366\342\354 \324\366\356" },
- { 175, "\310\333\357\345 \324\336 \337\333\320\323\366\335\366\322:" },
- { 176, "\277\340\330\341\342\340\366\331 \357\332\336\334\343 \322\366\324\324\320\364\342\354\341\357 \337\325\340\325\322\320\323\320:" },
- { 177, "\275\320\342\330\341\335\366\342\354 \332\333\320\322\366\350\343 \324\333\357 \337\340\330\327\335\320\347\325\335\335\357" },
- { 178, "\262\330\345\366\324" },
- { 179, "\262\330\345\366\324 \327 ScummVM" },
- { 180, "\275\325\324\336\341\342\320\342\335\354\336 \337\340\320\322 \324\333\357 \347\330\342\320\335\335\357" },
- { 181, "\277\336\334\330\333\332\320 \347\330\342\320\335\335\357" },
- { 182, "\277\325\340\325\337\340\330\327\335\320\347\330\342\330 \332\333\320\322\366\350\366" },
- { 183, "\262\330\324\320\333\330\342\330 \323\340\343 \327\366 \341\337\330\341\332\343. \275\325 \322\330\324\320\333\357\364 \323\340\343 \327 \326\336\340\341\342\332\336\323\336 \324\330\341\332\320" },
- { 184, "\300\325\326\330\334 \340\320\341\342\340\343\322\320\335\335\357:" },
- { 185, "\262\337\340\320\322\336" },
- { 186, "\277\340\320\322\330\331 \332\333\366\332" },
- { 187, "\277\340\320\322\330\331 \332\333\366\332" },
- { 188, "\277\336\322\325\340\335\343\342\330" },
- { 189, "\263\343\347\335\366\341\342\354 \325\344\325\332\342\366\322:" },
- { 190, "SMB" },
- { 191, "\267\320\337\330\341\320\342\330" },
- { 192, "\310\333\357\345 \327\321\325\340.: " },
- { 193, "\310\333\357\345 \324\333\357 \327\321\325\340\325\326\325\335\354: " },
- { 194, "\267\321\325\340\325\323\342\330 \323\340\343: " },
- { 195, "\277\336\350\343\332 \327\320\332\366\335\347\325\335\330\331!" },
- { 196, "\277\340\336\323\333\357\335\343\342\336 %d \337\320\337\336\332 ..." },
- { 197, "\263\336\333\336\322\335\325 \334\325\335\356 ScummVM" },
- { 198, "ScummVM \335\325 \327\334\366\323 \327\335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\343 \322\330\321\340\320\335\336\367 \323\340\330!" },
- { 199, "ScummVM \335\325 \334\336\326\325 \327\335\320\331\342\330 \323\340\343 \343 \322\332\320\327\320\335\366\331 \337\320\337\346\366!" },
- { 200, "ScummVM \335\325 \334\336\326\325 \322\366\324\332\340\330\342\330 \322\332\320\327\320\335\343 \337\320\337\332\343!" },
- { 201, "\277\336\350\343\332 \322 \341\337\330\341\332\343 \366\323\336\340" },
- { 202, "\277\336\350\343\332:" },
- { 203, "\262\330\321\325\340\366\342\354 SoundFont" },
- { 204, "\262\330\321\325\340\366\342\354 \342\325\334\343" },
- { 205, "\262\330\321\325\340\366\342\354 \324\336\324\320\342\332\336\322\343 \337\320\337\332\343 \323\340\330" },
- { 206, "\262\330\321\325\340\366\342\354 \324\366\356 \366 \332\333\366\332\335\366\342\354 '\277\340\330\327\335\320\347\330\342\330'" },
- { 207, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \324\333\357 \342\325\334 GUI" },
- { 208, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \327 \324\336\324\320\342\332\336\322\330\334\330 \344\320\331\333\320\334\330" },
- { 209, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \327 \337\333\320\323\330\335\320\334\330" },
- { 210, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \324\333\357 \327\321\325\340\325\326\325\335\354" },
- { 211, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \324\333\357 \327\321\325\340\325\326\325\335\354" },
- { 212, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \327 \344\320\331\333\320\334\330 \323\340\330" },
- { 213, "\307\343\342\333\330\322\366\341\342\354" },
- { 214, "\301\325\340\322\325\340:" },
- { 215, "\274\325\340\325\326\325\322\320 \337\320\337\332\320:" },
- { 216, "\272\336\340\336\342\332\330\331 \366\324\325\335\342\330\344\366\332\320\342\336\340, \357\332\330\331 \322\330\332\336\340\330\341\342\336\322\343\364\342\354\341\357 \324\333\357 \335\320\327\322 \327\321\325\340\325\326\325\335\330\345 \366\323\336\340 \366 \324\333\357 \327\320\337\343\341\332\343 \327 \332\336\334\320\335\324\335\336\367 \341\342\340\366\347\332\330" },
- { 217, "\277\336\332\320\327\320\342\330 \332\333\320\322\366\320\342\343\340\343" },
- { 218, "\277\336\332\320\327\343\322\320\342\330 \332\343\340\341\336\340 \334\330\350\366" },
- { 219, "\277\336\332\320\327\343\322\320\342\330 \341\343\321\342\330\342\340\330 \366 \322\366\324\342\322\336\340\356\322\320\342\330 \334\336\322\343" },
- { 220, "\277\336\332\320\327\320\342\330/\301\345\336\322\320\342\330 \332\343\340\341\336\340" },
- { 221, "\277\340\336\337\343\341\342\330\342\330" },
- { 222, "\277\340\336\337\343\341\342\330\342\330 \340\357\324\336\332" },
- { 223, "\277\340\336\337\343\341\342\330\342\330 \342\325\332\341\342" },
- { 224, "\277\340\330\332\340\366\337\330\342\330 \324\336 \332\340\320\367\322" },
- { 225, "\277\340\336\323\340\320\334\335\325 \334\320\341\350\342\320\321\343\322\320\335\335\357 (\345\336\340\336\350\320 \357\332\366\341\342\354, \320\333\325 \337\336\322\366\333\354\335\366\350\325)" },
- { 226, "\267\322\343\332 \343\322\366\334/\322\330\334\332" },
- { 227, "SoundFont \337\366\324\342\340\330\334\343\364\342\354\341\357 \324\325\357\332\330\334\330 \327\322\343\332\336\322\330\334\330 \332\320\340\342\320\334\330, Fluidsynth \366 Timidity" },
- { 228, "SoundFont:" },
- { 229, "\276\327\322" },
- { 230, "\301\337\325\346\366\320\333\354\335\366 \340\325\326\330\334\330 \340\325\335\324\325\340\330\335\323\343, \357\332\366 \337\366\324\342\340\330\334\343\356\342\354 \324\325\357\332\366 \366\323\340\330" },
- { 231, "\263\343\347\335\366\341\342\354 \341\337\325\346\366\320\333\354\335\330\345 \327\322\343\332\336\322\330\345 \325\344\325\332\342\366\322" },
- { 232, "\262\332\320\327\343\364 \322\330\345\366\324\335\330\331 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \324\333\357 MIDI" },
- { 233, "\262\332\320\327\343\364 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \337\336 \343\334\336\322\347\320\335\335\356 \324\333\357 \322\330\322\336\324\343 \335\320 Roland MT-32/LAPC1/CM32l/CM64" },
- { 234, "\262\332\320\327\343\364 \322\330\345\366\324\335\330\331 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \320\321\336 \325\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\367 \332\320\340\342\330" },
- { 235, "\262\332\320\327\343\364 \350\333\357\345 \324\336 \324\336\324\320\342\332\336\322\330\345 \344\320\331\333\366\322 \324\320\335\330\345, \322\330\332\336\340\330\341\342\336\322\343\322\320\335\330\345 \343\341\366\334\320 \366\323\340\320\334\330, \320\321\336 ScummVM" },
- { 236, "\262\332\320\327\343\364 \350\333\357\345 \324\336 \324\336\324\320\342\332\336\322\330\345 \344\320\331\333\366\322 \324\320\335\330\345 \324\333\357 \323\340\330" },
- { 237, "\262\332\320\327\343\364 \322\330\345\366\324\335\330\331 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \320\321\336 \325\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\367 \332\320\340\342\330" },
- { 238, "\262\332\320\327\343\364 \350\333\357\345 \324\336 \327\321\325\340\325\326\325\335\354 \323\340\330" },
- { 239, "\276\327\322\343\347\325\335\335\357" },
- { 240, "\263\343\347\335\366\341\342\354 \336\327\322\343\347\325\335\335\357:" },
- { 241, "\301\342\320\335\324\320\340\342\335\330\331 \340\320\341\342\325\340\330\327\320\342\336\340 (16bpp)" },
- { 242, "\267\320\337\343\341\342\330\342\330 \322\330\321\340\320\335\343 \323\340\343" },
- { 243, "\301\342\320\335:" },
- { 244, "\301\343\321" },
- { 245, "\310\322\330\324\332\366\341\342\354 \341\343\321\342\330\342\340\366\322:" },
- { 246, "\301\343\321\342\330\342\340\330" },
- { 247, "\267\334\366\335\330\342\330 \323\325\340\336\357" },
- { 248, "\302\320\337 \324\333\357 \333\366\322\336\323\336 \332\333\320\346\320\335\335\357, \337\336\324\322\366\331\335\330\331 \342\320\337 \324\333\357 \337\340\320\322\336\323\336 \332\333\320\346\320\335\335\357" },
- { 249, "\302\325\332\341\342 \366 \336\327\322\343\347\325\335\335\357:" },
- { 250, "\275\325 \334\336\326\343 \337\330\341\320\342\330 \343 \322\330\321\340\320\335\343 \337\320\337\332\343. \261\343\324\354 \333\320\341\332\320, \322\332\320\326\366\342\354 \366\335\350\343." },
- { 251, "\310\333\357\345 \324\336 \342\325\334:" },
- { 252, "\302\325\334\320:" },
- { 253, "\306\325\331 ID \323\340\330 \322\326\325 \322\330\332\336\340\330\341\342\336\322\343\364\342\354\341\357. \261\343\324\354 \333\320\341\332\320, \322\330\321\325\340\366\342\354 \366\335\350\330\331." },
- { 254, "\306\357 \323\340\320 \335\325 \337\366\324\342\340\330\334\343\364 \327\320\322\320\335\342\320\326\325\335\335\357 \327\321\325\340\325\326\325\335\354 \347\325\340\325\327 \323\336\333\336\322\335\325 \334\325\335\356." },
- { 255, "\307\320\341: " },
- { 256, "\307\320\341 \337\366\324\332\333\356\347\325\335\335\357 \324\336 \334\325\340\325\326\366 \322\330\342\366\332" },
- { 257, "\267\334\366\351\325\335\335\357 \342\336\340\332\320\335\354 \337\336 \336\341\366 X" },
- { 258, "\267\334\366\351\325\335\335\357 \342\336\340\332\320\335\354 \337\336 \336\341\366 Y" },
- { 259, "\300\325\326\330\334 \342\320\347\337\320\324\343 \322\330\334\332\335\325\335\330\331." },
- { 260, "\300\325\326\330\334 \342\320\347\337\320\324\343 \343\322\366\334\332\335\325\335\330\331." },
- { 261, "\301\337\340\320\322\326\335\366\331 Roland MT-32 (\322\330\334\332\335\343\342\330 \325\334\343\333\357\346\330\356 GM)" },
- { 262, "\262\330\334\330\332\320\364 \334\320\337\337\366\335\323 General MIDI \324\333\357 \366\323\336\340 \366\327 \327\322\343\332\336\322\336\356 \324\336\340\366\326\332\336\356 \324\333\357 Roland MT-32" },
- { 263, "\275\325\322\366\324\336\334\336" },
- { 264, "\275\325\322\366\324\336\334\320 \337\336\334\330\333\332\320" },
- { 265, "\262\366\324\332\333\356\347\330\342\330 DVD" },
- { 266, "\262\366\324\332\333\356\347\342\330 SMB" },
- { 267, "\261\325\327 \334\320\341\350\342\320\321\343\322\320\335\335\357 (\342\340\325\321\320 \321\343\324\325 \337\340\336\332\340\343\347\343\322\320\342\330 \335\320\333\366\322\336 \366 \335\320\337\340\320\322\336)" },
- { 268, "\300\325\326\330\334 \272\336\333\354\336\340\343 \335\325 \337\366\324\342\340\330\334\343\364\342\354\341\357" },
- { 269, "\267\321\325\340\325\326\325\335\335\357 \321\325\327 \366\334\325\335\366" },
- { 270, "\262\322\325\340\345" },
- { 271, "\262\330\332\336\340\330\341\342\336\322\343\322\320\342\330 \366 MIDI \366 AdLib \324\333\357 \323\325\335\325\340\320\346\366\367 \327\322\343\332\343" },
- { 272, "\262\330\332\336\340\330\341\342\336\322\343\322\320\342\330 \343\337\340\320\322\333\366\335\335\357 \332\343\340\341\336\340\336\334 \357\332 \335\320 \342\340\325\332\337\320\324\366 \333\320\337\342\336\337\366\322" },
- { 273, "\272\336\340\330\341\342\343\322\320\347:" },
- { 274, "\262\330\332\336\340\330\341\342\336\322\343\356 \324\340\320\331\322\325\340 SDL " },
- { 275, "\262\325\340\342\330\332\320\333\354\335\330\331 underscan:" },
- { 276, "\262\366\324\325\336" },
- { 277, "\262\366\340\342\343\320\333\354\335\320 \332\333\320\322\366\320\342\343\340\320" },
- { 278, "\263\343\347\335\366\341\342\354" },
- { 279, "Windows MIDI" },
- { 280, "\275\325\324\336\341\342\320\342\335\354\336 \337\340\320\322 \324\333\357 \327\320\337\330\341\343" },
- { 281, "\277\336\334\330\333\332\320 \327\320\337\330\341\343 \324\320\335\330\345" },
- { 282, "\302\320\332" },
- { 283, "\262\330 \337\336\322\330\335\335\366 \337\325\340\325\327\320\337\343\341\342\330\342\330 ScummVM \351\336\321 \327\320\341\342\336\341\343\322\320\342\330 \327\334\366\335\330." },
- { 284, "\267\336\335\320" },
- { 285, "\267\334\335\350. \334\320\350\342\320\321" },
- { 286, "\267\321\366\333. \334\320\350\342\320\321" },
- { 287, "\332\336\326\335\366 10 \345\322" },
- { 288, "\332\336\326\335\366 15 \345\322" },
- { 289, "\332\336\326\335\366 30 \345\322" },
- { 290, "\332\336\326\335\366 5 \345\322" },
- { 291, "\277\340\336 \337\340\336~\323~\340\320\334\343" },
- { 292, "~\264~\336\324. \323\340\343..." },
- { 293, "\262\366~\324~\334\366\335\320" },
- { 294, "~\267~\320\332\340\330\342\330" },
- { 295, "\300\325\324\320~\323~. \323\340\343..." },
- { 296, "~\264~\336\337\336\334\336\323\320" },
- { 297, "\272\325\340\343\322\320\335\335\357 \321\336\357\334\330 \322 Indy" },
- { 298, "~\272~\333\320\322\366\350\366" },
- { 299, "\273\366\322\336\340\343\332\330\331 \340\325\326\330\334" },
- { 300, "~\267~\320\322\320\335\342\320\326\330\342\330" },
- { 301, "~\267~\320\322\320\335..." },
- { 302, "~\275~\320\341\342" },
- { 303, "~O~K" },
- { 304, "~\276~\337\346\366\367" },
- { 305, "~\276~\337\346\366\367..." },
- { 306, "~\277~\336\337\325\340" },
- { 307, "~\262~\330\345\366\324" },
- { 308, "~\262~\330\324\320\333\330\342\330 \323\340\343" },
- { 309, "\277\340\336\324\336\322~\326~\330\342\330" },
- { 310, "~\277~\336\322\325\340\335\343\342\330\341\354 \322 \323\336\333\336\322\335\325 \334\325\335\356" },
- { 311, "~\267~\320\337\330\341\320\342\330" },
- { 312, "\267~\320~\337\343\341\332" },
- { 313, "\277\325\340\325\345\336\324\330 \320\332\342\330\322\336\322\320\335\366" },
- { 314, "\265\344\325\332\342\330 \322\336\324\330 \322\332\333\356\347\325\335\366" },
- { 315, "\300\325\326\330\334 \350\322\330\324\332\336\323\336 \337\325\340\325\345\336\324\343 \320\332\342\330\322\336\322\320\335\330\331" },
- { -1, NULL }
-};
-
-static const PoMessageEntry _translation_ca_ES[] = {
- { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat <jvprat@gmail.com>\nLanguage-Team: Catalan <scummvm-devel@lists.sf.net>\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" },
- { 2, " (Actiu)" },
- { 3, " (Joc)" },
- { 4, " (Global)" },
- { 5, "(compilat el %s)" },
- { 6, ", error al muntar la compartici\363" },
- { 7, ", compartici\363 no muntada" },
- { 8, "... progr\351s ..." },
- { 9, "11kHz" },
- { 10, "22 kHz" },
- { 11, "44 kHz" },
- { 12, "48 kHz" },
- { 13, "8 kHz" },
- { 14, "<per defecte>" },
- { 15, "Quant a ScummVM" },
- { 16, "Emulador d'AdLib" },
- { 17, "Emulador d'AdLib:" },
- { 18, "AdLib s'utilitza per la m\372sica de molts jocs" },
- { 19, "Afegeix Joc..." },
- { 20, "Pintat amb antialias (16bpp)" },
- { 21, "Correcci\363 del rati d'aspecte" },
- { 22, "Tecla associada : %s" },
- { 23, "Tecla associada : cap" },
- { 24, "\300udio" },
- { 25, "Desat autom\340tic:" },
- { 26, "Motors disponibles:" },
- { 27, "~Q~uant a..." },
- { 28, "Mapeja tecles" },
- { 29, "Ambd\363s" },
- { 30, "Brillantor:" },
- { 31, "Cancel\267la" },
- { 32, "No s'ha pogut crear el fitxer" },
- { 33, "Canvia les opcions del joc" },
- { 34, "Canvia les opcions globals de ScummVM" },
- { 35, "Marqueu si voleu utilitzar el vostre dispositiu hardware real de so compatible amb Roland connectat al vostre ordinador" },
- { 36, "Escull" },
- { 37, "Sel\267leccioneu una acci\363 per mapejar" },
- { 38, "Neteja el valor" },
- { 39, "Tanca" },
- { 40, "Corregeix la relaci\363 d'aspecte per jocs de 320x200" },
- { 41, "No s'ha pogut trobar cap motor capa\347 d'executar el joc seleccionat" },
- { 42, "Mode de v\355deo actual:" },
- { 43, "Cursor Avall" },
- { 44, "Cursor Esquerra" },
- { 45, "Cursor Dreta" },
- { 46, "Cursor Amunt" },
- { 47, "Emulador OPL de DOSBox" },
- { 48, "DVD" },
- { 49, "El DVD s'ha muntat satisfact\362riament" },
- { 50, "El DVD no est\340 muntat" },
- { 51, "Data: " },
- { 52, "Depurador" },
- { 53, "Per defecte" },
- { 54, "Suprimeix" },
- { 55, "Desactiva l'apagat autom\340tic" },
- { 56, "GFX desactivats" },
- { 57, "S'han descobert %d jocs nous ..." },
- { 58, "S'han descobert %d jocs nous." },
- { 59, "Pantalla" },
- { 60, "Mostra el teclat" },
- { 61, "Realment voleu suprimir aquesta partida?" },
- { 62, "Realment voleu suprimir la configuraci\363 d'aquest joc?" },
- { 63, "Esteu segur que voleu executar el detector massiu de jocs? Aix\362 pot afegir una gran quantitat de jocs." },
- { 64, "Voleu carregar o desar el joc?" },
- { 65, "Voleu fer una cerca autom\340tica?" },
- { 66, "Vols sortir?" },
- { 68, "Avall" },
- { 69, "Activa el Mode Roland GS" },
- { 70, "El motor no suporta el nivell de depuraci\363 '%s'" },
- { 71, "Angl\350s" },
- { 72, "Error al executar el joc:" },
- { 73, "Error al muntar el DVD" },
- { 74, "Cam\355 Extra:" },
- { 75, "Emulador de FM Towns" },
- { 76, "Mode r\340pid" },
- { 77, "Caracter\355stiques compilades:" },
- { 78, "Vista lliure" },
- { 79, "T\355tol complet del joc" },
- { 80, "Mode pantalla completa" },
- { 81, "Acceleraci\363 del Pad GC:" },
- { 82, "Sensibilitat del Pad GC:" },
- { 83, "GFX" },
- { 84, "Dispositiu GM:" },
- { 85, "Idioma de la interf\355cie d'usuari:" },
- { 86, "Mode de pintat de la interf\355cie d'usuari:" },
- { 87, "Joc" },
- { 88, "No s'han trobat les dades del joc" },
- { 89, "Identificador de joc no suportat" },
- { 90, "Cam\355 del Joc:" },
- { 91, "Men\372 global" },
- { 92, "Torna al nivell de directoris anterior" },
- { 93, "Amunt" },
- { 94, "Gr\340fics" },
- { 95, "Mode gr\340fic:" },
- { 96, "Escalat per hardware (r\340pid, per\362 de baixa qualitat)" },
- { 97, "Hercules \300mbar" },
- { 98, "Hercules Verd" },
- { 99, "Oculta la barra d'eines" },
- { 100, "Alta qualitat d'\340udio (m\351s lent) (reiniciar)" },
- { 101, "Valors m\351s alts especifiquen millor qualitat de so per\362 pot ser que la vostra tarja de so no ho suporti" },
- { 102, "Mantingueu premut Shift per a l'Addici\363 Massiva" },
- { 104, "Emulador d'IBM PCjr" },
- { 105, "Identificador:" },
- { 106, "Inicia la xarxa" },
- { 107, "Escalat inicial de la pantalla superior:" },
- { 108, "Iniciant l'Emulador de MT-32" },
- { 109, "Iniciant la xarxa" },
- { 110, "Entrada" },
- { 111, "Cam\355 incorrecte" },
- { 112, "Mapejador de tecles" },
- { 113, "Teclat" },
- { 114, "Mapa de teclat:" },
- { 115, "Tecles" },
- { 116, "Idioma de la interf\355cie d'usuari de ScummVM" },
- { 117, "Idioma del joc. Aix\362 no convertir\340 la vostra versi\363 Espanyola del joc a Angl\350s" },
- { 118, "Idioma:" },
- { 119, "Esquerra" },
- { 120, "Clic esquerre" },
- { 121, "Carrega" },
- { 122, "Carrega partida:" },
- { 123, "Carrega una partida pel joc seleccionat" },
- { 124, "Emulador OPL de MAME" },
- { 125, "MIDI" },
- { 126, "Guany MIDI:" },
- { 128, "Dispositiu MT32:" },
- { 129, "Emulador de MT-32" },
- { 130, "Escalat de la pantalla principal:" },
- { 131, "Mapeja" },
- { 132, "Addici\363 Massiva..." },
- { 133, "Men\372" },
- { 134, "Misc" },
- { 135, "Mode combinat AdLib/MIDI" },
- { 136, "Munta el DVD" },
- { 137, "Munta SMB" },
- { 138, "Clic del ratol\355" },
- { 139, "Funci\363 M\372ltiple" },
- { 140, "Dispositiu GM:" },
- { 141, "Volum de la m\372sica:" },
- { 142, "Silenciar tot" },
- { 143, "Nom:" },
- { 144, "Xarxa inactiva" },
- { 145, "Xarxa no iniciada (%d)" },
- { 146, "Xarxa activa" },
- { 147, "Xarxa activa, compartici\363 muntada" },
- { 148, "Mai" },
- { 149, "No" },
- { 150, "No hi ha data desada" },
- { 151, "Sense m\372sica" },
- { 152, "No hi ha temps de joc desat" },
- { 153, "No hi ha hora desada" },
- { 154, "Cap" },
- { 155, "Normal (sense escalar)" },
- { 156, "D'acord" },
- { 157, "Freq\374\350ncia de sortida:" },
- { 158, "Fer canvis sobre les opcions globals de MIDI" },
- { 159, "Fer canvis sobre les opcions globals de MIDI" },
- { 160, "Fer canvis sobre les opcions globals d'\340udio" },
- { 161, "Fer canvis sobre les opcions globals de gr\340fics" },
- { 162, "Fer canvis sobre les opcions globals de volum" },
- { 163, "Emulador d'Altaveu de PC" },
- { 164, "Contrasenya:" },
- { 165, "El cam\355 no \351s un directori" },
- { 166, "El cam\355 no \351s un fitxer" },
- { 167, "El cam\355 no existeix" },
- { 168, "Camins" },
- { 169, "Pausa" },
- { 170, "Seleccioneu el joc:" },
- { 171, "Plataforma per la que el joc es va dissenyar originalment" },
- { 172, "Plataforma:" },
- { 173, "Temps de joc: " },
- { 174, "Seleccioneu una acci\363" },
- { 175, "Cam\355 dels connectors:" },
- { 176, "Dispositiu Preferit:" },
- { 177, "Premeu la tecla a associar" },
- { 178, "Surt" },
- { 179, "Surt de ScummVM" },
- { 180, "S'ha denegat el perm\355s de lectura" },
- { 181, "Ha fallat la lectura" },
- { 182, "Remapeja les tecles" },
- { 183, "Elimina un joc de la llista. Els fitxers de dades del joc es mantenen intactes" },
- { 184, "Mode de pintat:" },
- { 185, "Dreta" },
- { 186, "Clic dret" },
- { 187, "Clic dret" },
- { 188, "Rotar" },
- { 189, "Volum dels efectes:" },
- { 190, "SMB" },
- { 191, "Desa" },
- { 192, "Cam\355 de les Partides:" },
- { 193, "Cam\355 de les Partides: " },
- { 194, "Desa la partida:" },
- { 195, "S'ha acabat la cerca!" },
- { 196, "S'han cercat %d directoris ..." },
- { 197, "Men\372 Principal de ScummVM" },
- { 198, "ScummVM no ha pogut trobar cap motor capa\347 d'executar el joc seleccionat!" },
- { 199, "ScummVM no ha pogut trobar cap joc al directori especificat!" },
- { 200, "ScummVM no ha pogut obrir el directori especificat!" },
- { 201, "Cerca a la llista de jocs" },
- { 202, "Cerca:" },
- { 203, "Seleccioneu el fitxer SoundFont" },
- { 204, "Seleccioneu un Tema" },
- { 205, "Seleccioneu el directori addicional del joc" },
- { 206, "Seleccioneu una acci\363 i cliqueu 'Mapeja'" },
- { 207, "Seleccioneu el directori dels temes de la Interf\355cie d'Usuari" },
- { 208, "Seleccioneu el directori dels fitxers extra" },
- { 209, "Seleccioneu el directori dels connectors" },
- { 210, "Seleccioneu el directori de les partides desades" },
- { 211, "Seleccioneu el directori de les partides desades" },
- { 212, "Seleccioneu el directori amb les dades del joc" },
- { 213, "Sensibilitat" },
- { 214, "Servidor:" },
- { 215, "Compartici\363:" },
- { 216, "Identificador de joc curt utilitzat per referir-se a les partides i per executar el joc des de la l\355nia de comandes" },
- { 217, "Mostra el teclat" },
- { 218, "Mostra el cursor del ratol\355" },
- { 219, "Mostra els subt\355tols i reprodueix la veu" },
- { 220, "Mostra/Oculta el cursor" },
- { 221, "Salta" },
- { 222, "Salta la l\355nia" },
- { 223, "Salta el text" },
- { 225, "Escalat per software (bona qualitat, per\362 m\351s lent)" },
- { 226, "So engegat/parat" },
- { 227, "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" },
- { 228, "Fitxer SoundFont:" },
- { 229, "Veus" },
- { 230, "Modes de dispersi\363 especials suportats per alguns jocs" },
- { 231, "Volum dels sons d'efectes especials" },
- { 232, "Especifica el dispositiu de so per defecte per a la sortida General MIDI" },
- { 233, "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/LAPC1/CM32l/CM64" },
- { 234, "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" },
- { 235, "Especifica el cam\355 de les dades addicionals utilitzades per tots els jocs o pel ScummVM" },
- { 236, "Especifica el cam\355 de dades addicionals utilitzades pel joc" },
- { 237, "Especifica el dispositiu de so o l'emulador de tarja de so preferit" },
- { 238, "Especifica on es desaran les partides" },
- { 239, "Veus" },
- { 240, "Volum de la veu:" },
- { 241, "Pintat est\340ndard (16bpp)" },
- { 242, "Iniciant el joc seleccionat" },
- { 243, "Estat:" },
- { 244, "Subt" },
- { 245, "Velocitat dels subt\355tols:" },
- { 246, "Subt\355tols" },
- { 247, "Commuta el personatge" },
- { 248, "Toc per a clic esquerre, doble toc per a clic dret" },
- { 249, "Text i Veus:" },
- { 250, "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un altre." },
- { 251, "Cam\355 dels Temes:" },
- { 252, "Tema:" },
- { 253, "Aquest identificador de joc ja est\340 usat. Si us plau, trieu-ne un altre." },
- { 254, "Aquest joc no suporta la c\340rrega de partides des del llan\347ador." },
- { 255, "Hora: " },
- { 257, "Despla\347ament X del toc" },
- { 258, "Despla\347ament Y del toc" },
- { 259, "Mode Touchpad desactivat." },
- { 260, "Mode Touchpad activat." },
- { 261, "Roland MT-32 real (desactiva l'emulaci\363 GM)" },
- { 262, "Desactiva la conversi\363 General MIDI pels jocs que tenen banda sonora per a Roland MT-32" },
- { 263, "Desconegut" },
- { 264, "Error desconegut" },
- { 265, "Desmunta el DVD" },
- { 266, "Desmunta SMB" },
- { 267, "Sense escalar (haureu de despla\347ar-vos a esquerra i dreta)" },
- { 268, "Mode de color no suportat" },
- { 269, "Partida sense t\355tol" },
- { 270, "Amunt" },
- { 271, "Utilitza MIDI i la generaci\363 de so AdLib alhora" },
- { 272, "Utilitza el control del cursor a l'estil del trackpad dels port\340tils" },
- { 273, "Nom d'usuari:" },
- { 274, "Utilitzant el controlador SDL " },
- { 276, "V\355deo" },
- { 277, "Teclat virtual" },
- { 278, "Volum" },
- { 279, "MIDI de Windows" },
- { 280, "S'ha denegat el perm\355s d'escriptura" },
- { 281, "Ha fallat l'escriptura de dades" },
- { 282, "S\355" },
- { 283, "Heu de reiniciar ScummVM perqu\350 tots els canvis tingui efecte." },
- { 284, "Zona" },
- { 285, "Redueix" },
- { 286, "Amplia" },
- { 287, "cada 10 minuts" },
- { 288, "cada 15 minuts" },
- { 289, "cada 30 minuts" },
- { 290, "cada 5 minuts" },
- { 291, "~Q~uant a" },
- { 292, "~A~fegeix Joc..." },
- { 293, "~C~ancel\267la" },
- { 294, "~T~anca" },
- { 295, "~E~dita Joc..." },
- { 296, "~A~juda" },
- { 297, "Controls de lluita de l'~I~ndy" },
- { 298, "~T~ecles" },
- { 299, "Mode ~e~squerr\340" },
- { 300, "C~a~rrega" },
- { 301, "~C~arrega..." },
- { 302, "~S~eg\374ent" },
- { 303, "~D~'acord" },
- { 304, "~O~pcions" },
- { 305, "~O~pcions..." },
- { 306, "~A~nterior" },
- { 307, "~T~anca" },
- { 308, "~S~uprimeix Joc" },
- { 309, "~C~ontinua" },
- { 310, "~R~etorna al Llan\347ador" },
- { 311, "~D~esa" },
- { 312, "~I~nicia" },
- { 313, "~T~ransicions activades" },
- { 314, "~E~fecte de l'aigua activat" },
- { 315, "Mode ~Z~ip activat" },
- { -1, NULL }
-};
-
-static const PoMessageEntry _translation_es_ES[] = {
- { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-30 22:17+0100\nLast-Translator: Tom\341s Maidagan\nLanguage-Team: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Espanol\n" },
- { 1, "\277Seguro que quieres salir?" },
- { 2, "(Activa)" },
- { 3, "(Juego)" },
- { 4, "(General)" },
- { 5, "(compilado el %s)" },
- { 6, ", error al montar el disco compartido" },
- { 7, ", disco compartido no montado" },
- { 8, "... progreso..." },
- { 9, "11kHz" },
- { 10, "22 kHz" },
- { 11, "44 kHz" },
- { 12, "48 kHz" },
- { 13, "8 kHz" },
- { 14, "<por defecto>" },
- { 15, "Acerca de ScummVM" },
- { 16, "Emulador de AdLib" },
- { 17, "Emulador de AdLib:" },
- { 18, "AdLib se usa para la m\372sica en muchos juegos" },
- { 19, "A\361adir juego..." },
- { 20, "Antialiasing (16bpp)" },
- { 21, "Correcci\363n de aspecto" },
- { 22, "Tecla asociada: %s" },
- { 23, "Tecla asociada: ninguna" },
- { 24, "Sonido" },
- { 25, "Autoguardado:" },
- { 26, "Motores disponibles:" },
- { 27, "Acerca ~d~e" },
- { 28, "Asignar teclas" },
- { 29, "Ambos" },
- { 30, "Brillo:" },
- { 31, "Cancelar" },
- { 32, "Imposible crear el archivo" },
- { 33, "Cambiar opciones de juego" },
- { 34, "Cambiar opciones generales de ScummVM" },
- { 35, "Marcar si se quiere usar un dispositivo de sonido real conectado al ordenador y compatible con Roland" },
- { 36, "Elegir" },
- { 37, "Elige la acci\363n a asociar" },
- { 38, "Eliminar valor" },
- { 39, "Cerrar" },
- { 40, "Corregir relaci\363n de aspecto en juegos 320x200" },
- { 41, "No se ha podido encontrar ning\372n motor capaz de ejecutar el juego" },
- { 42, "Modo de v\355deo actual:" },
- { 43, "Abajo" },
- { 44, "Izquierda" },
- { 45, "Derecha" },
- { 46, "Arriba" },
- { 47, "Emulador de DOSBox OPL" },
- { 48, "DVD" },
- { 49, "DVD montado con \351xito" },
- { 50, "DVD no montado" },
- { 51, "Fecha:" },
- { 52, "Debugger" },
- { 53, "Por defecto" },
- { 54, "Borrar" },
- { 55, "Desactivar apagado" },
- { 56, "GFX desactivados" },
- { 57, "Se han encontrado %d juegos nuevos..." },
- { 58, "Se han encontrado %d juegos nuevos." },
- { 59, "Pantalla" },
- { 60, "Mostrar el teclado" },
- { 61, "\277Seguro que quieres borrar esta partida?" },
- { 62, "\277Seguro que quieres eliminar la configuraci\363n de este juego?" },
- { 63, "\277Seguro que quieres ejecutar la detecci\363n masiva? Puede que se a\361ada un gran n\372mero de juegos." },
- { 64, "\277Quieres cargar o guardar el juego?" },
- { 65, "\277Quieres realizar una b\372squeda autom\341tica?" },
- { 66, "\277Quieres salir?" },
- { 67, "Doble golpe" },
- { 68, "Abajo" },
- { 69, "Activar modo Roland GS" },
- { 70, "El motor no soporta el nivel de debug '%s'" },
- { 71, "Ingl\351s" },
- { 72, "Error al ejecutar el juego:" },
- { 73, "Error al montar el DVD" },
- { 74, "Adicional:" },
- { 75, "Emulador de FM Towns" },
- { 76, "Modo r\341pido" },
- { 77, "Caracter\355sticas compiladas:" },
- { 78, "Vista libre" },
- { 79, "T\355tulo completo del juego" },
- { 80, "Pantalla completa" },
- { 81, "Aceleraci\363n del pad GC:" },
- { 82, "Sensibilidad del pad GC:" },
- { 83, "GFX" },
- { 84, "Dispositivo GM:" },
- { 85, "Idioma de la interfaz:" },
- { 86, "Render de la interfaz" },
- { 87, "Juego" },
- { 88, "No se han encontrado datos de juego" },
- { 89, "ID del juego no soportada" },
- { 90, "Juego:" },
- { 91, "Men\372 general" },
- { 92, "Ir al directorio anterior" },
- { 93, "Arriba" },
- { 94, "Gr\341ficos" },
- { 95, "Modo gr\341fico:" },
- { 96, "Escalado por hardware (r\341pido, pero de baja calidad)" },
- { 97, "Hercules \341mbar" },
- { 98, "Hercules verde" },
- { 99, "Ocultar barra de tareas" },
- { 100, "Sonido de alta calidad (m\341s lento) (reinicio)" },
- { 101, "Los valores m\341s altos ofrecen mayor calidad, pero puede que tu tarjeta de sonido no sea compatible" },
- { 102, "Mant\351n pulsado May\372s para a\361adir varios" },
- { 103, "Underscan horizontal" },
- { 104, "Emulador de IBM PCjr" },
- { 105, "ID:" },
- { 106, "Inicializar red" },
- { 107, "Escalado de la pantalla inicial superior:" },
- { 108, "Iniciando emulador de MT-32" },
- { 109, "Inicializando red" },
- { 110, "Entrada" },
- { 111, "Ruta no v\341lida" },
- { 112, "Asignaci\363n de teclas" },
- { 113, "Teclado" },
- { 114, "Asignaci\363n de teclas:" },
- { 115, "Teclas" },
- { 116, "Idioma de la interfaz de ScummVM" },
- { 117, "Idioma del juego. No sirve para pasar al ingl\351s la versi\363n espa\361ola de un juego" },
- { 118, "Idioma:" },
- { 119, "Izquierda" },
- { 120, "Clic izquierdo" },
- { 121, "Cargar" },
- { 122, "Cargar juego:" },
- { 123, "Cargar partida del juego seleccionado" },
- { 124, "Emulador de MAME OPL" },
- { 125, "MIDI" },
- { 126, "Ganancia MIDI:" },
- { 127, "MT-32" },
- { 128, "Dispositivo MT-32:" },
- { 129, "Emulador de MT-32" },
- { 130, "Escalado de la pantalla principal:" },
- { 131, "Asignar" },
- { 132, "A\361adir varios..." },
- { 133, "Men\372" },
- { 134, "Otros" },
- { 135, "Modo AdLib/MIDI" },
- { 136, "Montar DVD" },
- { 137, "Montar SMB" },
- { 138, "Clic de rat\363n" },
- { 139, "Multifunci\363n" },
- { 140, "Dispositivo de m\372sica:" },
- { 141, "Volumen de la m\372sica:" },
- { 142, "Silenciar" },
- { 143, "Nombre:" },
- { 144, "Red desconectada" },
- { 145, "Red no inicializada (%d)" },
- { 146, "Red conectada" },
- { 147, "Red conectada, disco compartido montado" },
- { 148, "Nunca" },
- { 149, "No" },
- { 150, "No hay fecha guardada" },
- { 151, "Sin m\372sica" },
- { 152, "No hay tiempo de juego guardado" },
- { 153, "No hay hora guardada" },
- { 154, "Ninguno" },
- { 155, "Normal (sin escalado)" },
- { 156, "De acuerdo" },
- { 157, "Frecuencia de salida:" },
- { 158, "Ignorar opciones MIDI generales" },
- { 159, "Ignorar opciones MT-32 generales" },
- { 160, "Ignorar opciones de sonido generales" },
- { 161, "Ignorar opciones gr\341ficas generales" },
- { 162, "Ignorar opciones de volumen generales" },
- { 163, "Emulador del altavoz de PC" },
- { 164, "Contrase\361a:" },
- { 165, "La ruta no es un directorio" },
- { 166, "La ruta no es un archivo" },
- { 167, "La ruta no existe" },
- { 168, "Rutas" },
- { 169, "Pausar" },
- { 170, "Elige el juego:" },
- { 171, "Plataforma para la que se dise\361\363 el juego" },
- { 172, "Plataforma:" },
- { 173, "Tiempo de juego:" },
- { 174, "Por favor, selecciona una acci\363n" },
- { 175, "Plugins:" },
- { 176, "Dispositivo preferido:" },
- { 177, "Pulsa la tecla a asignar" },
- { 178, "Salir" },
- { 179, "Cerrar ScummVM" },
- { 180, "Permiso de lectura denegado" },
- { 181, "Lectura fallida" },
- { 182, "Asignar teclas" },
- { 183, "Elimina el juego de la lista. Los archivos no se borran" },
- { 184, "Modo de renderizado:" },
- { 185, "Derecha" },
- { 186, "Clic derecho" },
- { 187, "Clic derecho" },
- { 188, "Rotar" },
- { 189, "Volumen de los efectos" },
- { 190, "SMB" },
- { 191, "Guardar" },
- { 192, "Partidas:" },
- { 193, "Partidas:" },
- { 194, "Guardar partida" },
- { 195, "\241B\372squeda completada!" },
- { 196, "Se ha buscado en %d directorios..." },
- { 197, "Men\372 principal de ScummVM" },
- { 198, "\241ScummVM no ha podido encontrar ning\372n motor capaz de ejecutar el juego!" },
- { 199, "\241ScummVM no ha encontrado ning\372n juego en el directorio!" },
- { 200, "\241ScummVM no ha podido abrir el directorio!" },
- { 201, "Buscar en la lista de juegos" },
- { 202, "Buscar:" },
- { 203, "Seleccionar SoundFont" },
- { 204, "Selecciona un tema" },
- { 205, "Seleccionar directorio de juego adicional" },
- { 206, "Selecciona una acci\363n y pulsa \"Asignar\"" },
- { 207, "Selecciona el directorio para temas de interfaz" },
- { 208, "Selecciona el directorio para archivos adicionales" },
- { 209, "Selecciona el directorio para plugins" },
- { 210, "Seleccionar directorio para partidas guardadas" },
- { 211, "Selecciona el directorio para partidas guardadas." },
- { 212, "Seleccionar directorio con los archivos del juego" },
- { 213, "Sensibilidad" },
- { 214, "Servidor:" },
- { 215, "Disco compartido:" },
- { 216, "Identificador usado para las partidas guardadas y para ejecutar el juego desde la l\355nea de comando" },
- { 217, "Mostrar teclado" },
- { 218, "Mostrar el cursor" },
- { 219, "Reproducir voces y subt\355tulos" },
- { 220, "Mostrar/ocultar cursor" },
- { 221, "Saltar" },
- { 222, "Saltar frase" },
- { 223, "Saltar texto" },
- { 224, "Pegar a los bordes" },
- { 225, "Escalado por software (buena calidad, pero m\341s lento)" },
- { 226, "Sonido activado/desactivado" },
- { 227, "Algunas tarjetas de sonido, Fluidsynth y Timidity soportan SoundFont" },
- { 228, "SoundFont:" },
- { 229, "Voces" },
- { 230, "Modos especiales de expansi\363n soportados por algunos juegos" },
- { 231, "Volumen de los efectos de sonido" },
- { 232, "Especifica el dispositivo de salida General MIDI por defecto" },
- { 233, "Especifica el dispositivo de sonido para la salida Roland MT-32/LAPC1/CM32l/CM64 por defecto" },
- { 234, "Especifica el dispositivo de sonido o emulador de tarjeta de sonido de salida" },
- { 235, "Especifica el directorio adicional usado por los juegos y ScummVM" },
- { 236, "Especifica un directorio para datos adicionales del juego" },
- { 237, "Especifica qu\351 dispositivo de sonido o emulador de tarjeta de sonido prefieres" },
- { 238, "Especifica d\363nde guardar tus partidas" },
- { 239, "Voces" },
- { 240, "Volumen de las voces" },
- { 241, "Est\341ndar (16bpp)" },
- { 242, "Jugar al juego seleccionado" },
- { 243, "Estado:" },
- { 244, "Subt." },
- { 245, "Velocidad de los subt\355tulos:" },
- { 246, "Subt\355tulos" },
- { 247, "Cambiar personaje" },
- { 248, "Un toque para clic izquierdo, dos para clic derecho" },
- { 249, "Texto y voces:" },
- { 250, "No se puede escribir en el directorio elegido. Por favor, selecciona otro." },
- { 251, "Temas:" },
- { 252, "Tema:" },
- { 253, "Esta ID ya est\341 siendo usada. Por favor, elige otra." },
- { 254, "Este juego no permite cargar partidas desde el lanzador." },
- { 255, "Hora:" },
- { 256, "Se ha excedido el tiempo de inicializaci\363n de red" },
- { 257, "Compensaci\363n X del toque" },
- { 258, "Compensaci\363n Y del toque" },
- { 259, "Modo Touchpad desactivado." },
- { 260, "Modo Touchpad activado." },
- { 261, "Roland MT-32 aut\351ntica (desactivar emulaci\363n GM)" },
- { 262, "Desactiva la conversi\363n General MIDI en juegos con sonido Roland MT-32" },
- { 263, "Desconocido" },
- { 264, "Error desconocido" },
- { 265, "Desmontar DVD" },
- { 266, "Desmontar SMB" },
- { 267, "Sin escalado (debes desplazar la pantalla a los lados)" },
- { 268, "Modo de color no soportado" },
- { 269, "Partida sin nombre" },
- { 270, "Arriba" },
- { 271, "Usar tanto MIDI como AdLib en la generaci\363n de sonido" },
- { 272, "Activar el sistema de control tipo trackpad de los port\341tiles" },
- { 273, "Usuario:" },
- { 274, "Usando driver SDL" },
- { 275, "Underscan vertical:" },
- { 276, "V\355deo" },
- { 277, "Teclado virtual" },
- { 278, "Volumen" },
- { 279, "Windows MIDI" },
- { 280, "Permiso de escritura denegado" },
- { 281, "Escritura de datos fallida" },
- { 282, "S\355" },
- { 283, "Tienes que reiniciar ScummVM para aplicar los cambios." },
- { 284, "Zona" },
- { 285, "Disminuir zoom" },
- { 286, "Aumentar zoom" },
- { 287, "cada 10 minutos" },
- { 288, "cada 15 minutos" },
- { 289, "cada 30 minutos" },
- { 290, "cada 5 minutos" },
- { 291, "Acerca ~d~e" },
- { 292, "~A~\361adir juego..." },
- { 293, "~C~ancelar" },
- { 294, "Cerra~r~" },
- { 295, "~E~ditar juego..." },
- { 296, "~A~yuda" },
- { 297, "Controles para pelear de ~I~ndy" },
- { 298, "~T~eclas" },
- { 299, "Modo para ~z~urdos" },
- { 300, "~C~argar" },
- { 301, "~C~argar..." },
- { 302, "Si~g~uiente" },
- { 303, "~S~\355" },
- { 304, "~O~opciones" },
- { 305, "~O~opciones..." },
- { 306, "~A~nterior" },
- { 307, "~S~alir" },
- { 308, "E~l~iminar juego" },
- { 309, "~R~eanudar" },
- { 310, "~V~olver al lanzador" },
- { 311, "~G~uardar" },
- { 312, "~J~ugar" },
- { 313, "Tra~n~siciones activadas" },
- { 314, "Efecto ag~u~a activado" },
- { 315, "Modo ~Z~ip activado" },
- { -1, NULL }
-};
-
-static const PoMessageEntry _translation_de_DE[] = {
- { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-09 20:37+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari <Lothar@Windowsbase.de> & Simon Sawatzki <SimSaw@gmx.de>\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" },
- { 1, " M\366chten Sie wirklich beenden? " },
- { 2, " (Aktiv)" },
- { 3, " (Spiel)" },
- { 4, " (Global)" },
- { 5, "(erstellt am %s)" },
- { 6, ", Fehler beim Einbinden des \366ffentlichen Verzeichnisses" },
- { 7, ", \366ffentliches Verzeichnis nicht eingebunden" },
- { 8, "... l\344uft..." },
- { 9, "11 kHz" },
- { 10, "22 kHz" },
- { 11, "44 kHz" },
- { 12, "48 kHz" },
- { 13, "8 kHz" },
- { 14, "<Standard>" },
- { 15, "\334ber ScummVM" },
- { 16, "AdLib-Emulator" },
- { 17, "AdLib-Emulator" },
- { 18, "AdLib wird f\374r die Musik in vielen Spielen verwendet." },
- { 19, "Spiel hinzuf\374gen" },
- { 20, "Kantengl\344ttung (16bpp)" },
- { 21, "Seitenverh\344ltnis korrigieren" },
- { 22, "Zugewiesene Taste: %s" },
- { 23, "Zugewiesene Taste: keine" },
- { 24, "Audio" },
- { 25, "Autom. Speichern:" },
- { 26, "Verf\374gbare Spiele-Engines:" },
- { 27, "\334be~r~" },
- { 28, "Tasten zuweisen" },
- { 29, "Beides" },
- { 30, "Helligkeit:" },
- { 31, "Abbrechen" },
- { 32, "Kann Datei nicht erstellen." },
- { 33, "Spieloptionen \344ndern" },
- { 34, "Globale ScummVM-Einstellungen bearbeiten" },
- { 35, "W\344hlen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-kompatiblen Soundkarte verbunden ist, verwenden m\366chten." },
- { 36, "Ausw\344hlen" },
- { 37, "Eine Aktion zum Zuweisen ausw\344hlen" },
- { 38, "Wert l\366schen" },
- { 39, "Schlie\337en" },
- { 40, "Seitenverh\344ltnis f\374r Spiele mit der Aufl\366sung 320x200 korrigieren" },
- { 41, "Kann keine Spiel-Engine finden, die dieses Spiel starten kann." },
- { 42, "Aktueller Videomodus:" },
- { 43, "Zeiger runter" },
- { 44, "Zeiger nach links" },
- { 45, "Zeiger nach rechts" },
- { 46, "Zeiger hoch" },
- { 47, "DOSBox-OPL-Emulator" },
- { 48, "DVD" },
- { 49, "DVD erfolgreich eingebunden" },
- { 50, "DVD nicht eingebunden" },
- { 51, "Datum: " },
- { 52, "Debugger" },
- { 53, "Standard" },
- { 54, "L\366schen" },
- { 55, "Stromsparmodus abschalten" },
- { 56, "GFX ausgeschalten" },
- { 57, "%d neue Spiele gefunden..." },
- { 58, "%d neue Spiele gefunden." },
- { 59, "Anzeige" },
- { 60, "Tastatur anzeigen" },
- { 61, "Diesen Spielstand wirklich l\366schen?" },
- { 62, "M\366chten Sie wirklich diese Spielkonfiguration entfernen?" },
- { 63, "M\366chten Sie wirklich den PC nach Spielen durchsuchen? M\366glicherweise wird dabei eine gr\366\337ere Menge an Spielen hinzugef\374gt." },
- { 64, "M\366chten Sie ein Spiel laden oder speichern?" },
- { 65, "M\366chten Sie eine automatische Durchsuchung vornehmen?" },
- { 66, "M\366chten Sie beenden?" },
- { 67, "Doppelzeilen (kein Zeilensprungverfahren)" },
- { 68, "Runter" },
- { 69, "Roland-GS-Modus" },
- { 70, "Engine unterst\374tzt den Debug-Level \"%s\" nicht" },
- { 71, "English" },
- { 72, "Fehler beim Ausf\374hren des Spiels:" },
- { 73, "Fehler beim Einbinden der DVD" },
- { 74, "Extrapfad:" },
- { 75, "FM-Towns-Emulator" },
- { 76, "Schneller Modus" },
- { 77, "Verwendete Funktionen:" },
- { 78, "Freie Ansicht" },
- { 79, "Voller Name des Spiels" },
- { 80, "Vollbildmodus" },
- { 81, "GC-Pad-Beschleunigung:" },
- { 82, "GC-Pad-Empfindlichkeit:" },
- { 83, "GFX" },
- { 84, "GM-Ger\344t:" },
- { 85, "GUI-Sprache:" },
- { 86, "GUI-Renderer:" },
- { 87, "Spiel" },
- { 88, "Spieldaten nicht gefunden" },
- { 89, "Spielkennung nicht unterst\374tzt" },
- { 90, "Spielpfad:" },
- { 91, "Hauptmen\374" },
- { 92, "Zu h\366herer Pfadebene wechseln" },
- { 93, "Pfad hoch" },
- { 94, "Grafik" },
- { 95, "Grafikmodus:" },
- { 96, "Hardware-Skalierung (schnell, aber schlechte Qualit\344t)" },
- { 97, "Hercules Bernsteingelb" },
- { 98, "Hercules-Gr\374n" },
- { 99, "Werkzeugleiste verbergen" },
- { 100, "Hohe Audioqualit\344t (lansamer) (erfordert Neustart)" },
- { 101, "H\366here Werte bewirken eine bessere Soundqualit\344t, werden aber m\366glicherweise nicht von jeder Soundkarte unterst\374tzt." },
- { 102, "Umschalttaste (Shift) gedr\374ckt halten, um Verzeichnisse nach Spielen zu durchsuchen" },
- { 103, "Horizontale Bildverkleinerung:" },
- { 104, "IBM-PCjr-Emulator" },
- { 105, "Kennung:" },
- { 106, "Netzwerk starten" },
- { 107, "Verg\366\337erung des oberen Bildschirms:" },
- { 108, "MT-32-Emulator wird gestartet..." },
- { 109, "Netzwerk wird gestartet..." },
- { 110, "Eingabe" },
- { 111, "Ung\374ltiges Verzeichnis" },
- { 112, "Tasten zuordnen" },
- { 113, "Tastatur" },
- { 114, "Tasten-Layout:" },
- { 115, "Tasten" },
- { 116, "Sprache der ScummVM-Oberfl\344che" },
- { 117, "Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des Spiels in eine deutsche verwandeln." },
- { 118, "Sprache:" },
- { 119, "Links" },
- { 120, "Linksklick" },
- { 121, "Laden" },
- { 122, "Spiel laden:" },
- { 123, "Spielstand f\374r ausgew\344hltes Spiel laden" },
- { 124, "MAME-OPL-Emulator" },
- { 125, "MIDI" },
- { 126, "MIDI-Lautst\344rke:" },
- { 128, "MT32-Ger\344t:" },
- { 129, "MT-32-Emulation" },
- { 130, "Hauptbildschirm-Skalierung:" },
- { 131, "Zuweisen" },
- { 132, "Durchsuchen" },
- { 133, "Men\374" },
- { 134, "Sonstiges" },
- { 135, "AdLib-/MIDI-Modus" },
- { 136, "DVD einbinden" },
- { 137, "SMB einbinden" },
- { 138, "Mausklick" },
- { 139, "Multifunktion" },
- { 140, "Musikger\344t:" },
- { 141, "Musiklautst\344rke:" },
- { 142, "Alles aus" },
- { 143, "Name:" },
- { 144, "Netzwerk ist aus." },
- { 145, "Netzwerk nicht gestartet (%d)" },
- { 146, "Netzwerk gestartet" },
- { 147, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" },
- { 148, "Niemals" },
- { 149, "Nein" },
- { 150, "Kein Datum gespeichert" },
- { 151, "Keine Musik" },
- { 152, "Keine Spielzeit gespeichert" },
- { 153, "Keine Zeit gespeichert" },
- { 154, "-" },
- { 155, "Normal (keine Skalierung)" },
- { 156, "OK" },
- { 157, "Ausgabefrequenz:" },
- { 158, "Globale MIDI-Einstellungen \374bergehen" },
- { 159, "Globale MIDI-Einstellungen \374bergehen" },
- { 160, "Globale Audioeinstellungen \374bergehen" },
- { 161, "Globale Grafikeinstellungen \374bergehen" },
- { 162, "Globale Lautst\344rke-Einstellungen \374bergehen" },
- { 163, "PC-Lautsprecher-Emulator" },
- { 164, "Passwort:" },
- { 165, "Ung\374ltiges Verzeichnis" },
- { 166, "Pfad ist keine Datei." },
- { 167, "Verzeichnis existiert nicht." },
- { 168, "Pfade" },
- { 169, "Pause" },
- { 170, "Spiel ausw\344hlen:" },
- { 171, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" },
- { 172, "Plattform:" },
- { 173, "Spieldauer: " },
- { 174, "Bitte eine Aktion ausw\344hlen" },
- { 175, "Plugin-Pfad:" },
- { 176, "Standard-Ger\344t:" },
- { 177, "Taste dr\374cken, um sie zuzuweisen" },
- { 178, "Beenden" },
- { 179, "ScummVM beenden" },
- { 180, "Lese-Berechtigung nicht vorhanden" },
- { 181, "Lesefehler aufgetreten" },
- { 182, "Tasten neu zuweisen" },
- { 183, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." },
- { 184, "Render-Modus:" },
- { 185, "Rechts" },
- { 186, "Rechtsklick" },
- { 187, "Rechtsklick" },
- { 188, "Drehen" },
- { 189, "Effektlautst\344rke:" },
- { 190, "SMB" },
- { 191, "Speichern" },
- { 192, "Spielst\344nde:" },
- { 193, "Spielst\344nde: " },
- { 194, "Speichern:" },
- { 195, "Suchlauf abgeschlossen!" },
- { 196, "%d Ordner durchsucht..." },
- { 197, "ScummVM-Hauptmen\374" },
- { 198, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" },
- { 199, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" },
- { 200, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" },
- { 201, "In Spieleliste suchen" },
- { 202, "Suchen:" },
- { 203, "SoundFont ausw\344hlen" },
- { 204, "Thema ausw\344hlen" },
- { 205, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" },
- { 206, "Aktion ausw\344hlen und \"Zuweisen\" klicken" },
- { 207, "Verzeichnis f\374r Oberfl\344chen-Themen" },
- { 208, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" },
- { 209, "Verzeichnis f\374r Erweiterungen ausw\344hlen" },
- { 210, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" },
- { 211, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" },
- { 212, "Verzeichnis mit Spieldateien ausw\344hlen" },
- { 213, "Empfindlichkeit" },
- { 214, "Server:" },
- { 215, "\326ffentliches Verzeichnis:" },
- { 216, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" },
- { 217, "Tastatur zeigen" },
- { 218, "Mauszeiger anzeigen" },
- { 219, "Untertitel anzeigen und Sprachausgabe aktivieren" },
- { 220, "Cursor zeigen/verbergen" },
- { 221, "\334berspringen" },
- { 222, "Zeile \374berspringen" },
- { 223, "Text \374berspringen" },
- { 224, "An Ecken anheften" },
- { 225, "Software-Skalierung (gute Qualit\344t, aber langsamer)" },
- { 226, "Ton ein/aus" },
- { 227, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." },
- { 228, "SoundFont:" },
- { 229, "Spr." },
- { 230, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." },
- { 231, "Lautst\344rke spezieller Soundeffekte" },
- { 232, "Legt das standardm\344\337ige Musikwiedergabe-Ger\344t f\374r General-MIDI-Ausgabe fest." },
- { 233, "Legt das standardm\344\337ige Tonwiedergabe-Ger\344t f\374r die Ausgabe von Roland MT-32/LAPC1/CM32l/CM64 fest." },
- { 234, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." },
- { 235, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." },
- { 236, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." },
- { 237, "Legt das bevorzugte Tonwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." },
- { 238, "Legt fest, wo die Spielst\344nde abgelegt werden." },
- { 239, "Sprache" },
- { 240, "Sprachlautst\344rke:" },
- { 241, "Standard-Renderer (16bpp)" },
- { 242, "Ausgew\344hltes Spiel starten" },
- { 243, "Status:" },
- { 244, "Untert." },
- { 245, "Untertitel-Tempo:" },
- { 246, "Untertitel" },
- { 247, "Figur wechseln" },
- { 248, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" },
- { 249, "Text und Sprache:" },
- { 250, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." },
- { 251, "Themenpfad:" },
- { 252, "Thema:" },
- { 253, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." },
- { 254, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." },
- { 255, "Zeit: " },
- { 256, "Zeit\374berschreitung beim Starten des Netzwerks" },
- { 257, "Zu X-Position gehen" },
- { 258, "Zu Y-Position gehen" },
- { 259, "Touchpad-Modus ausgeschaltet." },
- { 260, "Touchpad-Modus aktiviert." },
- { 261, "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" },
- { 262, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." },
- { 263, "Unbekannt" },
- { 264, "Unbekannter Fehler" },
- { 265, "DVD aush\344ngen" },
- { 266, "SMB aush\344ngen" },
- { 267, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" },
- { 268, "Farbmodus nicht unterst\374tzt" },
- { 269, "Unbenannt" },
- { 270, "Hoch" },
- { 271, "Benutzt MIDI und AdLib zur Sounderzeugung." },
- { 272, "Den Trackpad-Style f\374r Maussteuerung benutzen" },
- { 273, "Benutzername:" },
- { 274, "SDL-Treiber verwenden" },
- { 275, "Vertikale Bildverkleinerung:" },
- { 276, "Video" },
- { 277, "Virtuelle Tastatur" },
- { 278, "Lautst\344rke" },
- { 279, "Windows MIDI" },
- { 280, "Schreib-Berechtigung nicht vorhanden" },
- { 281, "Daten konnten nicht geschrieben werden." },
- { 282, "Ja" },
- { 283, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." },
- { 284, "Zone" },
- { 285, "Hineinzoomen" },
- { 286, "Herauszoomen" },
- { 287, "alle 10 Minuten" },
- { 288, "alle 15 Minuten" },
- { 289, "alle 30 Minuten" },
- { 290, "alle 5 Minuten" },
- { 291, "\334be~r~" },
- { 292, "Spiel ~h~inzuf\374gen" },
- { 293, "~A~bbrechen" },
- { 294, "~S~chlie\337en" },
- { 295, "Spielo~p~tionen" },
- { 296, "~H~ilfe" },
- { 297, "~K~ampfsteuerung f\374r Indiana Jones" },
- { 298, "~T~asten" },
- { 299, "~L~inke-Hand-Modus" },
- { 300, "~L~aden" },
- { 301, "~L~aden..." },
- { 302, "~W~eiter" },
- { 303, "~O~K" },
- { 304, "~O~ptionen" },
- { 305, "~O~ptionen" },
- { 306, "~Z~ur\374ck" },
- { 307, "~B~eenden" },
- { 308, "Spiel ~e~ntfernen" },
- { 309, "~F~ortsetzen" },
- { 310, "Zur Spiele~l~iste zur\374ck" },
- { 311, "~S~peichern" },
- { 312, "~S~tarten" },
- { 313, "\334ber~g~\344nge aktiviert" },
- { 314, "~W~assereffekt aktiviert" },
- { 315, "~Z~ip-Modus aktiviert" },
- { -1, NULL }
-};
-
-struct PoLangEntry {
- const char *lang;
- const char *charset;
- const char *langname;
- const PoMessageEntry *msgs;
-};
-
-const PoLangEntry _translations[] = {
- { "ru_RU", "iso-8859-5", "Russian", _translation_ru_RU },
- { "it_IT", "iso-8859-1", "Italiano", _translation_it_IT },
- { "hu_HU", "cp1250", NULL, _translation_hu_HU },
- { "fr_FR", "iso-8859-1", "Francais", _translation_fr_FR },
- { "uk_UA", "iso-8859-5", "Ukrainian", _translation_uk_UA },
- { "ca_ES", "iso-8859-1", "Catalan", _translation_ca_ES },
- { "es_ES", "iso-8859-1", "Espanol", _translation_es_ES },
- { "de_DE", "iso-8859-1", "Deutsch", _translation_de_DE },
- { NULL, NULL, NULL, NULL }
-};
-
-// code
-
-static const PoMessageEntry *_currentTranslation = NULL;
-static int _currentTranslationMessageEntryCount = 0;
-static const char *_currentTranslationCharset = NULL;
-
-void po2c_setlang(const char *lang) {
- _currentTranslation = NULL;
- _currentTranslationMessageEntryCount = 0;
- _currentTranslationCharset = NULL;
-
- // if lang is NULL or "", deactivate it
- if (lang == NULL || *lang == '\0')
- return;
-
- // searches for a valid language array
- for (int i = 0; _currentTranslation == NULL && _translations[i].lang != NULL; ++i) {
- if (strcmp(lang, _translations[i].lang) == 0) {
- _currentTranslation = _translations[i].msgs;
- _currentTranslationCharset = _translations[i].charset;
- }
- }
-
- // try partial searches
- for (int i = 0; _currentTranslation == NULL && _translations[i].lang != NULL; ++i) {
- if (strncmp(lang, _translations[i].lang, 2) == 0) {
- _currentTranslation = _translations[i].msgs;
- _currentTranslationCharset = _translations[i].charset;
- }
- }
-
- // if found, count entries
- if (_currentTranslation != NULL) {
- for (const PoMessageEntry *m = _currentTranslation; m->msgid != -1; ++m)
- ++_currentTranslationMessageEntryCount;
- }
-}
-
-const char *po2c_gettext(const char *msgid) {
- // if no language is set or msgid is empty, return msgid as is
- if (_currentTranslation == NULL || *msgid == '\0')
- return msgid;
-
- // binary-search for the msgid
- int leftIndex = 0;
- int rightIndex = _currentTranslationMessageEntryCount - 1;
-
- while (rightIndex >= leftIndex) {
- const int midIndex = (leftIndex + rightIndex) / 2;
- const PoMessageEntry * const m = &_currentTranslation[midIndex];
-
- const int compareResult = strcmp(msgid, _messageIds[m->msgid]);
-
- if (compareResult == 0)
- return m->msgstr;
- else if (compareResult < 0)
- rightIndex = midIndex - 1;
- else
- leftIndex = midIndex + 1;
- }
-
- return msgid;
-}
-
-const char *po2c_getcharset(void) {
- if (_currentTranslationCharset)
- return _currentTranslationCharset;
- else
- return "ASCII";
-}
-
-int po2c_getnumlangs(void) {
- return ARRAYSIZE(_translations) - 1;
-}
-
-const char *po2c_getlang(const int num) {
- assert(num < ARRAYSIZE(_translations));
- return _translations[num].lang;
-}
-
-const char *po2c_getlangname(const int num) {
- assert(num < ARRAYSIZE(_translations));
- if (_translations[num].langname != NULL)
- return _translations[num].langname;
- return _translations[num].lang;
-}
diff --git a/common/rational.cpp b/common/rational.cpp
index 6c5d44af84..163044f349 100644
--- a/common/rational.cpp
+++ b/common/rational.cpp
@@ -207,7 +207,7 @@ bool Rational::operator==(int right) const {
}
bool Rational::operator!=(int right) const {
- return (_denom == 1) && (_num != right);
+ return (_denom != 1) || (_num != right);
}
bool Rational::operator>(int right) const {
diff --git a/common/rect.h b/common/rect.h
index dc97dcceec..326f481f3b 100644
--- a/common/rect.h
+++ b/common/rect.h
@@ -90,6 +90,9 @@ struct Rect {
Rect(int16 x1, int16 y1, int16 x2, int16 y2) : top(y1), left(x1), bottom(y2), right(x2) {
assert(isValidRect());
}
+ bool operator==(const Rect &rhs) const { return equals(rhs); }
+ bool operator!=(const Rect &rhs) const { return !equals(rhs); }
+
int16 width() const { return right - left; }
int16 height() const { return bottom - top; }
diff --git a/common/scummsys.h b/common/scummsys.h
index 96639716ea..df8b8e1901 100644
--- a/common/scummsys.h
+++ b/common/scummsys.h
@@ -243,6 +243,13 @@
#define SCUMM_NEED_ALIGNMENT
#endif
+ // Very BAD hack following, used to avoid triggering an assert in uClibc dingux library
+ // "toupper" when pressing keyboard function keys.
+ #if defined(DINGUX)
+ #undef toupper
+ #define toupper(c) (((c & 0xFF) >= 97) && ((c & 0xFF) <= 122) ? ((c & 0xFF) - 32) : (c & 0xFF))
+ #endif
+
#elif defined(__DC__)
#define scumm_stricmp strcasecmp
diff --git a/common/str.cpp b/common/str.cpp
index 744ba46ec7..2961a0c61b 100644
--- a/common/str.cpp
+++ b/common/str.cpp
@@ -30,11 +30,6 @@
#include <stdarg.h>
-#if !defined(__SYMBIAN32__)
-#include <new>
-#endif
-
-
namespace Common {
MemoryPool *g_refCountPool = 0; // FIXME: This is never freed right now
@@ -421,7 +416,7 @@ void String::trim() {
// Trim leading whitespace
char *t = _str;
- while (isspace(*t))
+ while (isspace((unsigned char)*t))
t++;
if (t != _str) {
@@ -626,7 +621,7 @@ Common::String lastPathComponent(const Common::String &path, const char sep) {
// Now scan the whole component
const char *first = last - 1;
- while (first >= str && *first != sep)
+ while (first > str && *first != sep)
--first;
if (*first == sep)
diff --git a/common/stream.cpp b/common/stream.cpp
index 84b712a562..718c806ff3 100644
--- a/common/stream.cpp
+++ b/common/stream.cpp
@@ -226,17 +226,26 @@ BufferedReadStream::BufferedReadStream(ReadStream *parentStream, uint32 bufSize,
: _parentStream(parentStream),
_disposeParentStream(disposeParentStream),
_pos(0),
+ _eos(false),
_bufSize(0),
_realBufSize(bufSize) {
assert(parentStream);
- _buf = new byte[bufSize];
+ allocBuf(bufSize);
assert(_buf);
}
+void BufferedReadStream::allocBuf(uint32 bufSize) {
+ _buf = new byte[bufSize];
+}
+
BufferedReadStream::~BufferedReadStream() {
if (_disposeParentStream)
delete _parentStream;
+ deallocBuf();
+}
+
+void BufferedReadStream::deallocBuf() {
delete[] _buf;
}
@@ -259,8 +268,12 @@ uint32 BufferedReadStream::read(void *dataPtr, uint32 dataSize) {
// At this point the buffer is empty. Now if the read request
// exceeds the buffer size, just satisfy it directly.
- if (dataSize > _bufSize)
- return alreadyRead + _parentStream->read(dataPtr, dataSize);
+ if (dataSize > _realBufSize) {
+ uint32 n = _parentStream->read(dataPtr, dataSize);
+ if (_parentStream->eos())
+ _eos = true;
+ return alreadyRead + n;
+ }
// Refill the buffer.
// If we didn't read as many bytes as requested, the reason
@@ -269,13 +282,19 @@ uint32 BufferedReadStream::read(void *dataPtr, uint32 dataSize) {
// return to the caller.
_bufSize = _parentStream->read(_buf, _realBufSize);
_pos = 0;
- if (dataSize > _bufSize)
+ if (_bufSize < dataSize) {
+ // we didn't get enough data from parent
+ if (_parentStream->eos())
+ _eos = true;
dataSize = _bufSize;
+ }
}
- // Satisfy the request from the buffer
- memcpy(dataPtr, _buf + _pos, dataSize);
- _pos += dataSize;
+ if (dataSize) {
+ // Satisfy the request from the buffer
+ memcpy(dataPtr, _buf + _pos, dataSize);
+ _pos += dataSize;
+ }
return alreadyRead + dataSize;
}
@@ -289,18 +308,84 @@ bool BufferedSeekableReadStream::seek(int32 offset, int whence) {
// in the buffer only.
// Note: We could try to handle SEEK_END and SEEK_SET, too, but
// since they are rarely used, it seems not worth the effort.
+ _eos = false; // seeking always cancels EOS
+
if (whence == SEEK_CUR && (int)_pos + offset >= 0 && _pos + offset <= _bufSize) {
_pos += offset;
+
+ // Note: we do not need to reset parent's eos flag here. It is
+ // sufficient that it is reset when actually seeking in the parent.
} else {
// Seek was not local enough, so we reset the buffer and
- // just seeks normally in the parent stream.
+ // just seek normally in the parent stream.
if (whence == SEEK_CUR)
offset -= (_bufSize - _pos);
_pos = _bufSize;
_parentStream->seek(offset, whence);
}
- return true; // FIXME: STREAM REWRITE
+ return true;
+}
+
+BufferedWriteStream::BufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream)
+ : _parentStream(parentStream),
+ _disposeParentStream(disposeParentStream),
+ _pos(0),
+ _bufSize(bufSize) {
+
+ assert(parentStream);
+ allocBuf(bufSize);
+ assert(_buf);
+}
+
+BufferedWriteStream::~BufferedWriteStream() {
+ assert(flush());
+
+ if (_disposeParentStream)
+ delete _parentStream;
+
+ deallocBuf();
+}
+
+void BufferedWriteStream::allocBuf(uint32 bufSize) {
+ _buf = new byte[bufSize];
+}
+
+void BufferedWriteStream::deallocBuf() {
+ delete[] _buf;
+}
+
+uint32 BufferedWriteStream::write(const void *dataPtr, uint32 dataSize) {
+ // check if we have enough space for writing to the buffer
+ if (_bufSize - _pos >= dataSize) {
+ memcpy(_buf + _pos, dataPtr, dataSize);
+ _pos += dataSize;
+ } else if (_bufSize >= dataSize) { // check if we can flush the buffer and load the data
+ // flush the buffer
+ assert(flushBuffer());
+ memcpy(_buf, dataPtr, dataSize);
+ _pos += dataSize;
+ } else { // too big for our buffer
+ // flush the buffer
+ assert(flushBuffer());
+ return _parentStream->write(dataPtr, dataSize);
+ }
+ return dataSize;
+}
+
+bool BufferedWriteStream::flushBuffer() {
+ uint32 bytesToWrite = _pos;
+
+ if (bytesToWrite) {
+ _pos = 0;
+ if (_parentStream->write(_buf, bytesToWrite) != bytesToWrite)
+ return false;
+ }
+ return true;
+}
+
+bool BufferedWriteStream::flush() {
+ return flushBuffer();
}
bool MemoryWriteStreamDynamic::seek(int32 offs, int whence) {
diff --git a/common/stream.h b/common/stream.h
index 5e0d7149b0..4d673d1539 100644
--- a/common/stream.h
+++ b/common/stream.h
@@ -149,7 +149,6 @@ public:
void writeString(const String &str);
};
-
/**
* Generic interface for a readable data stream.
*/
@@ -495,16 +494,19 @@ protected:
DisposeAfterUse::Flag _disposeParentStream;
byte *_buf;
uint32 _pos;
+ bool _eos; // end of stream
uint32 _bufSize;
uint32 _realBufSize;
+ virtual void allocBuf(uint32 bufSize); // virtual functions to allocate/deallocate the buffer
+ virtual void deallocBuf();
public:
BufferedReadStream(ReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO);
- ~BufferedReadStream();
+ virtual ~BufferedReadStream();
- virtual bool eos() const { return (_pos == _bufSize) && _parentStream->eos(); }
+ virtual bool eos() const { return _eos; }
virtual bool err() const { return _parentStream->err(); }
- virtual void clearErr() { _parentStream->clearErr(); }
+ virtual void clearErr() { _eos = false; _parentStream->clearErr(); }
virtual uint32 read(void *dataPtr, uint32 dataSize);
};
@@ -525,7 +527,27 @@ public:
virtual bool seek(int32 offset, int whence = SEEK_SET);
};
+/**
+ * Wrapper class which adds buffering to any WriteStream.
+ */
+class BufferedWriteStream : public WriteStream {
+protected:
+ WriteStream *_parentStream;
+ DisposeAfterUse::Flag _disposeParentStream;
+ byte *_buf;
+ uint32 _pos;
+ uint32 _bufSize;
+ bool flushBuffer(); // write out the data in the buffer
+ virtual void allocBuf(uint32 bufSize); // virtual functions to allocate/deallocate the buffer
+ virtual void deallocBuf();
+public:
+ BufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO);
+ virtual ~BufferedWriteStream();
+
+ virtual uint32 write(const void *dataPtr, uint32 dataSize);
+ virtual bool flush();
+};
/**
* Simple memory based 'stream', which implements the ReadStream interface for
diff --git a/common/translation.cpp b/common/translation.cpp
index b52aad0d1f..1328ed62d2 100644
--- a/common/translation.cpp
+++ b/common/translation.cpp
@@ -29,7 +29,11 @@
#undef ARRAYSIZE
#endif
+#define TRANSLATIONS_DAT_VER 2
+
#include "translation.h"
+#include "common/archive.h"
+#include "common/config-manager.h"
DECLARE_SINGLETON(Common::TranslationManager)
@@ -39,18 +43,19 @@ DECLARE_SINGLETON(Common::TranslationManager)
#endif // !WIN32
#endif
-#ifdef USE_TRANSLATION
-#include "messages.cpp"
-#endif
-
namespace Common {
+bool operator<(const TLanguage &l, const TLanguage &r) {
+ return strcmp(l.name, r.name) < 0;
+}
#ifdef USE_TRANSLATION
// Translation enabled
-TranslationManager::TranslationManager() {
+TranslationManager::TranslationManager() : _currentLang(-1) {
+ loadTranslationsInfoDat();
+
#ifdef USE_DETECTLANG
#ifdef WIN32
// We can not use "setlocale" (at least not for MSVC builds), since it
@@ -120,50 +125,124 @@ TranslationManager::~TranslationManager() {
}
void TranslationManager::setLanguage(const char *lang) {
- if (*lang == '\0')
- po2c_setlang(_syslang.c_str());
- else
- po2c_setlang(lang);
+ // Get lang index
+ int langIndex = -1;
+ String langStr(lang);
+ if (langStr.empty())
+ langStr = _syslang;
+
+ // Searching for a valid language
+ for (unsigned int i = 0; i < _langs.size() && langIndex == -1; ++i) {
+ if (langStr == _langs[i])
+ langIndex = i;
+ }
+
+ // Try partial match
+ for (unsigned int i = 0; i < _langs.size() && langIndex == -1; ++i) {
+ if (strncmp(langStr.c_str(), _langs[i].c_str(), 2) == 0)
+ langIndex = i;
+ }
+
+ // Load messages for that lang
+ // Call it even if the index is -1 to unload previously loaded translations
+ if (langIndex != _currentLang) {
+ loadLanguageDat(langIndex);
+ _currentLang = langIndex;
+ }
}
const char *TranslationManager::getTranslation(const char *message) {
- return po2c_gettext(message);
+ return getTranslation(message, NULL);
+}
+
+const char *TranslationManager::getTranslation(const char *message, const char *context) {
+ // if no language is set or message is empty, return msgid as is
+ if (_currentTranslationMessages.empty() || *message == '\0')
+ return message;
+
+ // binary-search for the msgid
+ int leftIndex = 0;
+ int rightIndex = _currentTranslationMessages.size() - 1;
+
+ while (rightIndex >= leftIndex) {
+ const int midIndex = (leftIndex + rightIndex) / 2;
+ const PoMessageEntry *const m = &_currentTranslationMessages[midIndex];
+
+ int compareResult = strcmp(message, _messageIds[m->msgid].c_str());
+
+ if (compareResult == 0) {
+ // Get the range of messages with the same ID (but different context)
+ leftIndex = rightIndex = midIndex;
+ while (
+ leftIndex > 0 &&
+ _currentTranslationMessages[leftIndex - 1].msgid == m->msgid
+ ) {
+ --leftIndex;
+ }
+ while (
+ rightIndex < (int)_currentTranslationMessages.size() - 1 &&
+ _currentTranslationMessages[rightIndex + 1].msgid == m->msgid
+ ) {
+ ++rightIndex;
+ }
+ // Find the context we want
+ if (context == NULL || *context == '\0' || leftIndex == rightIndex)
+ return _currentTranslationMessages[leftIndex].msgstr.c_str();
+ // We could use again binary search, but there should be only a small number of contexts.
+ while (rightIndex > leftIndex) {
+ compareResult = strcmp(context, _currentTranslationMessages[rightIndex].msgctxt.c_str());
+ if (compareResult == 0)
+ return _currentTranslationMessages[rightIndex].msgstr.c_str();
+ else if (compareResult > 0)
+ break;
+ --rightIndex;
+ }
+ return _currentTranslationMessages[leftIndex].msgstr.c_str();
+ } else if (compareResult < 0)
+ rightIndex = midIndex - 1;
+ else
+ leftIndex = midIndex + 1;
+ }
+
+ return message;
}
const char *TranslationManager::getCurrentCharset() {
- return po2c_getcharset();
+ if (_currentCharset.empty())
+ return "ASCII";
+ return _currentCharset.c_str();
}
String TranslationManager::getTranslation(const String &message) {
- return po2c_gettext(message.c_str());
+ return getTranslation(message.c_str());
+}
+
+String TranslationManager::getTranslation(const String &message, const String &context) {
+ return getTranslation(message.c_str(), context.c_str());
}
const TLangArray TranslationManager::getSupportedLanguageNames() const {
TLangArray languages;
- int total = po2c_getnumlangs();
- for (int i = 0; i < total; i++) {
- TLanguage lng(po2c_getlangname(i), i + 1);
+ for (unsigned int i = 0; i < _langNames.size(); i++) {
+ TLanguage lng(_langNames[i].c_str(), i + 1);
languages.push_back(lng);
}
- //sort(languages.begin(), languages.end());
+ sort(languages.begin(), languages.end());
return languages;
}
int TranslationManager::parseLanguage(const String lang) {
- int total = po2c_getnumlangs();
-
- for (int i = 0; i < total; i++) {
- if (lang == po2c_getlang(i))
+ for (unsigned int i = 0; i < _langs.size(); i++) {
+ if (lang == _langs[i])
return i + 1;
}
return kTranslationBuiltinId;
}
-
const char *TranslationManager::getLangById(int id) {
switch (id) {
case kTranslationAutodetectId:
@@ -171,8 +250,8 @@ const char *TranslationManager::getLangById(int id) {
case kTranslationBuiltinId:
return "C";
default:
- if (id >= 0 && id - 1 < po2c_getnumlangs())
- return po2c_getlang(id - 1);
+ if (id >= 0 && id - 1 < (int)_langs.size())
+ return _langs[id - 1].c_str();
}
// In case an invalid ID was specified, we will output a warning
@@ -181,6 +260,175 @@ const char *TranslationManager::getLangById(int id) {
return "";
}
+bool TranslationManager::openTranslationsFile(File& inFile) {
+ // First try to open it directly (i.e. using the SearchMan).
+ if (inFile.open("translations.dat"))
+ return true;
+
+ // Then look in the Themepath if we can find the file.
+ if (ConfMan.hasKey("themepath"))
+ return openTranslationsFile(FSNode(ConfMan.get("themepath")), inFile);
+
+ return false;
+}
+
+bool TranslationManager::openTranslationsFile(const FSNode &node, File& inFile, int depth) {
+ if (!node.exists() || !node.isReadable() || !node.isDirectory())
+ return false;
+
+ // Check if we can find the file in this directory
+ // Since File::open(FSNode) makes all the needed tests, it is not really
+ // necessary to make them here. But it avoid printing warnings.
+ FSNode fileNode = node.getChild("translations.dat");
+ if (fileNode.exists() && fileNode.isReadable() && !fileNode.isDirectory()) {
+ if (inFile.open(fileNode))
+ return true;
+ }
+
+ // Check if we exceeded the given recursion depth
+ if (depth - 1 == -1)
+ return false;
+
+ // Otherwise look for it in sub-directories
+ FSList fileList;
+ if (!node.getChildren(fileList, FSNode::kListDirectoriesOnly))
+ return false;
+
+ for (FSList::iterator i = fileList.begin(); i != fileList.end(); ++i) {
+ if (openTranslationsFile(*i, inFile, depth == -1 ? - 1 : depth - 1))
+ return true;
+ }
+
+ // Not found in this directory or its sub-directories
+ return false;
+}
+
+void TranslationManager::loadTranslationsInfoDat() {
+ File in;
+ if (!openTranslationsFile(in)) {
+ warning("You are missing the 'translations.dat' file. GUI translation will not be available");
+ return;
+ }
+
+ if (!checkHeader(in))
+ return;
+
+ char buf[256];
+ int len;
+
+ // Get number of translations
+ int nbTranslations = in.readUint16BE();
+
+ // Skip all the block sizes
+ for (int i = 0; i < nbTranslations + 2; ++i)
+ in.readUint16BE();
+
+ // Read list of languages
+ _langs.resize(nbTranslations);
+ _langNames.resize(nbTranslations);
+ for (int i = 0; i < nbTranslations; ++i) {
+ len = in.readUint16BE();
+ in.read(buf, len);
+ _langs[i] = String(buf, len);
+ len = in.readUint16BE();
+ in.read(buf, len);
+ _langNames[i] = String(buf, len);
+ }
+
+ // Read messages
+ int numMessages = in.readUint16BE();
+ _messageIds.resize(numMessages);
+ for (int i = 0; i < numMessages; ++i) {
+ len = in.readUint16BE();
+ in.read(buf, len);
+ _messageIds[i] = String(buf, len);
+ }
+}
+
+void TranslationManager::loadLanguageDat(int index) {
+ _currentTranslationMessages.clear();
+ _currentCharset.clear();
+ // Sanity check
+ if (index < 0 || index >= (int)_langs.size()) {
+ if (index != -1)
+ warning("Invalid language index %d passed to TranslationManager::loadLanguageDat", index);
+ return;
+ }
+
+ File in;
+ if (!openTranslationsFile(in))
+ return;
+
+ if (!checkHeader(in))
+ return;
+
+ char buf[1024];
+ int len;
+
+ // Get number of translations
+ int nbTranslations = in.readUint16BE();
+ if (nbTranslations != (int)_langs.size()) {
+ warning("The 'translations.dat' file has changed since starting ScummVM. GUI translation will not be available");
+ return;
+ }
+
+ // Get size of blocks to skip.
+ int skipSize = 0;
+ for (int i = 0; i < index + 2; ++i)
+ skipSize += in.readUint16BE();
+ // We also need to skip the remaining block sizes
+ skipSize += 2 * (nbTranslations - index);
+
+ // Seek to start of block we want to read
+ in.seek(skipSize, SEEK_CUR);
+
+ // Read number of translated messages
+ int nbMessages = in.readUint16BE();
+ _currentTranslationMessages.resize(nbMessages);
+
+ // Read charset
+ len = in.readUint16BE();
+ in.read(buf, len);
+ _currentCharset = String(buf, len);
+
+ // Read messages
+ for (int i = 0; i < nbMessages; ++i) {
+ _currentTranslationMessages[i].msgid = in.readUint16BE();
+ len = in.readUint16BE();
+ in.read(buf, len);
+ _currentTranslationMessages[i].msgstr = String(buf, len);
+ len = in.readUint16BE();
+ if (len > 0) {
+ in.read(buf, len);
+ _currentTranslationMessages[i].msgctxt = String(buf, len);
+ }
+ }
+}
+
+bool TranslationManager::checkHeader(File &in) {
+ char buf[13];
+ int ver;
+
+ in.read(buf, 12);
+ buf[12] = '\0';
+
+ // Check header
+ if (strcmp(buf, "TRANSLATIONS")) {
+ warning("Your 'translations.dat' file is corrupt. GUI translation will not be available");
+ return false;
+ }
+
+ // Check version
+ ver = in.readByte();
+
+ if (ver != TRANSLATIONS_DAT_VER) {
+ warning("Your 'translations.dat' file has a mismatching version, expected was %d but you got %d. GUI translation will not be available", TRANSLATIONS_DAT_VER, ver);
+ return false;
+ }
+
+ return true;
+}
+
#else // USE_TRANSLATION
// Translation disabled
@@ -208,10 +456,23 @@ String TranslationManager::getTranslation(const String &message) {
return message;
}
+const char *TranslationManager::getTranslation(const char *message, const char *) {
+ return message;
+}
+
+String TranslationManager::getTranslation(const String &message, const String &) {
+ return message;
+}
+
const TLangArray TranslationManager::getSupportedLanguageNames() const {
return TLangArray();
}
+
+const char *TranslationManager::getCurrentCharset() {
+ return "ASCII";
+}
#endif // USE_TRANSLATION
-} // End of namespace Common
+} // End of namespace Common
+
diff --git a/common/translation.h b/common/translation.h
index ccdd0f3500..57c4cc2ac8 100644
--- a/common/translation.h
+++ b/common/translation.h
@@ -27,6 +27,8 @@
#include "common/singleton.h"
#include "common/str-array.h"
+#include "common/file.h"
+#include "common/fs.h"
namespace Common {
@@ -39,19 +41,20 @@ struct TLanguage {
const char *name;
int id;
- TLanguage() {
- name = 0;
- id = 0;
- }
-
- TLanguage(const char *n, int i) {
- name = n;
- id = i;
- }
+ TLanguage() : name(0), id(0) {}
+ TLanguage(const char *n, int i) : name(n), id(i) {}
};
+bool operator<(const TLanguage &l, const TLanguage &r);
+
typedef Array<TLanguage> TLangArray;
+struct PoMessageEntry {
+ int msgid;
+ String msgctxt;
+ String msgstr;
+};
+
/**
* Message translation manager.
*/
@@ -113,6 +116,28 @@ public:
* it returns the original untranslated message.
*/
String getTranslation(const String &message);
+
+ /**
+ * Returns the translation into the current language of the parameter
+ * message. In case the message isn't found in the translation catalog,
+ * it returns the original untranslated message.
+ *
+ * If a translation is found for the given context it will return that
+ * translation, otherwise it will look for a translation for the same
+ * massage without a context or with a different context.
+ */
+ const char *getTranslation(const char *message, const char *context);
+
+ /**
+ * Returns the translation into the current language of the parameter
+ * message. In case the message isn't found in the translation catalog,
+ * it returns the original untranslated message.
+ *
+ * If a translation is found for the given context it will return that
+ * translation, otherwise it will look for a translation for the same
+ * massage without a context or with a different context.
+ */
+ String getTranslation(const String &message, const String &context);
/**
* Returns a list of supported languages.
@@ -127,7 +152,46 @@ public:
const char *getCurrentCharset();
private:
- Common::String _syslang;
+#ifdef USE_TRANSLATION
+ /**
+ * Find the translations.dat file. It looks first using the SearchMan and
+ * then if needed using the Themepath. If found it opens the given File
+ * to read the translations.dat file.
+ */
+ bool openTranslationsFile(File&);
+
+ /**
+ * Find the translations.dat file in the given directory node.
+ * If found it opens the given File to read the translations.dat file.
+ */
+ bool openTranslationsFile(const FSNode &node, File&, int depth = -1);
+
+ /**
+ * Load the list of languages from the translations.dat file
+ */
+ void loadTranslationsInfoDat();
+
+ /**
+ * Load the translation for the given language from the translations.dat file
+ *
+ * @param index of the language in the list of languages
+ */
+ void loadLanguageDat(int index);
+
+ /**
+ * Check the header of the given file to make sure it is a valid translations data file.
+ */
+ bool checkHeader(File &in);
+
+ String _syslang;
+ StringArray _langs;
+ StringArray _langNames;
+
+ StringArray _messageIds;
+ Array<PoMessageEntry> _currentTranslationMessages;
+ String _currentCharset;
+ int _currentLang;
+#endif
};
} // End of namespace Common
@@ -136,10 +200,14 @@ private:
#ifdef USE_TRANSLATION
#define _(str) TransMan.getTranslation(str)
+#define _c(str, context) TransMan.getTranslation(str, context)
#else
#define _(str) str
+#define _c(str, context) str
#endif
#define _s(str) str
+#define _sc(str, ctxt) str
+#define DECLARE_TRANSLATION_ADDITIONAL_CONTEXT(str, ctxt)
#endif
diff --git a/common/unzip.cpp b/common/unzip.cpp
index a29518a796..6df2ed4848 100644
--- a/common/unzip.cpp
+++ b/common/unzip.cpp
@@ -107,6 +107,9 @@ typedef struct {
#include "common/unzip.h"
#include "common/file.h"
+#include "common/hashmap.h"
+#include "common/hash-str.h"
+
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
/* like the STRICT of WIN32, we define a pointer that cannot be converted
from (void*) without cast */
@@ -362,6 +365,16 @@ typedef struct {
uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
} file_in_zip_read_info_s;
+typedef struct {
+ uLong num_file; /* number of the current file in the zipfile*/
+ uLong pos_in_central_dir; /* pos of the current file in the central dir*/
+ uLong current_file_ok; /* flag about the usability of the current file*/
+ unz_file_info cur_file_info; /* public info about the current file in zip*/
+ unz_file_info_internal cur_file_info_internal; /* private info about it*/
+} cached_file_in_zip;
+
+typedef Common::HashMap<Common::String, cached_file_in_zip, Common::IgnoreCase_Hash,
+ Common::IgnoreCase_EqualTo> ZipHash;
/* unz_s contain internal information about the zipfile
*/
@@ -382,6 +395,7 @@ typedef struct {
unz_file_info_internal cur_file_info_internal; /* private info about it*/
file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
file if we are decompressing it */
+ ZipHash _hash;
} unz_s;
/* ===========================================================================
@@ -589,7 +603,27 @@ unzFile unzOpen(Common::SeekableReadStream *stream) {
us->central_pos = central_pos;
us->pfile_in_zip_read = NULL;
- unzGoToFirstFile((unzFile)us);
+ err = unzGoToFirstFile((unzFile)us);
+
+ while (err == UNZ_OK) {
+ // Get the file details
+ char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
+ unzGetCurrentFileInfo(us, NULL, szCurrentFileName, sizeof(szCurrentFileName) - 1,
+ NULL, 0, NULL, 0);
+
+ // Save details into the hash
+ cached_file_in_zip fe;
+ fe.num_file = us->num_file;
+ fe.pos_in_central_dir = us->pos_in_central_dir;
+ fe.current_file_ok = us->current_file_ok;
+ fe.cur_file_info = us->cur_file_info;
+ fe.cur_file_info_internal = us->cur_file_info_internal;
+
+ us->_hash[Common::String(szCurrentFileName)] = fe;
+
+ // Move to the next file
+ err = unzGoToNextFile((unzFile)us);
+ }
return (unzFile)us;
}
@@ -870,7 +904,6 @@ int unzGoToNextFile(unzFile file) {
return err;
}
-
/*
Try locate the file szFileName in the zipfile.
For the iCaseSensitivity signification, see unzipStringFileNameCompare
@@ -881,12 +914,6 @@ int unzGoToNextFile(unzFile file) {
*/
int unzLocateFile(unzFile file, const char *szFileName, int iCaseSensitivity) {
unz_s* s;
- int err;
-
-
- uLong num_fileSaved;
- uLong pos_in_central_dirSaved;
-
if (file==NULL)
return UNZ_PARAMERROR;
@@ -898,25 +925,20 @@ int unzLocateFile(unzFile file, const char *szFileName, int iCaseSensitivity) {
if (!s->current_file_ok)
return UNZ_END_OF_LIST_OF_FILE;
- num_fileSaved = s->num_file;
- pos_in_central_dirSaved = s->pos_in_central_dir;
-
- err = unzGoToFirstFile(file);
+ // Check to see if the entry exists
+ ZipHash::iterator i = s->_hash.find(Common::String(szFileName));
+ if (i == s->_hash.end())
+ return UNZ_END_OF_LIST_OF_FILE;
- while (err == UNZ_OK) {
- char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
- unzGetCurrentFileInfo(file,NULL,
- szCurrentFileName,sizeof(szCurrentFileName)-1,
- NULL,0,NULL,0);
- if (unzStringFileNameCompare(szCurrentFileName,
- szFileName,iCaseSensitivity)==0)
- return UNZ_OK;
- err = unzGoToNextFile(file);
- }
+ // Found it, so reset the details in the main structure
+ cached_file_in_zip &fe = i->_value;
+ s->num_file = fe.num_file;
+ s->pos_in_central_dir = fe.pos_in_central_dir;
+ s->current_file_ok = fe.current_file_ok;
+ s->cur_file_info = fe.cur_file_info;
+ s->cur_file_info_internal = fe.cur_file_info_internal;
- s->num_file = num_fileSaved ;
- s->pos_in_central_dir = pos_in_central_dirSaved ;
- return err;
+ return UNZ_OK;
}
diff --git a/common/util.cpp b/common/util.cpp
index 9e36e0f161..2fffdca8a6 100644
--- a/common/util.cpp
+++ b/common/util.cpp
@@ -259,6 +259,9 @@ const RenderModeDescription g_renderModes[] = {
{0, 0, kRenderDefault}
};
+DECLARE_TRANSLATION_ADDITIONAL_CONTEXT("Hercules Green", "lowres")
+DECLARE_TRANSLATION_ADDITIONAL_CONTEXT("Hercules Amber", "lowres")
+
RenderMode parseRenderMode(const String &str) {
if (str.empty())
return kRenderDefault;
@@ -306,6 +309,9 @@ const struct GameOpt {
{ GUIO_MIDICMS, "midiCMS" },
{ GUIO_MIDIPCJR, "midiPCJr" },
{ GUIO_MIDIADLIB, "midiAdLib" },
+ { GUIO_MIDIC64, "midiC64" },
+ { GUIO_MIDIAMIGA, "midiAmiga" },
+ { GUIO_MIDIAPPLEIIGS,"midiAppleIIgs" },
{ GUIO_MIDITOWNS, "midiTowns" },
{ GUIO_MIDIPC98, "midiPC98" },
{ GUIO_MIDIMT32, "midiMt32" },
diff --git a/common/util.h b/common/util.h
index 7a9cf4fb2d..52e4295bbb 100644
--- a/common/util.h
+++ b/common/util.h
@@ -223,10 +223,13 @@ enum GameGUIOption {
GUIO_MIDICMS = (1 << 7),
GUIO_MIDIPCJR = (1 << 8),
GUIO_MIDIADLIB = (1 << 9),
- GUIO_MIDITOWNS = (1 << 10),
- GUIO_MIDIPC98 = (1 << 11),
- GUIO_MIDIMT32 = (1 << 12),
- GUIO_MIDIGM = (1 << 13)
+ GUIO_MIDIC64 = (1 << 10),
+ GUIO_MIDIAMIGA = (1 << 11),
+ GUIO_MIDIAPPLEIIGS = (1 << 12),
+ GUIO_MIDITOWNS = (1 << 13),
+ GUIO_MIDIPC98 = (1 << 14),
+ GUIO_MIDIMT32 = (1 << 15),
+ GUIO_MIDIGM = (1 << 16)
};
bool checkGameGUIOption(GameGUIOption option, const String &str);
diff --git a/configure b/configure
index f3eb9a268d..3f17cb848b 100755
--- a/configure
+++ b/configure
@@ -88,6 +88,7 @@ add_engine drascula "Drascula: The Vampire Strikes Back" yes
add_engine gob "Gobli*ns" yes
add_engine groovie "Groovie" yes "groovie2"
add_engine groovie2 "Groovie 2 games" no
+add_engine hugo "Hugo Trilogy" no
add_engine kyra "Legend of Kyrandia" yes "lol"
add_engine lol "Lands of Lore" no
add_engine lure "Lure of the Temptress" yes
@@ -135,6 +136,7 @@ _build_hq_scalers=yes
_indeo3=auto
_enable_prof=no
_unix=no
+_global_constructors=no
# Default vkeybd/keymapper options
_vkeybd=no
_keymapper=no
@@ -362,6 +364,9 @@ get_system_exe_extension() {
arm-riscos)
_exeext=",ff8"
;;
+ caanoo-linux)
+ _exeext=".caanoo"
+ ;;
dreamcast | ds | gamecube | n64 | ps2 | psp | wii)
_exeext=".elf"
;;
@@ -645,7 +650,7 @@ Usage: $0 [OPTIONS]...
Configuration:
-h, --help display this help and exit
- --backend=BACKEND backend to build (dc, gp2x, gp2xwiz, iphone,
+ --backend=BACKEND backend to build (caanoo, dc, gp2x, gp2xwiz, iphone,
linuxmoto, ds, null, ps2, psp, sdl, wii, wince)
[sdl]
@@ -930,6 +935,16 @@ arm-riscos)
_host_os=riscos
_host_cpu=arm
;;
+caanoo)
+ _host_os=caanoo-linux
+ _host_cpu=arm
+ _host_alias=arm-none-linux-gnueabi
+ ;;
+dingux)
+ _host_os=linux
+ _host_cpu=mipsel
+ _host_alias=mipsel-linux
+ ;;
dreamcast)
_host_os=dreamcast
_host_cpu=sh
@@ -1263,6 +1278,17 @@ if test "$cxx_verc_fail" = yes ; then
exit 1
fi
+echocheck "whether -Wglobal-constructors work"
+cat > $TMPC << EOF
+int main() { return 0; }
+EOF
+cc_check -Wglobal-constructors && _global_constructors=yes
+
+if test "$_global_constructors" = yes; then
+ CXXFLAGS="$CXXFLAGS -Wglobal-constructors"
+fi
+echo $_global_constructors
+
#
# Check for endianness
#
@@ -1455,7 +1481,7 @@ case $_host_os in
_unix=yes
;;
n64)
- DEFINES="$DEFINES -D__N64__ -DLIMIT_FPS -DNONSTANDARD_PORT"
+ DEFINES="$DEFINES -D__N64__ -DLIMIT_FPS -DNONSTANDARD_PORT"
DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_COMMAND_LINE"
DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU"
;;
@@ -1533,10 +1559,43 @@ if test -n "$_host"; then
bfin*)
_need_memalign=yes
;;
+ caanoo)
+ DEFINES="$DEFINES -DGP2XWIZ -DCAANOO -DNDEBUG"
+ CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s"
+ ASFLAGS="$ASFLAGS"
+ _unix=yes
+ _need_memalign=yes
+ add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
+ add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
+ add_line_to_config_mk 'USE_ARM_GFX_ASM = 1'
+ add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1'
+ add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1'
+ _backend="gp2xwiz"
+ _build_hq_scalers=no
+ _mt32emu=no
+ _vkeybd=yes
+ _seq_midi=no
+ _port_mk="backends/platform/gp2xwiz/caanoo/caanoo-bundle.mk"
+ ;;
*darwin*)
_ranlib=$_host-ranlib
_strip=$_host-strip
;;
+ dingux)
+ DEFINES="$DEFINES -DUNIX -DDINGUX -DDISABLE_DOSBOX_OPL"
+ ASFLAGS="$ASFLAGS"
+ CXXFLAGS="$CXXFLAGS -msoft-float -mips32"
+ _need_memalign=yes
+ _backend="dingux"
+ _mt32emu=no
+ _vkeybd=yes
+ _build_hq_scalers=no
+ _keymapper=no
+ # Force disable vorbis on dingux, it has terrible performance compared to tremor
+ _vorbis=no
+ # Force disable seq on dingux, no way to use it and it would get enabled by default with configure
+ _seq_midi=no
+ ;;
dreamcast)
DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE"
CXXFLAGS="$CXXFLAGS -O3 -funroll-loops -fschedule-insns2 -fomit-frame-pointer -fdelete-null-pointer-checks"
@@ -1692,7 +1751,6 @@ if test -n "$_host"; then
_backend="n64"
_need_memalign=yes
_mt32emu=no
- _vkeybd=yes
_build_scalers=no
_indeo3=no
_translation=no
@@ -1856,7 +1914,7 @@ fi
# Enable 16bit support only for backends which support it
#
case $_backend in
- dreamcast | samsungtv | sdl | wii | psp)
+ dreamcast | dingux | samsungtv | sdl | wii | psp)
if test "$_16bit" = auto ; then
_16bit=yes
else
@@ -1996,24 +2054,6 @@ PRE_OBJS_FLAGS := -Wl,--whole-archive
POST_OBJS_FLAGS := -Wl,--no-whole-archive
'
;;
- gp2xwiz*)
-_def_plugin='
-#define PLUGIN_PREFIX ""
-#define PLUGIN_SUFFIX ".plugin"
-'
-_mak_plugins='
-DYNAMIC_MODULES := 1
-PLUGIN_PREFIX :=
-PLUGIN_SUFFIX := .plugin
-PLUGIN_EXTRA_DEPS = $(EXECUTABLE)
-CXXFLAGS += -DDYNAMIC_MODULES
-CXXFLAGS += -fpic
-PLUGIN_LDFLAGS += -shared
-PRE_OBJS_FLAGS := -Wl,-export-dynamic -Wl,-whole-archive
-POST_OBJS_FLAGS := -Wl,-no-whole-archive
-LIBS += -ldl
-'
- ;;
linux*|android)
_def_plugin='
#define PLUGIN_PREFIX "lib"
@@ -2579,11 +2619,26 @@ case $_backend in
add_line_to_config_mk 'PLUGIN_LDFLAGS += -Lbuild.tmp -lscummvm'
add_line_to_config_mk 'PLUGIN_EXTRA_DEPS += build.tmp/libscummvm.so'
;;
+ caanoo)
+ find_sdlconfig
+ INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`"
+ LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`"
+ LDFLAGS="$LDFLAGS"
+ CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s"
+ ;;
dc)
INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/dc -isystem $(ronindir)/include'
LDFLAGS="$LDFLAGS -Wl,-Ttext,0x8c010000 -nostartfiles "'$(ronindir)/lib/crt0.o -L$(ronindir)/lib'
LIBS="$LIBS -lronin -lm"
;;
+ dingux)
+ find_sdlconfig
+ INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`"
+ LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`"
+ DEFINES="$DEFINES -DSDL_BACKEND -DDINGUX"
+ LDFLAGS="$LDFLAGS "
+ MODULES="$MODULES backends/platform/sdl"
+ ;;
ds)
# TODO ds
INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source'
diff --git a/dists/devcpp/agos.dev b/dists/devcpp/agos.dev
deleted file mode 100644
index 9c5c04f0be..0000000000
--- a/dists/devcpp/agos.dev
+++ /dev/null
@@ -1,309 +0,0 @@
-[Project]
-FileName=agos.dev
-Name=agos
-UnitCount=26
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=agos
-ObjectOutput=agos
-OverrideOutput=0
-OverrideOutputName=agos.a
-HostApplication=
-Folders=
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\agos\charset.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\agos\cursor.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\agos\debug.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\agos\debug.h
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\agos\debugger.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\agos\debugger.h
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\agos\game.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\agos\icons.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\agos\intern.h
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\agos\items.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\agos\midi.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\agos\midi.h
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\agos\midiparser_s1d.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\agos\res.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\agos\saveload.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\agos\agos.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\agos\agos.h
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\agos\sound.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\agos\sound.h
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\agos\verb.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\agos\vga.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\agos\vga.h
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\agos\oracle.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\agos\animation.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\agos\animation.h
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\agos\string.cpp
-CompileCpp=1
-Folder=agos
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/cine.dev b/dists/devcpp/cine.dev
deleted file mode 100644
index d407bbd5ff..0000000000
--- a/dists/devcpp/cine.dev
+++ /dev/null
@@ -1,489 +0,0 @@
-[Project]
-FileName=cine.dev
-Name=cine
-UnitCount=42
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=cine
-ObjectOutput=cine
-OverrideOutput=0
-OverrideOutputName=cine.a
-HostApplication=
-Folders=
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\cine\various.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\cine\anim.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\cine\anim.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\cine\auto00.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\cine\auto00.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\cine\bg.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\cine\bg.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\cine\bg_list.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\cine\bg_list.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\cine\cine.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\cine\cine.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\cine\font.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\cine\font.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\cine\gfx.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\cine\gfx.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\cine\main_loop.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\cine\main_loop.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\cine\msg.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\cine\msg.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\cine\object.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\cine\object.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\cine\pal.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\cine\pal.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\cine\part.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\cine\part.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\cine\prc.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\cine\prc.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\cine\rel.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\cine\rel.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\cine\resource.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\cine\resource.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\engines\cine\script.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\engines\cine\script.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\engines\cine\sfx_player.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\engines\cine\sfx_player.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\engines\cine\sound_driver.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit37]
-FileName=..\..\engines\cine\sound_driver.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\engines\cine\texte.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\engines\cine\texte.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit40]
-FileName=..\..\engines\cine\unpack.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit41]
-FileName=..\..\engines\cine\unpack.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit42]
-FileName=..\..\engines\cine\various.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit43]
-FileName=..\..\engines\cine\unpack.h
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit44]
-FileName=..\..\engines\cine\various.cpp
-CompileCpp=1
-Folder=cine
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/gob.dev b/dists/devcpp/gob.dev
deleted file mode 100644
index a8bcc06414..0000000000
--- a/dists/devcpp/gob.dev
+++ /dev/null
@@ -1,609 +0,0 @@
-[Project]
-FileName=gob.dev
-Name=gob
-UnitCount=56
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=gob
-ObjectOutput=gob
-OverrideOutput=0
-OverrideOutputName=gob.a
-HostApplication=
-Folders=
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\gob\anim.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\gob\anim.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\gob\cdrom.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\gob\cdrom.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\gob\dataio.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\gob\dataio.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\gob\draw.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\gob\draw.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\gob\driver_vga.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\gob\driver_vga.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\gob\game.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\gob\game.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\gob\global.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\gob\global.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\gob\gob.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\gob\gob.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\gob\goblin.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\gob\goblin.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\gob\init.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\gob\init.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\gob\inter.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\gob\inter.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\gob\inter_v1.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\gob\inter_v2.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\gob\map.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\gob\map.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\gob\mult.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\gob\mult.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\gob\music.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\gob\music.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\gob\pack.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\engines\gob\pack.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\engines\gob\palanim.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\engines\gob\palanim.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\engines\gob\parse.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\engines\gob\parse.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit37]
-FileName=..\..\engines\gob\parse_v1.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\engines\gob\parse_v2.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\engines\gob\scenery.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit40]
-FileName=..\..\engines\gob\scenery.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit41]
-FileName=..\..\engines\gob\sound.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit42]
-FileName=..\..\engines\gob\sound.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit43]
-FileName=..\..\engines\gob\timer.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit44]
-FileName=..\..\engines\gob\timer.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit45]
-FileName=..\..\engines\gob\util.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit46]
-FileName=..\..\engines\gob\util.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit47]
-FileName=..\..\engines\gob\video.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit48]
-FileName=..\..\engines\gob\video.h
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit49]
-FileName=..\..\engines\gob\mult_v2.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit50]
-FileName=..\..\engines\gob\mult_v1.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit51]
-FileName=..\..\engines\gob\draw_v2.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit52]
-FileName=..\..\engines\gob\draw_v1.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit53]
-FileName=..\..\engines\gob\game_v2.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit54]
-FileName=..\..\engines\gob\game_v1.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit55]
-FileName=..\..\engines\gob\video_v1.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit56]
-FileName=..\..\engines\gob\video_v2.cpp
-CompileCpp=1
-Folder=gob
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/kyra.dev b/dists/devcpp/kyra.dev
deleted file mode 100644
index 85b638779b..0000000000
--- a/dists/devcpp/kyra.dev
+++ /dev/null
@@ -1,359 +0,0 @@
-[Project]
-FileName=kyra.dev
-Name=kyra
-UnitCount=31
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=kyra
-ObjectOutput=kyra
-OverrideOutput=0
-OverrideOutputName=kyra.a
-HostApplication=
-Folders=
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\kyra\animator.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\kyra\animator.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\kyra\debugger.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\kyra\debugger.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\kyra\gui.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\kyra\items.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\kyra\kyra.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\kyra\kyra.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\kyra\resource.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\kyra\resource.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\kyra\saveload.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\kyra\scene.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\kyra\screen.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\kyra\screen.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\kyra\script.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\kyra\script.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\kyra\script_v1.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\kyra\seqplayer.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\kyra\seqplayer.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\kyra\sequences_v1.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\kyra\sound.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\kyra\sound.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\kyra\sprites.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\kyra\sprites.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\kyra\staticres.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\kyra\text.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\kyra\text.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\kyra\timer.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\kyra\wsamovie.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\kyra\wsamovie.h
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\kyra\sound_adlib.cpp
-CompileCpp=1
-Folder=kyra
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/lure.dev b/dists/devcpp/lure.dev
deleted file mode 100644
index 89fa86abd0..0000000000
--- a/dists/devcpp/lure.dev
+++ /dev/null
@@ -1,479 +0,0 @@
-[Project]
-FileName=lure.dev
-Name=lure
-UnitCount=43
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=lure
-ObjectOutput=lure
-OverrideOutput=0
-OverrideOutputName=lure.a
-HostApplication=
-Folders=
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\lure\animseq.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\lure\animseq.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\lure\debug-input.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\lure\debug-input.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\lure\debug-methods.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\lure\debug-methods.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\lure\decode.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\lure\decode.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\lure\disk.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\lure\disk.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\lure\events.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\lure\events.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\lure\game.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\lure\game.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\lure\hotspots.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\lure\hotspots.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\lure\intro.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\lure\intro.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\lure\lure.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\lure\lure.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\lure\luredefs.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\lure\memory.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\lure\memory.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\lure\menu.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\lure\menu.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\lure\palette.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\lure\palette.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\lure\res.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\lure\res.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\lure\res_struct.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\lure\res_struct.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\engines\lure\room.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\engines\lure\room.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\engines\lure\screen.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\engines\lure\screen.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\engines\lure\scripts.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit37]
-FileName=..\..\engines\lure\scripts.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\engines\lure\strings.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\engines\lure\strings.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit40]
-FileName=..\..\engines\lure\surface.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit41]
-FileName=..\..\engines\lure\surface.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit42]
-FileName=..\..\engines\lure\system.cpp
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit43]
-FileName=..\..\engines\lure\system.h
-CompileCpp=1
-Folder=lure
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/queen.dev b/dists/devcpp/queen.dev
deleted file mode 100644
index 62f433189c..0000000000
--- a/dists/devcpp/queen.dev
+++ /dev/null
@@ -1,449 +0,0 @@
-[Project]
-FileName=queen.dev
-Name=queen
-UnitCount=40
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=queen
-ObjectOutput=queen
-OverrideOutput=0
-OverrideOutputName=queen.a
-HostApplication=
-Folders=
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\queen\bankman.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\queen\bankman.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\queen\command.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\queen\command.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\queen\credits.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\queen\credits.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\queen\cutaway.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\queen\cutaway.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\queen\debug.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\queen\debug.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\queen\defs.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\queen\display.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\queen\display.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\queen\graphics.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\queen\graphics.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\queen\grid.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\queen\grid.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\queen\input.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\queen\input.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\queen\journal.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\queen\journal.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\queen\logic.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\queen\logic.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\queen\music.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\queen\music.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\queen\musicdata.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\queen\queen.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\queen\queen.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\queen\resource.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\queen\resource.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\queen\restables.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\engines\queen\sound.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\engines\queen\sound.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\engines\queen\state.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\engines\queen\state.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\engines\queen\structs.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit37]
-FileName=..\..\engines\queen\talk.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\engines\queen\talk.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\engines\queen\walk.cpp
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit40]
-FileName=..\..\engines\queen\walk.h
-CompileCpp=1
-Folder=queen
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/saga.dev b/dists/devcpp/saga.dev
deleted file mode 100644
index fbcb64ae79..0000000000
--- a/dists/devcpp/saga.dev
+++ /dev/null
@@ -1,589 +0,0 @@
-[Project]
-FileName=saga.dev
-Name=saga
-UnitCount=54
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=saga
-ObjectOutput=saga
-OverrideOutput=0
-OverrideOutputName=saga.a
-HostApplication=
-Folders=
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\saga\actor.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\saga\actor.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\saga\animation.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\saga\animation.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\saga\console.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\saga\console.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\saga\events.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\saga\events.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\saga\font.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\saga\font.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\saga\font_map.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\saga\game.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\saga\gfx.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\saga\gfx.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\saga\ihnm_introproc.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\saga\image.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\saga\input.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\saga\interface.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\saga\interface.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\saga\isomap.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\saga\isomap.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\saga\ite_introproc.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\saga\itedata.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\saga\itedata.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\saga\list.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\saga\music.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\saga\music.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\saga\objectmap.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\saga\objectmap.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\saga\palanim.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\saga\palanim.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\engines\saga\puzzle.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\engines\saga\puzzle.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\engines\saga\render.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\engines\saga\render.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\engines\saga\resnames.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit37]
-FileName=..\..\engines\saga\rscfile.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\engines\saga\rscfile.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\engines\saga\saga.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit40]
-FileName=..\..\engines\saga\saga.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit41]
-FileName=..\..\engines\saga\saveload.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit42]
-FileName=..\..\engines\saga\scene.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit43]
-FileName=..\..\engines\saga\scene.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit44]
-FileName=..\..\engines\saga\script.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit45]
-FileName=..\..\engines\saga\script.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit46]
-FileName=..\..\engines\saga\sfuncs.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit47]
-FileName=..\..\engines\saga\sndres.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit48]
-FileName=..\..\engines\saga\sndres.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit49]
-FileName=..\..\engines\saga\sound.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit50]
-FileName=..\..\engines\saga\sound.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit51]
-FileName=..\..\engines\saga\sprite.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit52]
-FileName=..\..\engines\saga\sprite.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit53]
-FileName=..\..\engines\saga\sthread.cpp
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit54]
-FileName=..\..\engines\saga\stream.h
-CompileCpp=1
-Folder=saga
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/scumm.dev b/dists/devcpp/scumm.dev
deleted file mode 100644
index 5d8ad95fd0..0000000000
--- a/dists/devcpp/scumm.dev
+++ /dev/null
@@ -1,1469 +0,0 @@
-[Project]
-FileName=scumm.dev
-Name=scumm
-UnitCount=142
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=scumm
-ObjectOutput=scumm
-OverrideOutput=0
-OverrideOutputName=scumm.a
-HostApplication=
-Folders=he,imuse,imuse_digi,insane,smush
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\scumm\smush\channel.h
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\scumm\smush\chunk.cpp
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\scumm\smush\chunk.h
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\scumm\smush\chunk_type.h
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\scumm\smush\codec1.cpp
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\scumm\smush\codec37.cpp
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\scumm\smush\codec37.h
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\scumm\smush\codec47.cpp
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\scumm\smush\codec47.h
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\scumm\smush\imuse_channel.cpp
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\scumm\smush\saud_channel.cpp
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\scumm\smush\smush_font.cpp
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\scumm\smush\smush_font.h
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\scumm\smush\smush_mixer.cpp
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\scumm\smush\smush_mixer.h
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\scumm\smush\smush_player.cpp
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\scumm\smush\smush_player.h
-CompileCpp=1
-Folder=smush
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\scumm\imuse_digi\dimuse_track.cpp
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\scumm\imuse_digi\dimuse.cpp
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\scumm\imuse_digi\dimuse.h
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\scumm\imuse_digi\dimuse_bndmgr.cpp
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\scumm\imuse_digi\dimuse_bndmgr.h
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\scumm\imuse_digi\dimuse_codecs.cpp
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\scumm\imuse_digi\dimuse_music.cpp
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\scumm\imuse_digi\dimuse_script.cpp
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\scumm\imuse_digi\dimuse_sndmgr.cpp
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\scumm\imuse_digi\dimuse_sndmgr.h
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\scumm\imuse_digi\dimuse_tables.cpp
-CompileCpp=1
-Folder=imuse_digi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\scumm\insane\insane_scenes.cpp
-CompileCpp=1
-Folder=insane
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\scumm\insane\insane.cpp
-CompileCpp=1
-Folder=insane
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\scumm\insane\insane.h
-CompileCpp=1
-Folder=insane
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\engines\scumm\insane\insane_ben.cpp
-CompileCpp=1
-Folder=insane
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\engines\scumm\insane\insane_enemy.cpp
-CompileCpp=1
-Folder=insane
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\engines\scumm\insane\insane_iact.cpp
-CompileCpp=1
-Folder=insane
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\engines\scumm\actor.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\engines\scumm\actor.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit37]
-FileName=..\..\engines\scumm\akos.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\engines\scumm\akos.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\engines\scumm\base-costume.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit40]
-FileName=..\..\engines\scumm\base-costume.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit41]
-FileName=..\..\engines\scumm\bomp.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit42]
-FileName=..\..\engines\scumm\bomp.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit43]
-FileName=..\..\engines\scumm\boxes.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit44]
-FileName=..\..\engines\scumm\boxes.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit45]
-FileName=..\..\engines\scumm\camera.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit46]
-FileName=..\..\engines\scumm\charset.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit47]
-FileName=..\..\engines\scumm\charset.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit48]
-FileName=..\..\engines\scumm\costume.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit49]
-FileName=..\..\engines\scumm\costume.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit50]
-FileName=..\..\engines\scumm\cursor.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit51]
-FileName=..\..\engines\scumm\debugger.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit52]
-FileName=..\..\engines\scumm\debugger.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit53]
-FileName=..\..\engines\scumm\dialogs.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit54]
-FileName=..\..\engines\scumm\dialogs.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit55]
-FileName=..\..\engines\scumm\gfx.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit56]
-FileName=..\..\engines\scumm\gfx.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit57]
-FileName=..\..\engines\scumm\help.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit58]
-FileName=..\..\engines\scumm\help.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit59]
-FileName=..\..\engines\scumm\input.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit60]
-FileName=..\..\engines\scumm\intern.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit61]
-FileName=..\..\engines\scumm\midiparser_eup.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit62]
-FileName=..\..\engines\scumm\midiparser_ro.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit63]
-FileName=..\..\engines\scumm\music.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit64]
-FileName=..\..\engines\scumm\nut_renderer.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit65]
-FileName=..\..\engines\scumm\nut_renderer.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit66]
-FileName=..\..\engines\scumm\object.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit67]
-FileName=..\..\engines\scumm\object.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit68]
-FileName=..\..\engines\scumm\palette.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit69]
-FileName=..\..\engines\scumm\player_mod.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit70]
-FileName=..\..\engines\scumm\player_mod.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit71]
-FileName=..\..\engines\scumm\player_nes.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit72]
-FileName=..\..\engines\scumm\player_nes.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit73]
-FileName=..\..\engines\scumm\player_v1.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit74]
-FileName=..\..\engines\scumm\player_v1.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit75]
-FileName=..\..\engines\scumm\player_v2.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit76]
-FileName=..\..\engines\scumm\player_v2.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit77]
-FileName=..\..\engines\scumm\player_v2a.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit78]
-FileName=..\..\engines\scumm\player_v2a.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit79]
-FileName=..\..\engines\scumm\player_v3a.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit80]
-FileName=..\..\engines\scumm\player_v3a.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit81]
-FileName=..\..\engines\scumm\resource.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit82]
-FileName=..\..\engines\scumm\resource.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit83]
-FileName=..\..\engines\scumm\resource_v2.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit84]
-FileName=..\..\engines\scumm\resource_v3.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit85]
-FileName=..\..\engines\scumm\resource_v4.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit86]
-FileName=..\..\engines\scumm\room.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit87]
-FileName=..\..\engines\scumm\saveload.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit88]
-FileName=..\..\engines\scumm\saveload.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit89]
-FileName=..\..\engines\scumm\script.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit90]
-FileName=..\..\engines\scumm\script.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit91]
-FileName=..\..\engines\scumm\script_c64.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit92]
-FileName=..\..\engines\scumm\script_v2.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit93]
-FileName=..\..\engines\scumm\script_v5.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit94]
-FileName=..\..\engines\scumm\script_v6.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit95]
-FileName=..\..\engines\scumm\script_v8.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit96]
-FileName=..\..\engines\scumm\scumm.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit97]
-FileName=..\..\engines\scumm\scumm.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit98]
-FileName=..\..\engines\scumm\scumm-md5.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit99]
-FileName=..\..\engines\scumm\sound.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit100]
-FileName=..\..\engines\scumm\sound.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit101]
-FileName=..\..\engines\scumm\string.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit102]
-FileName=..\..\engines\scumm\thumbnail.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit103]
-FileName=..\..\engines\scumm\usage_bits.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit104]
-FileName=..\..\engines\scumm\usage_bits.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit105]
-FileName=..\..\engines\scumm\util.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit106]
-FileName=..\..\engines\scumm\util.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit107]
-FileName=..\..\engines\scumm\vars.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit108]
-FileName=..\..\engines\scumm\verbs.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit109]
-FileName=..\..\engines\scumm\verbs.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit110]
-FileName=..\..\engines\scumm\he\floodfill_he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit111]
-FileName=..\..\engines\scumm\he\floodfill_he.h
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit112]
-FileName=..\..\engines\scumm\he\intern_he.h
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit113]
-FileName=..\..\engines\scumm\he\logic_he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit114]
-FileName=..\..\engines\scumm\he\logic_he.h
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit115]
-FileName=..\..\engines\scumm\he\palette_he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit116]
-FileName=..\..\engines\scumm\he\resource_he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit117]
-FileName=..\..\engines\scumm\he\resource_he.h
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit118]
-FileName=..\..\engines\scumm\he\script_v60he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit119]
-FileName=..\..\engines\scumm\he\script_v70he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit120]
-FileName=..\..\engines\scumm\he\script_v72he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit121]
-FileName=..\..\engines\scumm\he\script_v80he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit122]
-FileName=..\..\engines\scumm\he\script_v90he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit123]
-FileName=..\..\engines\scumm\he\script_v100he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit124]
-FileName=..\..\engines\scumm\he\sound_he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit125]
-FileName=..\..\engines\scumm\he\sprite_he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit126]
-FileName=..\..\engines\scumm\he\sprite_he.h
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit127]
-FileName=..\..\engines\scumm\he\wiz_he.cpp
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit128]
-FileName=..\..\engines\scumm\he\wiz_he.h
-CompileCpp=1
-Folder=he
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit129]
-FileName=..\..\engines\scumm\plugin.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit130]
-FileName=..\..\engines\scumm\plugin.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit131]
-FileName=..\..\engines\scumm\imuse\instrument.h
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit132]
-FileName=..\..\engines\scumm\imuse\imuse_part.cpp
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit133]
-FileName=..\..\engines\scumm\imuse\imuse.h
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit134]
-FileName=..\..\engines\scumm\imuse\imuse_internal.h
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit135]
-FileName=..\..\engines\scumm\imuse\imuse_player.cpp
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit136]
-FileName=..\..\engines\scumm\imuse\instrument.cpp
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit137]
-FileName=..\..\engines\scumm\file.cpp
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit138]
-FileName=..\..\engines\scumm\file.h
-CompileCpp=1
-Folder=scumm
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit139]
-FileName=..\..\engines\scumm\imuse\imuse.cpp
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit140]
-FileName=..\..\engines\scumm\imuse\sysex_scumm.cpp
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit141]
-FileName=..\..\engines\scumm\imuse\sysex_samnmax.cpp
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit142]
-FileName=..\..\engines\scumm\imuse\sysex.h
-CompileCpp=1
-Folder=imuse
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/scummvm.dev b/dists/devcpp/scummvm.dev
deleted file mode 100644
index 5f15c3e2bd..0000000000
--- a/dists/devcpp/scummvm.dev
+++ /dev/null
@@ -1,2088 +0,0 @@
-[Project]
-FileName=scummvm.dev
-Name=scummvm
-UnitCount=206
-Type=1
-Ver=1
-ObjFiles=
-Includes=../..;../../engines;../../common
-Libs=
-PrivateResource=scummvm_private.rc
-ResourceIncludes=../..;../../icons
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_-DUSE_ZLIB_@@_
-Linker=cine/cine.a_@@_gob/gob.a_@@_kyra/kyra.a_@@_lure/lure.a_@@_queen/queen.a_@@_saga/saga.a_@@_scumm/scumm.a_@@_agos/agos.a_@@_sky/sky.a_@@_sword1/sword1.a_@@_sword2/sword2.a_@@_-lSDL.dll_@@_-lwinmm_@@_-lz.dll_@@_
-IsCpp=1
-Icon=scummvm.ico
-ExeOutput=scummvm
-ObjectOutput=scummvm
-OverrideOutput=0
-OverrideOutputName=scummvm.exe
-HostApplication=
-Folders=backends,backends/fs,backends/fs/windows,backends/midi,backends/platform/sdl,base,common,graphics,graphics/fonts,graphics/scaler,gui,sound,sound/softsynth,sound/softsynth/mt32
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[Unit4]
-FileName=..\..\backends\platform\sdl\sdl.cpp
-CompileCpp=1
-Folder=backends/platform/sdl
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\backends\platform\sdl\sdl-common.h
-CompileCpp=1
-Folder=backends/platform/sdl
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\backends\intern.h
-CompileCpp=1
-Folder=backends
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\base\engine.h
-CompileCpp=1
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\base\options.h
-CompileCpp=1
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\base\internal_version.h
-CompileCpp=1
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\base\main.cpp
-CompileCpp=1
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\base\plugins.cpp
-CompileCpp=1
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\base\plugins.h
-CompileCpp=1
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\base\version.h
-CompileCpp=1
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\common\array.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\common\config-file.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\common\config-file.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\common\config-manager.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\common\config-manager.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\common\debugger.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\common\debugger.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\common\endian.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\common\file.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\common\file.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\common\list.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\common\md5.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\common\md5.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\common\mutex.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\common\mutex.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\common\rect.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\common\savefile.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\common\savefile.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\common\scummsys.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\common\singleton.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\common\stack.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\common\str.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\common\str.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit40]
-FileName=..\..\common\stream.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit41]
-FileName=..\..\common\stream.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit42]
-FileName=..\..\common\system.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit43]
-FileName=..\..\common\system.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit44]
-FileName=..\..\common\timer.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit45]
-FileName=..\..\common\timer.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit46]
-FileName=..\..\common\unzip.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit47]
-FileName=..\..\common\unzip.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit48]
-FileName=..\..\common\util.cpp
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit49]
-FileName=..\..\common\util.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit50]
-FileName=..\..\graphics\animation.cpp
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit51]
-FileName=..\..\graphics\animation.h
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit52]
-FileName=..\..\graphics\font.cpp
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit53]
-FileName=..\..\graphics\font.h
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit54]
-FileName=..\..\graphics\fontman.cpp
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit55]
-FileName=..\..\graphics\fontman.h
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit56]
-FileName=..\..\graphics\ilbm.cpp
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit57]
-FileName=..\..\graphics\ilbm.h
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit58]
-FileName=..\..\graphics\imagedec.cpp
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit59]
-FileName=..\..\graphics\imagedec.h
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit60]
-FileName=..\..\graphics\imageman.cpp
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit61]
-FileName=..\..\graphics\imageman.h
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit62]
-FileName=..\..\graphics\primitives.cpp
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit63]
-FileName=..\..\graphics\primitives.h
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit64]
-FileName=..\..\graphics\surface.cpp
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit65]
-FileName=..\..\graphics\surface.h
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit66]
-FileName=..\..\gui\about.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit67]
-FileName=..\..\gui\about.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit68]
-FileName=..\..\gui\Actions.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit69]
-FileName=..\..\gui\Actions.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit70]
-FileName=..\..\gui\browser.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit71]
-FileName=..\..\gui\browser.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit72]
-FileName=..\..\gui\chooser.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit73]
-FileName=..\..\gui\chooser.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit74]
-FileName=..\..\gui\console.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit75]
-FileName=..\..\gui\console.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit76]
-FileName=..\..\gui\credits.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit77]
-FileName=..\..\gui\dialog.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit78]
-FileName=..\..\gui\dialog.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit79]
-FileName=..\..\gui\editable.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit80]
-FileName=..\..\gui\editable.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit81]
-FileName=..\..\gui\EditTextWidget.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit82]
-FileName=..\..\gui\EditTextWidget.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit83]
-FileName=..\..\gui\Key.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit84]
-FileName=..\..\gui\Key.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit85]
-FileName=..\..\gui\KeysDialog.cpp
-CompileCpp=1
-Folder=gui
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=$(CPP) -c KeysDialog.cpp -o scummvm/KeysDialog.o $(CXXFLAGS)
-
-[Unit86]
-FileName=..\..\gui\KeysDialog.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit87]
-FileName=..\..\gui\launcher.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit88]
-FileName=..\..\gui\launcher.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit89]
-FileName=..\..\gui\ListWidget.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit90]
-FileName=..\..\gui\ListWidget.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit91]
-FileName=..\..\gui\message.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit92]
-FileName=..\..\gui\message.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit93]
-FileName=..\..\gui\newgui.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit94]
-FileName=..\..\gui\newgui.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit95]
-FileName=..\..\gui\object.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit96]
-FileName=..\..\gui\options.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=$(CPP) -c ../../gui/options.cpp -o scummvm/options.o $(CXXFLAGS) -D_MSC_VER
-
-[Unit97]
-FileName=..\..\gui\options.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit98]
-FileName=..\..\gui\PopUpWidget.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit99]
-FileName=..\..\gui\PopUpWidget.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit100]
-FileName=..\..\gui\ScrollBarWidget.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit101]
-FileName=..\..\gui\ScrollBarWidget.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit102]
-FileName=..\..\gui\TabWidget.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit103]
-FileName=..\..\gui\TabWidget.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit104]
-FileName=..\..\gui\theme.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit105]
-FileName=..\..\gui\theme.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit106]
-FileName=..\..\gui\ThemeNew.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit107]
-FileName=..\..\gui\widget.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit108]
-FileName=..\..\gui\widget.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit109]
-FileName=..\..\sound\adpcm.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit110]
-FileName=..\..\sound\adpcm.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit111]
-FileName=..\..\sound\audiocd.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit112]
-FileName=..\..\sound\audiocd.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit113]
-FileName=..\..\sound\audiostream.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit114]
-FileName=..\..\sound\audiostream.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit115]
-FileName=..\..\sound\flac.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit116]
-FileName=..\..\sound\flac.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit117]
-FileName=..\..\sound\fmopl.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit118]
-FileName=..\..\sound\fmopl.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit119]
-FileName=..\..\sound\mididrv.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit120]
-FileName=..\..\sound\mididrv.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit121]
-FileName=..\..\sound\midiparser.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit122]
-FileName=..\..\sound\midiparser.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit123]
-FileName=..\..\sound\midiparser_smf.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit124]
-FileName=..\..\sound\midiparser_xmidi.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit125]
-FileName=..\..\sound\mixer.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit126]
-FileName=..\..\sound\mixer.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit127]
-FileName=..\..\sound\mp3.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit128]
-FileName=..\..\sound\mp3.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit129]
-FileName=..\..\sound\mpu401.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit130]
-FileName=..\..\sound\mpu401.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit131]
-FileName=..\..\sound\rate.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit132]
-FileName=..\..\sound\rate.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit133]
-FileName=..\..\sound\voc.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit134]
-FileName=..\..\sound\voc.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit135]
-FileName=..\..\sound\vorbis.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit136]
-FileName=..\..\sound\vorbis.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit137]
-FileName=..\..\sound\wave.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit138]
-FileName=..\..\sound\wave.h
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit139]
-FileName=..\..\sound\softsynth\adlib.cpp
-CompileCpp=1
-Folder=sound/softsynth
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit140]
-FileName=..\..\sound\softsynth\emumidi.h
-CompileCpp=1
-Folder=sound/softsynth
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit141]
-FileName=..\..\sound\softsynth\fluidsynth.cpp
-CompileCpp=1
-Folder=sound/softsynth
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit142]
-FileName=..\..\sound\softsynth\mt32.cpp
-CompileCpp=1
-Folder=sound/softsynth
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit143]
-FileName=..\..\sound\softsynth\ym2612.cpp
-CompileCpp=1
-Folder=sound/softsynth
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit144]
-FileName=..\..\sound\softsynth\mt32\freeverb.cpp
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit145]
-FileName=..\..\sound\softsynth\mt32\freeverb.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit146]
-FileName=..\..\sound\softsynth\mt32\i386.cpp
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit147]
-FileName=..\..\sound\softsynth\mt32\i386.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit148]
-FileName=..\..\sound\softsynth\mt32\mt32_file.cpp
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit149]
-FileName=..\..\sound\softsynth\mt32\mt32_file.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit150]
-FileName=..\..\sound\softsynth\mt32\mt32emu.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit151]
-FileName=..\..\sound\softsynth\mt32\part.cpp
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit152]
-FileName=..\..\sound\softsynth\mt32\part.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit153]
-FileName=..\..\sound\softsynth\mt32\partial.cpp
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit154]
-FileName=..\..\sound\softsynth\mt32\partial.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit155]
-FileName=..\..\sound\softsynth\mt32\partialManager.cpp
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit156]
-FileName=..\..\sound\softsynth\mt32\partialManager.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit157]
-FileName=..\..\sound\softsynth\mt32\structures.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit158]
-FileName=..\..\sound\softsynth\mt32\synth.cpp
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit159]
-FileName=..\..\sound\softsynth\mt32\synth.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit160]
-FileName=..\..\sound\softsynth\mt32\tables.cpp
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit161]
-FileName=..\..\sound\softsynth\mt32\tables.h
-CompileCpp=1
-Folder=sound/softsynth/mt32
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit162]
-FileName=..\scummvm.rc
-CompileCpp=1
-Folder=Resources
-Compile=1
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit163]
-FileName=..\..\backends\fs\fs.cpp
-CompileCpp=1
-Folder=backends/fs
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit164]
-FileName=..\..\backends\fs\fs.h
-CompileCpp=1
-Folder=backends/fs
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit165]
-FileName=..\..\backends\fs\windows\windows-fs.cpp
-CompileCpp=1
-Folder=backends/fs/windows
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit166]
-FileName=..\..\sound\null.cpp
-CompileCpp=1
-Folder=sound
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit167]
-FileName=..\..\graphics\fonts\consolefont.cpp
-CompileCpp=1
-Folder=graphics/fonts
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit168]
-FileName=..\..\graphics\fonts\newfont.cpp
-CompileCpp=1
-Folder=graphics/fonts
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit169]
-FileName=..\..\graphics\fonts\newfont_big.cpp
-CompileCpp=1
-Folder=graphics/fonts
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit170]
-FileName=..\..\graphics\fonts\scummfont.cpp
-CompileCpp=1
-Folder=graphics/fonts
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit171]
-FileName=..\..\graphics\scaler.cpp
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit172]
-FileName=..\..\graphics\scaler.h
-CompileCpp=1
-Folder=graphics
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit173]
-FileName=..\..\graphics\scaler\2xsai.cpp
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit174]
-FileName=..\..\graphics\scaler\aspect.cpp
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit175]
-FileName=..\..\graphics\scaler\hq2x.cpp
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit176]
-FileName=..\..\graphics\scaler\hq2x.h
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit177]
-FileName=..\..\graphics\scaler\hq3x.cpp
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit178]
-FileName=..\..\graphics\scaler\hq3x.h
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit179]
-FileName=..\..\graphics\scaler\intern.h
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit180]
-FileName=..\..\graphics\scaler\scale2x.cpp
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit181]
-FileName=..\..\graphics\scaler\scale2x.h
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit182]
-FileName=..\..\graphics\scaler\scale3x.cpp
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit183]
-FileName=..\..\graphics\scaler\scale3x.h
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit184]
-FileName=..\..\graphics\scaler\scalebit.cpp
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit185]
-FileName=..\..\graphics\scaler\scalebit.h
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit186]
-FileName=..\..\graphics\scaler\thumbnail.cpp
-CompileCpp=1
-Folder=graphics/scaler
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit187]
-FileName=..\..\gui\theme-config.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit189]
-FileName=..\..\gui\eval.h
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit190]
-FileName=..\..\common\hashmap.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit191]
-FileName=..\..\common\func.h
-CompileCpp=1
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit192]
-FileName=..\..\common\hashmap.cpp
-Folder=common
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-CompileCpp=1
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit9]
-FileName=..\..\base\options.cpp
-CompileCpp=1
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit193]
-FileName=..\..\gui\ThemeClassic.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit1]
-FileName=..\..\backends\midi\windows.cpp
-CompileCpp=1
-Folder=backends/midi
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\backends\platform\sdl\events.cpp
-CompileCpp=1
-Folder=backends/platform/sdl
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\backends\platform\sdl\graphics.cpp
-CompileCpp=1
-Folder=backends/platform/sdl
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\base\engine.cpp
-CompileCpp=1
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit194]
-FileName=..\..\base\version.cpp
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-CompileCpp=1
-
-[Unit195]
-FileName=..\..\base\main.h
-Folder=base
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-CompileCpp=1
-
-[Unit196]
-FileName=cine.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit197]
-FileName=gob.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit198]
-FileName=kyra.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit188]
-FileName=..\..\gui\eval.cpp
-CompileCpp=1
-Folder=gui
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit199]
-FileName=lure.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit200]
-FileName=queen.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit201]
-FileName=saga.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit202]
-FileName=scumm.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit203]
-FileName=agos.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit204]
-FileName=sky.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit205]
-FileName=sword1.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit206]
-FileName=sword2.dev
-Folder=scummvm
-Compile=0
-Link=0
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/sky.dev b/dists/devcpp/sky.dev
deleted file mode 100644
index 570dfc2d64..0000000000
--- a/dists/devcpp/sky.dev
+++ /dev/null
@@ -1,479 +0,0 @@
-[Project]
-FileName=sky.dev
-Name=sky
-UnitCount=43
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=sky
-ObjectOutput=sky
-OverrideOutput=0
-OverrideOutputName=sky.a
-HostApplication=
-Folders=music
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\sky\music\adlibchannel.cpp
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\sky\music\adlibchannel.h
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\sky\music\adlibmusic.cpp
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\sky\music\adlibmusic.h
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\sky\music\gmchannel.cpp
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\sky\music\gmchannel.h
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\sky\music\gmmusic.cpp
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\sky\music\gmmusic.h
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\sky\music\mt32music.cpp
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\sky\music\mt32music.h
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\sky\music\musicbase.cpp
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\sky\music\musicbase.h
-CompileCpp=1
-Folder=music
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\sky\autoroute.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\sky\autoroute.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\sky\compact.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\sky\compact.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\sky\control.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\sky\control.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\sky\debug.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\sky\debug.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\sky\disk.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\sky\disk.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\sky\grid.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\sky\grid.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\sky\hufftext.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\sky\intro.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\sky\intro.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\sky\logic.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\sky\logic.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\sky\mouse.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\sky\mouse.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\engines\sky\rnc_deco.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\engines\sky\rnc_deco.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\engines\sky\screen.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\engines\sky\screen.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\engines\sky\sky.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit37]
-FileName=..\..\engines\sky\sky.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\engines\sky\skydefs.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\engines\sky\sound.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit40]
-FileName=..\..\engines\sky\sound.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit41]
-FileName=..\..\engines\sky\struc.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit42]
-FileName=..\..\engines\sky\text.cpp
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit43]
-FileName=..\..\engines\sky\text.h
-CompileCpp=1
-Folder=sky
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/sword1.dev b/dists/devcpp/sword1.dev
deleted file mode 100644
index a695e46e46..0000000000
--- a/dists/devcpp/sword1.dev
+++ /dev/null
@@ -1,439 +0,0 @@
-[Project]
-FileName=sword1.dev
-Name=sword1
-UnitCount=39
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=sword1
-ObjectOutput=sword1
-OverrideOutput=0
-OverrideOutputName=sword1.a
-HostApplication=
-Folders=
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\sword1\animation.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\sword1\animation.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\sword1\collision.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\sword1\control.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\sword1\control.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\sword1\credits.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\sword1\credits.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\sword1\debug.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\sword1\debug.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\sword1\eventman.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\sword1\eventman.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\sword1\logic.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\sword1\logic.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\sword1\memman.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\sword1\memman.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\sword1\menu.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\sword1\menu.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\sword1\mouse.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\sword1\mouse.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\sword1\music.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\sword1\music.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\sword1\object.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\sword1\objectman.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\sword1\objectman.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\sword1\resman.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\sword1\resman.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\sword1\router.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\sword1\router.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\sword1\screen.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\sword1\screen.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\sword1\sound.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\engines\sword1\sound.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\engines\sword1\staticres.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\engines\sword1\sword1.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\engines\sword1\sword1.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\engines\sword1\sworddefs.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit37]
-FileName=..\..\engines\sword1\swordres.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\engines\sword1\text.cpp
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\engines\sword1\text.h
-CompileCpp=1
-Folder=sword1
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/devcpp/sword2.dev b/dists/devcpp/sword2.dev
deleted file mode 100644
index f2df2a6bee..0000000000
--- a/dists/devcpp/sword2.dev
+++ /dev/null
@@ -1,569 +0,0 @@
-[Project]
-FileName=sword2.dev
-Name=sword2
-UnitCount=49
-Type=2
-Ver=1
-ObjFiles=
-Includes=../..;../../engines
-Libs=
-PrivateResource=
-ResourceIncludes=
-MakeIncludes=
-Compiler=
-CppCompiler=-Wno-multichar_@@_
-Linker=
-IsCpp=1
-Icon=
-ExeOutput=sword2
-ObjectOutput=sword2
-OverrideOutput=0
-OverrideOutputName=sword2.a
-HostApplication=
-Folders=
-CommandLine=
-UseCustomMakefile=0
-CustomMakefile=
-IncludeVersionInfo=0
-SupportXPThemes=0
-CompilerSet=0
-CompilerSettings=0000000000000000000000
-
-[VersionInfo]
-Major=0
-Minor=1
-Release=1
-Build=1
-LanguageID=1033
-CharsetID=1252
-CompanyName=
-FileVersion=
-FileDescription=Developed using the Dev-C++ IDE
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=
-AutoIncBuildNr=0
-
-[Unit1]
-FileName=..\..\engines\sword2\animation.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit2]
-FileName=..\..\engines\sword2\animation.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit3]
-FileName=..\..\engines\sword2\anims.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit4]
-FileName=..\..\engines\sword2\console.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit5]
-FileName=..\..\engines\sword2\console.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit6]
-FileName=..\..\engines\sword2\controls.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit7]
-FileName=..\..\engines\sword2\controls.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit8]
-FileName=..\..\engines\sword2\debug.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit9]
-FileName=..\..\engines\sword2\debug.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit10]
-FileName=..\..\engines\sword2\defs.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit11]
-FileName=..\..\engines\sword2\events.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit12]
-FileName=..\..\engines\sword2\function.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit13]
-FileName=..\..\engines\sword2\header.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit14]
-FileName=..\..\engines\sword2\icons.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit15]
-FileName=..\..\engines\sword2\interpreter.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit16]
-FileName=..\..\engines\sword2\interpreter.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit17]
-FileName=..\..\engines\sword2\layers.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit18]
-FileName=..\..\engines\sword2\logic.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit19]
-FileName=..\..\engines\sword2\logic.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit20]
-FileName=..\..\engines\sword2\maketext.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit21]
-FileName=..\..\engines\sword2\maketext.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit22]
-FileName=..\..\engines\sword2\memory.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit23]
-FileName=..\..\engines\sword2\memory.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit24]
-FileName=..\..\engines\sword2\menu.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit25]
-FileName=..\..\engines\sword2\mouse.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit26]
-FileName=..\..\engines\sword2\mouse.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit27]
-FileName=..\..\engines\sword2\music.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit28]
-FileName=..\..\engines\sword2\object.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit29]
-FileName=..\..\engines\sword2\palette.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit30]
-FileName=..\..\engines\sword2\protocol.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit31]
-FileName=..\..\engines\sword2\render.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit32]
-FileName=..\..\engines\sword2\resman.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit33]
-FileName=..\..\engines\sword2\resman.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit34]
-FileName=..\..\engines\sword2\router.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit35]
-FileName=..\..\engines\sword2\router.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit36]
-FileName=..\..\engines\sword2\saveload.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit37]
-FileName=..\..\engines\sword2\saveload.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit38]
-FileName=..\..\engines\sword2\screen.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit39]
-FileName=..\..\engines\sword2\screen.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit40]
-FileName=..\..\engines\sword2\scroll.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit41]
-FileName=..\..\engines\sword2\sound.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit42]
-FileName=..\..\engines\sword2\sound.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit43]
-FileName=..\..\engines\sword2\speech.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit44]
-FileName=..\..\engines\sword2\sprite.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit45]
-FileName=..\..\engines\sword2\startup.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit46]
-FileName=..\..\engines\sword2\sword2.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit47]
-FileName=..\..\engines\sword2\sword2.h
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit48]
-FileName=..\..\engines\sword2\sync.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit49]
-FileName=..\..\engines\sword2\walker.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit50]
-FileName=..\..\engines\sword2\sync.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit51]
-FileName=..\..\engines\sword2\walker.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
-[Unit52]
-FileName=..\..\engines\sword2\walker.cpp
-CompileCpp=1
-Folder=sword2
-Compile=1
-Link=1
-Priority=1000
-OverrideBuildCmd=0
-BuildCmd=
-
diff --git a/dists/engine-data/hugo.dat b/dists/engine-data/hugo.dat
new file mode 100644
index 0000000000..348339bdda
--- /dev/null
+++ b/dists/engine-data/hugo.dat
Binary files differ
diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp
index f4af4a8500..46ecc03767 100644
--- a/engines/advancedDetector.cpp
+++ b/engines/advancedDetector.cpp
@@ -214,10 +214,36 @@ static void updateGameDescriptor(GameDescriptor &desc, const ADGameDescription *
desc.appendGUIOptions(getGameGUIOptionsDescriptionLanguage(Common::EN_ANY));
}
+bool cleanupPirated(ADGameDescList &matched) {
+ // OKay, now let's sense presense of pirated games
+ if (!matched.empty()) {
+ for (uint j = 0; j < matched.size();) {
+ if (matched[j]->flags & ADGF_PIRATED)
+ matched.remove_at(j);
+ else
+ ++j;
+ }
+
+ // We ruled out all variants and now have nothing
+ if (matched.empty()) {
+
+ warning("Illegitimate copy of the game detected. We give no support in such cases %d", matched.size());
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
GameList AdvancedMetaEngine::detectGames(const Common::FSList &fslist) const {
ADGameDescList matches = detectGame(fslist, params, Common::UNK_LANG, Common::kPlatformUnknown, "");
GameList detectedGames;
+ if (cleanupPirated(matches))
+ return detectedGames;
+
// Use fallback detector if there were no matches by other means
if (matches.empty()) {
const ADGameDescription *fallbackDesc = fallbackDetect(fslist);
@@ -282,6 +308,9 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine)
ADGameDescList matches = detectGame(files, params, language, platform, extra);
+ if (cleanupPirated(matches))
+ return Common::kNoGameDataFoundError;
+
if (params.singleid == NULL) {
for (uint i = 0; i < matches.size(); i++) {
if (matches[i]->gameid == gameid) {
@@ -342,14 +371,14 @@ static void reportUnknown(const Common::FSNode &path, const SizeMD5Map &filesSiz
printf("of the game you tried to add and its version/language/etc.:\n");
for (SizeMD5Map::const_iterator file = filesSizeMD5.begin(); file != filesSizeMD5.end(); ++file)
- printf(" \"%s\", \"%s\", %d\n", file->_key.c_str(), file->_value.md5, file->_value.size);
+ printf(" {\"%s\", 0, \"%s\", %d},\n", file->_key.c_str(), file->_value.md5, file->_value.size);
printf("\n");
}
static ADGameDescList detectGameFilebased(const FileMap &allFiles, const ADParams &params);
-static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth, const char **directoryGlobs) {
+static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth, const char * const *directoryGlobs) {
if (depth <= 0)
return;
@@ -366,8 +395,8 @@ static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles,
continue;
bool matched = false;
- for (const char *glob = *directoryGlobs; *glob; glob++)
- if (file->getName().matchString(glob, true)) {
+ for (const char * const *glob = directoryGlobs; *glob; glob++)
+ if (file->getName().matchString(*glob, true)) {
matched = true;
break;
}
diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h
index 1e59df04bf..0ebb264f74 100644
--- a/engines/advancedDetector.h
+++ b/engines/advancedDetector.h
@@ -45,6 +45,7 @@ struct ADGameFileDescription {
enum ADGameFlags {
ADGF_NO_FLAGS = 0,
+ ADGF_PIRATED = (1 << 23), // flag to designate well known pirated versions with cracks
ADGF_ADDENGLISH = (1 << 24), // always add English as language option
ADGF_MACRESFORK = (1 << 25), // the md5 for this entry will be calculated from the resource fork
ADGF_USEEXTRAASTITLE = (1 << 26), // Extra field value will be used as main game title, not gameid
@@ -207,7 +208,7 @@ struct ADParams {
*
* @note Last item must be 0
*/
- const char **directoryGlobs;
+ const char * const *directoryGlobs;
};
diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp
index e83ef4ead9..b15a4c3bac 100644
--- a/engines/agi/agi.cpp
+++ b/engines/agi/agi.cpp
@@ -501,8 +501,7 @@ AgiBase::AgiBase(OSystem *syst, const AGIGameDescription *gameDesc) : Engine(sys
AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBase(syst, gameDesc) {
// Setup mixer
- _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
- _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
+ syncSoundSettings();
parseFeatures();
@@ -709,18 +708,6 @@ Common::Error AgiEngine::go() {
return Common::kNoError;
}
-void AgiEngine::syncSoundSettings() {
- // FIXME/TODO: Please explain why we are using "music_volume" for all
- // three different entries here.
- int soundVolumeMusic = ConfMan.getInt("music_volume");
- int soundVolumeSFX = ConfMan.getInt("music_volume");
- int soundVolumeSpeech = ConfMan.getInt("music_volume");
-
- _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, soundVolumeMusic);
- _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, soundVolumeSFX);
- _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, soundVolumeSpeech);
-}
-
void AgiEngine::parseFeatures() {
if (!ConfMan.hasKey("features"))
return;
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index 507e7f7a11..4df8824b0e 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -795,7 +795,6 @@ class AgiEngine : public AgiBase {
protected:
// Engine APIs
virtual Common::Error go();
- virtual void syncSoundSettings();
void initialize();
diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp
index b7eba22298..57bcabb188 100644
--- a/engines/agi/cycle.cpp
+++ b/engines/agi/cycle.cpp
@@ -387,6 +387,8 @@ int AgiEngine::runGame() {
if (_restartGame) {
setflag(fRestartGame, true);
+ _game.lastController = 0;
+ setvar(vTimeDelay, 2); // "normal" speed
_restartGame = false;
}
diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp
index 57c5d54b27..840538b92b 100644
--- a/engines/agi/sound_midi.cpp
+++ b/engines/agi/sound_midi.cpp
@@ -121,6 +121,12 @@ int SoundGenMIDI::open() {
return ret;
_driver->setTimerCallback(this, &onTimer);
+
+ // General MIDI System On message
+ // Resets all GM devices to default settings
+ _driver->sysEx((const byte *)"\x7E\x7F\x09\x01", 4);
+ g_system->delayMillis(20);
+
return 0;
}
diff --git a/engines/agos/detection_tables.h b/engines/agos/detection_tables.h
index e3709f8409..963c08849c 100644
--- a/engines/agos/detection_tables.h
+++ b/engines/agos/detection_tables.h
@@ -2811,6 +2811,27 @@ static const AGOSGameDescription gameDescriptions[] = {
GF_OLD_BUNDLE | GF_TALKIE
},
+ // Simon the Sorcerer's Puzzle Pack - Swampy Adventures - Polish
+ {
+ {
+ "swampy",
+ "CD",
+
+ {
+ { "Gswampy", GAME_BASEFILE, "31bfb5169b47ccc19177e61bd31d4391", -1},
+ { NULL, 0, NULL, 0}
+ },
+ Common::PL_POL,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO_NOSUBTITLES
+ },
+
+ GType_PP,
+ GID_SWAMPY,
+ GF_OLD_BUNDLE | GF_TALKIE
+ },
+
// Simon the Sorcerer's Puzzle Pack - Swampy Adventures - Spanish
{
{
diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp
index 2397a474c6..cb081e4683 100644
--- a/engines/dialogs.cpp
+++ b/engines/dialogs.cpp
@@ -106,7 +106,10 @@ MainMenuDialog::MainMenuDialog(Engine *engine)
new GUI::ButtonWidget(this, "GlobalMenu.About", _("~A~bout"), 0, kAboutCmd);
- _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", _("~R~eturn to Launcher"), 0, kRTLCmd);
+ if (g_system->getOverlayWidth() > 320)
+ _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", _("~R~eturn to Launcher"), 0, kRTLCmd);
+ else
+ _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", _c("~R~eturn to Launcher", "lowres"), 0, kRTLCmd);
_rtlButton->setEnabled(_engine->hasFeature(Engine::kSupportsRTL));
diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp
index 7a6a68618d..f657dfe33c 100644
--- a/engines/draci/script.cpp
+++ b/engines/draci/script.cpp
@@ -967,7 +967,7 @@ int Script::handleMathExpression(Common::MemoryReadStream *reader) const {
func = _functionList[value-1];
// If not yet implemented
- if (func._handler == NULL) {
+ if (func._handler == 0) {
stk.pop();
// Pushing dummy value
@@ -1170,7 +1170,7 @@ void Script::run(const GPL2Program &program, uint16 offset) {
GPLHandler handler = cmd->_handler;
- if (handler != NULL) {
+ if (handler != 0) {
// Call the handler for the current command
(this->*(cmd->_handler))(params);
}
diff --git a/engines/engines.mk b/engines/engines.mk
index 2c1378290c..e542ffd933 100644
--- a/engines/engines.mk
+++ b/engines/engines.mk
@@ -60,6 +60,11 @@ DEFINES += -DENABLE_GROOVIE2
endif
endif
+ifdef ENABLE_HUGO
+DEFINES += -DENABLE_HUGO=$(ENABLE_HUGO)
+MODULES += engines/hugo
+endif
+
ifdef ENABLE_KYRA
DEFINES += -DENABLE_KYRA=$(ENABLE_KYRA)
MODULES += engines/kyra
diff --git a/engines/gob/detection_tables.h b/engines/gob/detection_tables.h
index 20edb9fbc3..907dc64295 100644
--- a/engines/gob/detection_tables.h
+++ b/engines/gob/detection_tables.h
@@ -1798,6 +1798,22 @@ static const GOBGameDescription gameDescriptions[] = {
kFeaturesAdLib | kFeaturesEGA,
0, 0, 0
},
+// This version is not detected on purpose: it's a pirated version.
+// Tagged ADGF_PIRATED! Do not re-add nor un-tag!
+ {
+ {
+ "lit",
+ "",
+ AD_ENTRY1s("intro.stk", "3712e7527ba8ce5637d2aadf62783005", 72318),
+ FR_FRA,
+ kPlatformPC,
+ ADGF_PIRATED,
+ GUIO_NOSUBTITLES | GUIO_NOSPEECH
+ },
+ kGameTypeLostInTime,
+ kFeaturesAdLib,
+ 0, 0, 0
+ },
{
{
"lit",
@@ -2220,18 +2236,20 @@ static const GOBGameDescription gameDescriptions[] = {
kFeaturesAdLib,
"demo.stk", "demo.tot", 0
},
+// This version is not detected on purpose: it's a pirated version, using a corrupted crack.
+// Tagged ADGF_PIRATED! Do not re-add nor un-tag!
{
{
"fascination",
- "CD Version (Censored)",
- AD_ENTRY1s("disk0.stk", "9c61e9c22077f72921f07153e37ccf01", 545953),
- EN_ANY,
+ "",
+ AD_ENTRY1s("disk0.stk", "c14330d052fe4da5a441ac9d81bc5891", 1061955),
+ UNK_LANG,
kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES
+ ADGF_PIRATED,
+ GUIO_NOSUBTITLES | GUIO_NOSPEECH
},
kGameTypeFascination,
- kFeaturesCD,
+ kFeaturesAdLib,
"disk0.stk", 0, 0
},
{
@@ -2239,7 +2257,7 @@ static const GOBGameDescription gameDescriptions[] = {
"fascination",
"VGA 3 disks edition",
AD_ENTRY1s("disk0.stk", "a50a8495e1b2d67699fb562cb98fc3e2", 1064387),
- UNK_LANG,
+ FR_FRA,
kPlatformPC,
ADGF_NO_FLAGS,
GUIO_NOSUBTITLES | GUIO_NOSPEECH
@@ -2251,7 +2269,7 @@ static const GOBGameDescription gameDescriptions[] = {
{
{
"fascination",
- "VGA 3 disks edition",
+ "Hebrew edition (censored)",
AD_ENTRY1s("intro.stk", "d6e45ce548598727e2b5587a99718eba", 1055909),
HE_ISR,
kPlatformPC,
@@ -2262,20 +2280,6 @@ static const GOBGameDescription gameDescriptions[] = {
kFeaturesAdLib,
"intro.stk", 0, 0
},
- { // Supplied by sanguine
- {
- "fascination",
- "VGA 3 disks edition",
- AD_ENTRY1s("disk0.stk", "c14330d052fe4da5a441ac9d81bc5891", 1061955),
- UNK_LANG,
- kPlatformPC,
- ADGF_NO_FLAGS,
- GUIO_NOSUBTITLES | GUIO_NOSPEECH
- },
- kGameTypeFascination,
- kFeaturesAdLib,
- "disk0.stk", 0, 0
- },
{ // Supplied by windlepoons in bug report #2809247
{
"fascination",
@@ -2376,6 +2380,76 @@ static const GOBGameDescription gameDescriptions[] = {
},
{
{
+ "fascination",
+ "CD Version (Censored)",
+ AD_ENTRY1s("intro.stk", "9c61e9c22077f72921f07153e37ccf01", 545953),
+ EN_ANY,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO_NOSUBTITLES
+ },
+ kGameTypeFascination,
+ kFeaturesCD,
+ "intro.stk", 0, 0
+ },
+ {
+ {
+ "fascination",
+ "CD Version (Censored)",
+ AD_ENTRY1s("intro.stk", "9c61e9c22077f72921f07153e37ccf01", 545953),
+ FR_FRA,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO_NOSUBTITLES
+ },
+ kGameTypeFascination,
+ kFeaturesCD,
+ "intro.stk", 0, 0
+ },
+ {
+ {
+ "fascination",
+ "CD Version (Censored)",
+ AD_ENTRY1s("intro.stk", "9c61e9c22077f72921f07153e37ccf01", 545953),
+ DE_DEU,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO_NOSUBTITLES
+ },
+ kGameTypeFascination,
+ kFeaturesCD,
+ "intro.stk", 0, 0
+ },
+ {
+ {
+ "fascination",
+ "CD Version (Censored)",
+ AD_ENTRY1s("intro.stk", "9c61e9c22077f72921f07153e37ccf01", 545953),
+ IT_ITA,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO_NOSUBTITLES
+ },
+ kGameTypeFascination,
+ kFeaturesCD,
+ "intro.stk", 0, 0
+ },
+ {
+ {
+ "fascination",
+ "CD Version (Censored)",
+ AD_ENTRY1s("intro.stk", "9c61e9c22077f72921f07153e37ccf01", 545953),
+ ES_ESP,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ GUIO_NOSUBTITLES
+ },
+ kGameTypeFascination,
+ kFeaturesCD,
+ "intro.stk", 0, 0
+ },
+ {
+ {
"geisha",
"",
AD_ENTRY1s("disk1.stk", "6eebbb98ad90cd3c44549fc2ab30f632", 212153),
diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp
index 36b75dc2eb..62b9a5e630 100644
--- a/engines/gob/draw.cpp
+++ b/engines/gob/draw.cpp
@@ -530,787 +530,6 @@ void Draw::oPlaytoons_sub_F_1B(uint16 id, int16 left, int16 top, int16 right, in
return;
}
-void Draw::activeWin(int16 id) {
- bool found = false;
- int16 t[10], t2[10];
- int nextId = -1;
- int oldId = -1;
- SurfaceDescPtr tempSrf;
- SurfaceDescPtr oldSrf[10];
-
- warning ("activeWindow %d", id);
-
- if (_fascinWin[id].id == -1)
- return;
-
- blitInvalidated();
-
- for (int i = 0; i < 10; i++) {
- t[i] = -1;
- t2[i] = -1;
- oldSrf[i].reset();
- }
-
- for (int i = 0; i < 10; i++)
- if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id) && (winOverlap(i, id))) {
- t[_fascinWin[i].id] = i;
- found = true;
- }
-
- if (found) {
- for (int i = 9; i >= 0; i--) {
- if (t[i] != -1) {
- if (nextId != -1)
- _vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
- _fascinWin[t[i]].left, _fascinWin[t[i]].top,
- _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1,
- _fascinWin[t[i]].left & 7, 0, 0);
- t2[i] = nextId;
- restoreWin(t[i]);
- nextId = t[i];
- }
- }
-
- oldId = nextId;
- _vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
- _fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1,
- _fascinWin[id].left & 7, 0, 0);
- restoreWin(id);
- nextId = id;
-
- for (int i = 0; i < 10; i++) {
- if (t[i] != -1) {
- _vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
- _fascinWin[t[i]].left, _fascinWin[t[i]].top,
- _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1,
- _fascinWin[t[i]].left & 7, 0, 0);
- oldSrf[t[i]] = _fascinWin[nextId].savedSurface;
- if (t2[i] != -1)
- _vm->_video->drawSprite(*_fascinWin[t2[i]].savedSurface, *_backSurface,
- _fascinWin[t[i]].left & 7, 0,
- (_fascinWin[t[i]].left & 7) + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].height - 1, _fascinWin[t[i]].left,
- _fascinWin[t[i]].top, 0);
- else {
- // Shift skipped as always set to zero (?)
- _vm->_video->drawSprite(*_frontSurface, *_backSurface,
- _fascinWin[t[i]].left, _fascinWin[t[i]].top,
- _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1,
- _fascinWin[t[i]].left, _fascinWin[t[i]].top, 0);
- }
- invalidateRect(_fascinWin[t[i]].left, _fascinWin[t[i]].top,
- _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1);
- nextId = t2[i];
- }
- }
-
- tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
- _vm->_video->drawSprite(*_backSurface, *tempSrf,
- _fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1,
- _fascinWin[id].left & 7, 0, 0);
- _vm->_video->drawSprite(*_fascinWin[oldId].savedSurface, *_backSurface,
- _fascinWin[id].left & 7, 0,
- (_fascinWin[id].left & 7) + _fascinWin[id].width - 1,
- _fascinWin[id].height - 1,
- _fascinWin[id].left, _fascinWin[id].top, 0);
-
- _fascinWin[oldId].savedSurface.reset();
- _fascinWin[oldId].savedSurface = tempSrf;
- oldSrf[id] = _fascinWin[oldId].savedSurface;
-
- invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1);
- nextId = id;
-
- for (int j = 0; j < 10; j++) {
- if (oldSrf[j]!=0)
- _fascinWin[j].savedSurface = oldSrf[j];
- }
- }
-
- for (int i = 0; i < 10; i++) {
- if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id))
- _fascinWin[i].id--;
- }
-
- _fascinWin[id].id = _winCount - 1;
-}
-
-bool Draw::winOverlap(int16 idWin1, int16 idWin2) {
- if ((_fascinWin[idWin1].left + _fascinWin[idWin1].width <= _fascinWin[idWin2].left) ||
- (_fascinWin[idWin2].left + _fascinWin[idWin2].width <= _fascinWin[idWin1].left) ||
- (_fascinWin[idWin1].top + _fascinWin[idWin1].height <= _fascinWin[idWin2].top ) ||
- (_fascinWin[idWin2].top + _fascinWin[idWin2].height <= _fascinWin[idWin1].top ))
- return false;
-
- return true;
-}
-
-void Draw::closeWin(int16 i) {
- if (_fascinWin[i].id == -1)
- return;
-
- WRITE_VAR((_winVarArrayStatus / 4) + i, VAR((_winVarArrayStatus / 4) + i) | 1);
- restoreWin(i);
- _fascinWin[i].id = -1;
- _fascinWin[i].savedSurface.reset();
- _winCount--;
-}
-
-void Draw::closeAllWin() {
- for (int i = 0; i < 10; i++){
- activeWin(i);
- closeWin(i);
- }
-}
-
-int16 Draw::openWin(int16 id) {
- if (_fascinWin[id].id != -1)
- return 0;
-
- _fascinWin[id].id = _winCount++;
- _fascinWin[id].left = VAR((_winVarArrayLeft / 4) + id);
- _fascinWin[id].top = VAR((_winVarArrayTop / 4) + id);
- _fascinWin[id].width = VAR((_winVarArrayWidth / 4) + id);
- _fascinWin[id].height = VAR((_winVarArrayHeight / 4) + id);
- _fascinWin[id].savedSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
-
- warning("Draw::openWin id %d- left %d top %d l %d h%d", id, _fascinWin[id].left, _fascinWin[id].top, _fascinWin[id].width, _fascinWin[id].height);
-
- saveWin(id);
- WRITE_VAR((_winVarArrayStatus / 4) + id, VAR((_winVarArrayStatus / 4) + id) & 0xFFFFFFFE);
-
- return 1;
-}
-
-void Draw::restoreWin(int16 i) {
- warning("restoreWin");
- _vm->_video->drawSprite(*_fascinWin[i].savedSurface, *_backSurface,
- _fascinWin[i].left & 7, 0,
- (_fascinWin[i].left & 7) + _fascinWin[i].width - 1, _fascinWin[i].height - 1,
- _fascinWin[i].left, _fascinWin[i].top, 0);
- invalidateRect(_fascinWin[i].left, _fascinWin[i].top,
- _fascinWin[i].left + _fascinWin[i].width - 1,
- _fascinWin[i].top + _fascinWin[i].height - 1);
-}
-
-void Draw::saveWin(int16 id) {
- warning("saveWin");
- _vm->_video->drawSprite(*_backSurface, *_fascinWin[id].savedSurface,
- _fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1,
- _fascinWin[id].left & 7, 0, 0);
-}
-
-void Draw::winMove(int16 id) {
- int oldLeft = _fascinWin[id].left;
- int oldTop = _fascinWin[id].top;
-
- restoreWin(id);
-
- _fascinWin[id].left = _vm->_global->_inter_mouseX;
- _fascinWin[id].top = _vm->_global->_inter_mouseY;
-
- WRITE_VAR((_winVarArrayLeft / 4) + id, _fascinWin[id].left);
- WRITE_VAR((_winVarArrayTop / 4) + id, _fascinWin[id].top);
-
- saveWin(id);
-
- // Shift skipped as always set to zero (?)
- _vm->_video->drawSprite(*_frontSurface, *_backSurface,
- oldLeft, oldTop,
- oldLeft + _fascinWin[id].width - 1,
- oldTop + _fascinWin[id].height - 1,
- _fascinWin[id].left, _fascinWin[id].top, 0);
- invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1);
-}
-
-void Draw::winTrace(int16 left, int16 top, int16 width, int16 height) {
- // TODO: Implement proper behavior for the trace of the Window. In short,
- // - drawline currently use the wrong surface, to be fixed
- // - dirtiedRect should be put after the 4 drawlines when the surface is fixed <- Not in 256 col version
- // - drawline should be replaced by a drawline with palette inversion
- // - Shift skipped as always set to zero (?)
-
- int16 right, bottom;
-
- right = left + width - 1;
- bottom = top + height - 1;
-
-// To be fixed : either wrong surface, or anything else, but crappy look.
-// _vm->_video->drawLine(*_frontSurface, left, top, right, top, 0);
-// _vm->_video->drawLine(*_frontSurface, left, top, left, bottom, 0);
-// _vm->_video->drawLine(*_frontSurface, left, bottom, right, bottom, 0);
-// _vm->_video->drawLine(*_frontSurface, right, top, right, bottom, 0);
-
-// Not in 256 col version
- _vm->_video->dirtyRectsAll();
-
-}
-
-void Draw::handleWinBorder(int16 id) {
- int16 minX = 0;
- int16 maxX = 320;
- int16 minY = 0;
- int16 maxY = 200;
- warning("handleWinBorder %d", id);
-
- if (VAR((_winVarArrayStatus / 4) + id) & 8)
- minX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) >> 16L);
- if (VAR((_winVarArrayStatus / 4) + id) & 16)
- maxX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) & 0xFFFFL);
- if (VAR((_winVarArrayStatus / 4) + id) & 32)
- minY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) >> 16L);
- if (VAR((_winVarArrayStatus / 4) + id) & 64)
- maxY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) & 0xFFFFL);
-
- _vm->_global->_inter_mouseX = _fascinWin[id].left;
- _vm->_global->_inter_mouseY = _fascinWin[id].top;
-
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
-
- winTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
- _cursorX = _vm->_global->_inter_mouseX;
- _cursorY = _vm->_global->_inter_mouseY;
-
- do {
- _vm->_game->checkKeys(&_vm->_global->_inter_mouseX, &_vm->_global->_inter_mouseY, &_vm->_game->_mouseButtons, 1);
-
- if (_vm->_global->_inter_mouseX != _cursorX || _vm->_global->_inter_mouseY != _cursorY) {
- if (_vm->_global->_inter_mouseX < minX) {
- _vm->_global->_inter_mouseX = minX;
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- }
-
- if (_vm->_global->_inter_mouseY < minY) {
- _vm->_global->_inter_mouseY = minY;
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- }
-
- if (_vm->_global->_inter_mouseX + _fascinWin[id].width > maxX) {
- _vm->_global->_inter_mouseX = maxX - _fascinWin[id].width;
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- }
-
- if (_vm->_global->_inter_mouseY + _fascinWin[id].height > maxY) {
- _vm->_global->_inter_mouseY = maxY - _fascinWin[id].height;
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- }
-
- winTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
- winTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
- _cursorX = _vm->_global->_inter_mouseX;
- _cursorY = _vm->_global->_inter_mouseY;
- }
- } while (_vm->_game->_mouseButtons);
- winTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
- _cursorX = _vm->_global->_inter_mouseX;
- _cursorY = _vm->_global->_inter_mouseY;
-}
-
-int16 Draw::handleCurWin() {
- int8 matchNum = 0;
- int16 bestMatch = -1;
-
- if ((_vm->_game->_mouseButtons != 1) || ((_renderFlags & 128) == 0))
- return 0;
-
- for (int i = 0; i < 10; i++)
- if (_fascinWin[i].id != -1) {
- if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
- (_vm->_global->_inter_mouseX < _fascinWin[i].left + _fascinWin[i].width) &&
- (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
- (_vm->_global->_inter_mouseY < _fascinWin[i].top + _fascinWin[i].height)) {
-
- if (_fascinWin[i].id == _winCount - 1) {
- if ((_vm->_global->_inter_mouseX < _fascinWin[i].left + 12) &&
- (_vm->_global->_inter_mouseY < _fascinWin[i].top + 12) &&
- (VAR(_winVarArrayStatus / 4 + i) & 2)) {
-
- blitCursor();
- activeWin(i);
- closeWin(i);
- _vm->_util->waitMouseRelease(1);
- return i;
- }
-
- if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left + _fascinWin[i].width - 12) &&
- (_vm->_global->_inter_mouseY < _fascinWin[i].top + 12) &&
- (VAR(_winVarArrayStatus / 4 + i) & 4) &&
- (_vm->_global->_mousePresent) &&
- (_vm->_global->_videoMode != 0x07)) {
-
- blitCursor();
- handleWinBorder(i);
- winMove(i);
- _vm->_global->_inter_mouseX = _fascinWin[i].left + _fascinWin[i].width - 11;
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- return -i;
- }
-
- return 0;
-
- } else
- if (_fascinWin[i].id > bestMatch) {
- bestMatch = _fascinWin[i].id;
- matchNum = i;
- }
- }
- }
- if (bestMatch != -1) {
- warning("handleCurWin - activeWin %d", matchNum);
- blitCursor();
- activeWin(matchNum);
- }
-
- return 0;
-}
-
-void Draw::winDecomp(int16 x, int16 y, SurfaceDescPtr destPtr) {
- warning("winDecomp %d %d - getResource %d %d %d", x, y, _spriteLeft, _spriteRight, _spriteBottom);
-
- Resource *resource;
- resource = _vm->_game->_resources->getResource((uint16) _spriteLeft,
- &_spriteRight, &_spriteBottom);
-
- if (!resource)
- return;
-
- _vm->_video->drawPackedSprite(resource->getData(),
- _spriteRight, _spriteBottom, x, y, _transparency, *destPtr);
-
- delete resource;
- return;
-}
-
-void Draw::winDraw(int16 fct) {
- int16 left;
- int16 top;
- int16 width;
- int16 height;
-
- warning("winDraw %d", fct);
-
- bool found = false;
- int len;
- Resource *resource;
- int table[10];
- SurfaceDescPtr tempSrf;
-
- if (_destSurface == kBackSurface) {
-
- if (_vm->_global->_curWinId) {
- if (_fascinWin[_vm->_global->_curWinId].id == -1)
- return;
-
- else {
- _destSpriteX += _fascinWin[_vm->_global->_curWinId].left;
- _destSpriteY += _fascinWin[_vm->_global->_curWinId].top;
- if (fct == 3 || (fct >= 7 && fct <= 9)) {
- _spriteRight += _fascinWin[_vm->_global->_curWinId].left;
- _spriteBottom += _fascinWin[_vm->_global->_curWinId].top;
- }
- }
- }
-
- left = _destSpriteX;
- top = _destSpriteY;
-
- } else {
- if (_vm->_global->_curWinId) {
- if (_fascinWin[_vm->_global->_curWinId].id == -1)
- return;
- else {
- _spriteLeft += _fascinWin[_vm->_global->_curWinId].left;
- _spriteTop += _fascinWin[_vm->_global->_curWinId].top;
- }
- }
-
- left = _spriteLeft;
- top = _spriteTop;
- }
-
- for (int i = 0; i < 10; i++)
- table[i] = 0;
-
- switch (fct) {
- case DRAW_BLITSURF: // 0 - move
- case DRAW_FILLRECT: // 2 - fill rectangle
- width = left + _spriteRight - 1;
- height = top + _spriteBottom - 1;
- break;
-
- case DRAW_PUTPIXEL: // 1 - put a pixel
- width = _destSpriteX;
- height = _destSpriteY;
- break;
-
- case DRAW_DRAWLINE: // 3 - draw line
- case DRAW_DRAWBAR: // 7 - draw border
- case DRAW_CLEARRECT: // 8 - clear rectangle
- case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
- width = _spriteRight;
- height = _spriteBottom;
- break;
-
- case DRAW_INVALIDATE: // 4 - Draw a circle
- left = _destSpriteX - _spriteRight;
- top = _destSpriteY - _spriteRight;
- width = _destSpriteX + _spriteRight;
- height = _destSpriteY + _spriteBottom;
- break;
-
- case DRAW_LOADSPRITE: // 5 - Uncompress and load a sprite
- // TODO: check the implementation, currently dirty cut and paste of DRAW_SPRITE code
- resource = _vm->_game->_resources->getResource((_spriteLeft & 0x3FFF),
- &_spriteRight, &_spriteBottom);
-
- if (!resource) {
- width = 0;
- height = 0;
- break;
- }
-
- _vm->_video->drawPackedSprite(resource->getData(),
- _spriteRight, _spriteBottom, _destSpriteX, _destSpriteY,
- _transparency, *_spritesArray[_destSurface]);
-
- dirtiedRect(_destSurface, _destSpriteX, _destSpriteY,
- _destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1);
-
- delete resource;
-
- width = _destSpriteX + _spriteRight - 1;
- height = _destSpriteY + _spriteBottom - 1;
- break;
-
- case DRAW_PRINTTEXT: // 6 - Display string
- width = _destSpriteX - 1 + strlen(_textToPrint) * _fonts[_fontIndex]->getCharWidth();
- height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
- break;
-
- case DRAW_DRAWLETTER: // 10 - Display a character
- if (_fontToSprite[_fontIndex].sprite == -1) {
- width = _destSpriteX - 1 + _fonts[_fontIndex]->getCharWidth();
- height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
- } else {
- width = _destSpriteX + _fontToSprite[_fontIndex].width - 1;
- height = _destSpriteY + _fontToSprite[_fontIndex].height - 1;
- }
- break;
-
- default:
- width = 0;
- height = 0;
- warning("Unexpected fct value %d", fct);
- break;
- }
-
- for (int i = 0; i < 10; i++)
- if ((i != _vm->_global->_curWinId) && (_fascinWin[i].id != -1))
- if (!_vm->_global->_curWinId || _fascinWin[i].id>_fascinWin[_vm->_global->_curWinId].id)
- if ((_fascinWin[i].left + _fascinWin[i].width > left) && (width >= _fascinWin[i].left) &&
- (_fascinWin[i].top + _fascinWin[i].height > top ) && (height >= _fascinWin[i].top)) {
- found = true;
- table[_fascinWin[i].id] = i;
- }
-
- if ((_sourceSurface == kBackSurface) && (fct == 0)) {
- _vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_spritesArray[_destSurface],
- _spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
- _spriteTop + _spriteBottom - 1, _destSpriteX, _destSpriteY, _transparency);
- if (!found)
- return;
-
- int j = 0;
- if (_vm->_global->_curWinId != 0)
- j = _fascinWin[_vm->_global->_curWinId].id + 1;
-
- for (int i = 9; i >= j; i--) {
- if (table[i])
- _vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *_spritesArray[_destSurface],
- _fascinWin[table[i]].left & 7, 0,
- (_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
- _fascinWin[table[i]].height - 1, _fascinWin[table[i]].left - _spriteLeft + _destSpriteX,
- _fascinWin[table[i]].top - _spriteTop + _destSpriteY, 0);
- }
- return;
- }
-
- if (found) {
- tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width - left + 1, height - top + 1, 0);
- _vm->_video->drawSprite(*_backSurface, *tempSrf, left, top, width, height, 0, 0, 0);
-
- int max = 0;
- if (_vm->_global->_curWinId != 0)
- max = _fascinWin[_vm->_global->_curWinId].id + 1;
-
- for (int i = 9; i >= max; i--) {
- if (table[i])
- _vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *tempSrf,
- _fascinWin[table[i]].left & 7, 0,
- (_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
- _fascinWin[table[i]].height - 1,
- _fascinWin[table[i]].left - left,
- _fascinWin[table[i]].top - top , 0);
- }
-
- invalidateRect(left, top, width, height);
-
- switch (fct) {
- case DRAW_BLITSURF: // 0 - move
- _vm->_video->drawSprite(*_spritesArray[_sourceSurface], *tempSrf,
- _spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
- _spriteTop + _spriteBottom - 1, 0, 0, _transparency);
- break;
-
- case DRAW_PUTPIXEL: // 1 - put a pixel
- _vm->_video->putPixel(0, 0, _frontColor, *tempSrf);
- break;
-
- case DRAW_FILLRECT: // 2 - fill rectangle
- _vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - 1, _spriteBottom - 1, _backColor);
- break;
-
- case DRAW_DRAWLINE: // 3 - draw line
- _vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
- break;
-
- case DRAW_INVALIDATE: // 4 - Draw a circle
- _vm->_video->drawCircle(*tempSrf, _spriteRight, _spriteRight, _spriteRight, _frontColor);
- break;
-
- case DRAW_LOADSPRITE: // 5 - Uncompress and load a sprite
- winDecomp(0, 0, tempSrf);
- break;
-
- case DRAW_PRINTTEXT: // 6 - Display string
- len = strlen(_textToPrint);
- for (int j = 0; j < len; j++)
- _vm->_video->drawLetter(_textToPrint[j], j * _fonts[_fontIndex]->getCharWidth(), 0,
- *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
- _destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
- break;
-
- case DRAW_DRAWBAR: // 7 - draw border
- _vm->_video->drawLine(*tempSrf, 0, _spriteBottom - _destSpriteY, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
- _vm->_video->drawLine(*tempSrf, 0, 0, 0, _spriteBottom - _destSpriteY, _frontColor);
- _vm->_video->drawLine(*tempSrf, _spriteRight - _destSpriteX, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
- _vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, 0, _frontColor);
- break;
-
- case DRAW_CLEARRECT: // 8 - clear rectangle
- if (_backColor < 16)
- _vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
- break;
-
- case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
- _vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
- break;
-
- case DRAW_DRAWLETTER: // 10 - Display a character
- if (_fontToSprite[_fontIndex].sprite == -1) {
-
- if (_letterToPrint)
- _vm->_video->drawLetter(_letterToPrint, 0, 0, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
- } else {
- int xx, yy, nn;
- nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
- yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
- xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
- _vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *tempSrf,
- xx, yy, xx + _fontToSprite[_fontIndex].width - 1,
- yy + _fontToSprite[_fontIndex].height - 1, 0, 0, _transparency);
- }
- break;
-
- default:
- warning("Unexpected fct value");
- break;
- }
-
- int i = 0;
- if (_vm->_global->_curWinId != 0)
- i = _fascinWin[_vm->_global->_curWinId].id + 1;
-
- for (; i < 10; i++) {
- if (table[i]) {
- int k = table[i];
- _vm->_video->drawSprite(*tempSrf, *_fascinWin[k].savedSurface,
- 0, 0, width - left, height - top,
- left - _fascinWin[k].left + (_fascinWin[k].left & 7),
- top - _fascinWin[k].top, 0);
- // Shift skipped as always set to zero (?)
- _vm->_video->drawSprite(*_frontSurface, *tempSrf,
- MAX(left , _fascinWin[k].left),
- MAX(top , _fascinWin[k].top),
- MIN(width , (int16) (_fascinWin[k].left + _fascinWin[k].width - 1)),
- MIN(height, (int16) (_fascinWin[k].top + _fascinWin[k].height - 1)),
- MAX(left , _fascinWin[k].left) - left,
- MAX(top , _fascinWin[k].top) - top, 0);
- if (_cursorIndex != -1)
- _vm->_video->drawSprite(*_cursorSpritesBack, *tempSrf,
- 0, 0, _cursorWidth - 1, _cursorHeight - 1,
- _cursorX - left, _cursorY - top, 0);
- for (int j = 9; j > i; j--) {
- if (table[j] && winOverlap(k, table[j])) {
- int l = table[j];
- _vm->_video->drawSprite(*_fascinWin[l].savedSurface, *tempSrf,
- MAX(_fascinWin[l].left, _fascinWin[k].left)
- - _fascinWin[l].left + (_fascinWin[l].left & 7),
- MAX(_fascinWin[l].top , _fascinWin[k].top ) - _fascinWin[l].top,
- MIN(_fascinWin[l].left + _fascinWin[l].width - 1, _fascinWin[k].left + _fascinWin[k].width - 1)
- - _fascinWin[l].left + (_fascinWin[l].left & 7),
- MIN(_fascinWin[l].top + _fascinWin[l].height - 1, _fascinWin[k].top + _fascinWin[k].height - 1)
- - _fascinWin[l].top,
- MAX(_fascinWin[l].left, _fascinWin[k].left) - left,
- MAX(_fascinWin[l].top , _fascinWin[k].top ) - top, 0);
- }
- }
- }
- }
- _vm->_video->drawSprite(*tempSrf, *_backSurface, 0, 0, width - left, height - top, left, top, 0);
- tempSrf.reset();
- } else {
- invalidateRect(left, top, width, height);
- switch (fct) {
- case DRAW_BLITSURF: // 0 - move
- _vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_backSurface,
- _spriteLeft, _spriteTop,
- _spriteLeft + _spriteRight - 1,
- _spriteTop + _spriteBottom - 1,
- _destSpriteX, _destSpriteY, _transparency);
- break;
- case DRAW_PUTPIXEL: // 1 - put a pixel
- _vm->_video->putPixel(_destSpriteX, _destSpriteY, _frontColor, *_backSurface);
- break;
-
- case DRAW_FILLRECT: // 2 - fill rectangle
- _vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1, _backColor);
- break;
-
- case DRAW_DRAWLINE: // 3 - draw line
- _vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _frontColor);
- break;
-
- case DRAW_INVALIDATE: // 4 - Draw a circle
- _vm->_video->drawCircle(*_backSurface, _spriteRight, _spriteRight, _spriteRight, _frontColor);
- break;
-
- case DRAW_LOADSPRITE: // 5 - Uncompress and load a sprite
- winDecomp(_destSpriteX, _destSpriteY, _backSurface);
- break;
-
- case DRAW_PRINTTEXT: // 6 - Display string
- len = strlen(_textToPrint);
- for (int j = 0; j < len; j++)
- _vm->_video->drawLetter(_textToPrint[j], _destSpriteX + j * _fonts[_fontIndex]->getCharWidth(),
- _destSpriteY, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *_backSurface);
- _destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
- break;
-
- case DRAW_DRAWBAR: // 7 - draw border
- _vm->_video->drawLine(*_backSurface, _destSpriteX, _spriteBottom, _spriteRight, _spriteBottom, _frontColor);
- _vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _destSpriteX, _spriteBottom, _frontColor);
- _vm->_video->drawLine(*_backSurface, _spriteRight, _destSpriteY, _spriteRight, _spriteBottom, _frontColor);
- _vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _destSpriteY, _frontColor);
- break;
-
- case DRAW_CLEARRECT: // 8 - clear rectangle
- if (_backColor < 16)
- _vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
- break;
-
- case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
- _vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
- break;
-
- case DRAW_DRAWLETTER: // 10 - Display a character
- if (_fontToSprite[_fontIndex].sprite == -1) {
- if (_letterToPrint)
- _vm->_video->drawLetter(_letterToPrint, _destSpriteX, _destSpriteY, *_fonts[_fontIndex], _transparency,
- _frontColor, _backColor, *_spritesArray[_destSurface]);
- } else {
- int xx, yy, nn;
- nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
- yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
- xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
- _vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *_spritesArray[_destSurface],
- xx, yy,
- xx + _fontToSprite[_fontIndex].width - 1,
- yy + _fontToSprite[_fontIndex].height - 1,
- _destSpriteX, _destSpriteY, _transparency);
- }
- break;
-
- default:
- warning("Unexpected fct value");
- break;
- }
- }
-
- if (_renderFlags & 16) {
- if (_sourceSurface == kBackSurface) {
- _spriteLeft -= _backDeltaX;
- _spriteTop -= _backDeltaY;
- }
- if (_destSurface == kBackSurface) {
- _destSpriteX -= _backDeltaX;
- _destSpriteY -= _backDeltaY;
- }
- }
-
- if (_vm->_global->_curWinId) {
- _destSpriteX -= _fascinWin[_vm->_global->_curWinId].left;
- _destSpriteY -= _fascinWin[_vm->_global->_curWinId].top;
- }
-}
-
-int16 Draw::isOverWin(int16 &dx, int16 &dy) {
- int16 bestMatch = -1;
-
- if ((_renderFlags & 128) == 0)
- return -1;
-
- for (int i = 0; i < 10; i++)
- if (_fascinWin[i].id != -1) {
- if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
- (_vm->_global->_inter_mouseX < _fascinWin[i].left + _fascinWin[i].width) &&
- (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
- (_vm->_global->_inter_mouseY < _fascinWin[i].top + _fascinWin[i].height)) {
-
- if (_fascinWin[i].id == _winCount - 1) {
- dx = _fascinWin[i].left;
- dy = _fascinWin[i].top;
- return(i);
- } else
- if (_fascinWin[i].id > bestMatch)
- bestMatch = _fascinWin[i].id;
- }
- }
-
- if (bestMatch != -1)
- return(0);
- else
- return(-1);
-}
int32 Draw::getSpriteRectSize(int16 index) {
if (!_spritesArray[index])
return 0;
diff --git a/engines/gob/draw.h b/engines/gob/draw.h
index fa3cbb84cc..cbadde8e27 100644
--- a/engines/gob/draw.h
+++ b/engines/gob/draw.h
@@ -192,21 +192,6 @@ public:
int16 bottom, const char *str, int16 fontIndex, int16 color);
void oPlaytoons_sub_F_1B( uint16 id, int16 left, int16 top, int16 right, int16 bottom, char *paramStr, int16 var3, int16 var4, int16 shortId);
- int16 openWin(int16 id);
- int16 handleCurWin();
- bool winOverlap(int16 idWin1, int16 idWin2);
- void winDecomp(int16 x, int16 y, SurfaceDescPtr destPtr);
- void activeWin(int16 id);
- void closeWin(int16 id);
- void closeAllWin();
- void restoreWin(int16 i);
- void saveWin(int16 id);
- void winMove(int16 id);
- void handleWinBorder(int16 id);
- void winDraw(int16 fct);
- void winTrace(int16 left, int16 top, int16 width, int16 height);
- int16 isOverWin(int16 &dx, int16 &dy);
-
int32 getSpriteRectSize(int16 index);
void forceBlit(bool backwards = false);
@@ -223,6 +208,15 @@ public:
virtual void printTotText(int16 id) = 0;
virtual void spriteOperation(int16 operation) = 0;
+ virtual int16 openWin(int16 id) { return 0; }
+ virtual void closeWin(int16 id) {}
+ virtual int16 handleCurWin() { return 0; }
+ virtual int16 getWinFromCoord(int16 &dx, int16 &dy) { return -1; }
+ virtual void moveWin(int16 id) {}
+ virtual bool overlapWin(int16 idWin1, int16 idWin2) { return false; }
+ virtual void closeAllWin() {}
+ virtual void activeWin(int16 id) {}
+
Draw(GobEngine *vm);
virtual ~Draw();
@@ -272,6 +266,23 @@ public:
Draw_Fascination(GobEngine *vm);
virtual ~Draw_Fascination() {}
virtual void spriteOperation(int16 operation);
+
+ void decompWin(int16 x, int16 y, SurfaceDescPtr destPtr);
+ void drawWin(int16 fct);
+ void saveWin(int16 id);
+ void restoreWin(int16 id);
+ void handleWinBorder(int16 id);
+ void drawWinTrace(int16 left, int16 top, int16 width, int16 height);
+
+ virtual int16 openWin(int16 id);
+ virtual void closeWin(int16 id);
+ virtual int16 getWinFromCoord(int16 &dx, int16 &dy);
+ virtual int16 handleCurWin();
+ virtual void activeWin(int16 id);
+ virtual void moveWin(int16 id);
+ virtual bool overlapWin(int16 idWin1, int16 idWin2);
+ virtual void closeAllWin();
+
};
class Draw_Playtoons: public Draw_v2 {
diff --git a/engines/gob/draw_fascin.cpp b/engines/gob/draw_fascin.cpp
index 1e01db7dfb..dcb76d722c 100644
--- a/engines/gob/draw_fascin.cpp
+++ b/engines/gob/draw_fascin.cpp
@@ -28,6 +28,8 @@
#include "gob/draw.h"
#include "gob/game.h"
+#include "gob/global.h"
+#include "gob/inter.h"
#include "gob/resources.h"
namespace Gob {
@@ -71,7 +73,7 @@ void Draw_Fascination::spriteOperation(int16 operation) {
if (_renderFlags & 0x20) {
if (_destSurface == kBackSurface || (operation == 0 && _sourceSurface == kBackSurface)) {
- winDraw(operation);
+ drawWin(operation);
return;
}
}
@@ -352,4 +354,777 @@ void Draw_Fascination::spriteOperation(int16 operation) {
}
}
+void Draw_Fascination::drawWin(int16 fct) {
+ int16 left;
+ int16 top;
+ int16 width;
+ int16 height;
+
+ bool found = false;
+ int len;
+ Resource *resource;
+ int table[10];
+ SurfaceDescPtr tempSrf;
+
+ if (_destSurface == kBackSurface) {
+
+ if (_vm->_global->_curWinId) {
+ if (_fascinWin[_vm->_global->_curWinId].id == -1)
+ return;
+
+ else {
+ _destSpriteX += _fascinWin[_vm->_global->_curWinId].left;
+ _destSpriteY += _fascinWin[_vm->_global->_curWinId].top;
+ if (fct == 3 || (fct >= 7 && fct <= 9)) {
+ _spriteRight += _fascinWin[_vm->_global->_curWinId].left;
+ _spriteBottom += _fascinWin[_vm->_global->_curWinId].top;
+ }
+ }
+ }
+
+ left = _destSpriteX;
+ top = _destSpriteY;
+
+ } else {
+ if (_vm->_global->_curWinId) {
+ if (_fascinWin[_vm->_global->_curWinId].id == -1)
+ return;
+ else {
+ _spriteLeft += _fascinWin[_vm->_global->_curWinId].left;
+ _spriteTop += _fascinWin[_vm->_global->_curWinId].top;
+ }
+ }
+
+ left = _spriteLeft;
+ top = _spriteTop;
+ }
+
+ for (int i = 0; i < 10; i++)
+ table[i] = 0;
+
+ switch (fct) {
+ case DRAW_BLITSURF: // 0 - move
+ case DRAW_FILLRECT: // 2 - fill rectangle
+ width = left + _spriteRight - 1;
+ height = top + _spriteBottom - 1;
+ break;
+
+ case DRAW_PUTPIXEL: // 1 - put a pixel
+ width = _destSpriteX;
+ height = _destSpriteY;
+ break;
+
+ case DRAW_DRAWLINE: // 3 - draw line
+ case DRAW_DRAWBAR: // 7 - draw border
+ case DRAW_CLEARRECT: // 8 - clear rectangle
+ case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
+ width = _spriteRight;
+ height = _spriteBottom;
+ break;
+
+ case DRAW_INVALIDATE: // 4 - Draw a circle
+ left = _destSpriteX - _spriteRight;
+ top = _destSpriteY - _spriteRight;
+ width = _destSpriteX + _spriteRight;
+ height = _destSpriteY + _spriteBottom;
+ break;
+
+ case DRAW_LOADSPRITE: // 5 - Uncompress and load a sprite
+ // TODO: check the implementation, currently dirty cut and paste of DRAW_SPRITE code
+ resource = _vm->_game->_resources->getResource((_spriteLeft & 0x3FFF),
+ &_spriteRight, &_spriteBottom);
+
+ if (!resource) {
+ width = 0;
+ height = 0;
+ break;
+ }
+
+ _vm->_video->drawPackedSprite(resource->getData(),
+ _spriteRight, _spriteBottom, _destSpriteX, _destSpriteY,
+ _transparency, *_spritesArray[_destSurface]);
+
+ dirtiedRect(_destSurface, _destSpriteX, _destSpriteY,
+ _destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1);
+
+ delete resource;
+
+ width = _destSpriteX + _spriteRight - 1;
+ height = _destSpriteY + _spriteBottom - 1;
+ break;
+
+ case DRAW_PRINTTEXT: // 6 - Display string
+ width = _destSpriteX - 1 + strlen(_textToPrint) * _fonts[_fontIndex]->getCharWidth();
+ height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
+ break;
+
+ case DRAW_DRAWLETTER: // 10 - Display a character
+ if (_fontToSprite[_fontIndex].sprite == -1) {
+ width = _destSpriteX - 1 + _fonts[_fontIndex]->getCharWidth();
+ height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
+ } else {
+ width = _destSpriteX + _fontToSprite[_fontIndex].width - 1;
+ height = _destSpriteY + _fontToSprite[_fontIndex].height - 1;
+ }
+ break;
+
+ default:
+ error("winDraw - Unexpected fct value %d", fct);
+ break;
+ }
+
+ for (int i = 0; i < 10; i++) {
+ if ((i != _vm->_global->_curWinId) && (_fascinWin[i].id != -1)) {
+ if (!_vm->_global->_curWinId || _fascinWin[i].id>_fascinWin[_vm->_global->_curWinId].id) {
+ if ((_fascinWin[i].left + _fascinWin[i].width > left) && (width >= _fascinWin[i].left) &&
+ (_fascinWin[i].top + _fascinWin[i].height > top ) && (height >= _fascinWin[i].top)) {
+ found = true;
+ table[_fascinWin[i].id] = i;
+ }
+ }
+ }
+ }
+
+ if ((_sourceSurface == kBackSurface) && (fct == 0)) {
+ _vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_spritesArray[_destSurface],
+ _spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
+ _spriteTop + _spriteBottom - 1, _destSpriteX, _destSpriteY, _transparency);
+ if (!found)
+ return;
+
+ int j = 0;
+ if (_vm->_global->_curWinId != 0)
+ j = _fascinWin[_vm->_global->_curWinId].id + 1;
+
+ for (int i = 9; i >= j; i--) {
+ if (table[i])
+ _vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *_spritesArray[_destSurface],
+ _fascinWin[table[i]].left & 7, 0,
+ (_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
+ _fascinWin[table[i]].height - 1, _fascinWin[table[i]].left - _spriteLeft + _destSpriteX,
+ _fascinWin[table[i]].top - _spriteTop + _destSpriteY, 0);
+ }
+ return;
+ }
+
+ if (found) {
+ tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width - left + 1, height - top + 1, 0);
+ _vm->_video->drawSprite(*_backSurface, *tempSrf, left, top, width, height, 0, 0, 0);
+
+ int max = 0;
+ if (_vm->_global->_curWinId != 0)
+ max = _fascinWin[_vm->_global->_curWinId].id + 1;
+
+ for (int i = 9; i >= max; i--) {
+ if (table[i])
+ _vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *tempSrf,
+ _fascinWin[table[i]].left & 7, 0,
+ (_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
+ _fascinWin[table[i]].height - 1,
+ _fascinWin[table[i]].left - left,
+ _fascinWin[table[i]].top - top , 0);
+ }
+
+ invalidateRect(left, top, width, height);
+
+ switch (fct) {
+ case DRAW_BLITSURF: // 0 - move
+ _vm->_video->drawSprite(*_spritesArray[_sourceSurface], *tempSrf,
+ _spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
+ _spriteTop + _spriteBottom - 1, 0, 0, _transparency);
+ break;
+
+ case DRAW_PUTPIXEL: // 1 - put a pixel
+ _vm->_video->putPixel(0, 0, _frontColor, *tempSrf);
+ break;
+
+ case DRAW_FILLRECT: // 2 - fill rectangle
+ _vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - 1, _spriteBottom - 1, _backColor);
+ break;
+
+ case DRAW_DRAWLINE: // 3 - draw line
+ _vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
+ break;
+
+ case DRAW_INVALIDATE: // 4 - Draw a circle
+ _vm->_video->drawCircle(*tempSrf, _spriteRight, _spriteRight, _spriteRight, _frontColor);
+ break;
+
+ case DRAW_LOADSPRITE: // 5 - Uncompress and load a sprite
+ decompWin(0, 0, tempSrf);
+ break;
+
+ case DRAW_PRINTTEXT: // 6 - Display string
+ len = strlen(_textToPrint);
+ for (int j = 0; j < len; j++)
+ _vm->_video->drawLetter(_textToPrint[j], j * _fonts[_fontIndex]->getCharWidth(), 0,
+ *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
+ _destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
+ break;
+
+ case DRAW_DRAWBAR: // 7 - draw border
+ _vm->_video->drawLine(*tempSrf, 0, _spriteBottom - _destSpriteY, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
+ _vm->_video->drawLine(*tempSrf, 0, 0, 0, _spriteBottom - _destSpriteY, _frontColor);
+ _vm->_video->drawLine(*tempSrf, _spriteRight - _destSpriteX, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
+ _vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, 0, _frontColor);
+ break;
+
+ case DRAW_CLEARRECT: // 8 - clear rectangle
+ if (_backColor < 16)
+ _vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
+ break;
+
+ case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
+ _vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
+ break;
+
+ case DRAW_DRAWLETTER: // 10 - Display a character
+ if (_fontToSprite[_fontIndex].sprite == -1) {
+
+ if (_letterToPrint)
+ _vm->_video->drawLetter(_letterToPrint, 0, 0, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
+ } else {
+ int xx, yy, nn;
+ nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
+ yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
+ xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
+ _vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *tempSrf,
+ xx, yy, xx + _fontToSprite[_fontIndex].width - 1,
+ yy + _fontToSprite[_fontIndex].height - 1, 0, 0, _transparency);
+ }
+ break;
+
+ default:
+ error("winDraw - Unexpected fct value %d", fct);
+ break;
+ }
+
+ int i = 0;
+ if (_vm->_global->_curWinId != 0)
+ i = _fascinWin[_vm->_global->_curWinId].id + 1;
+
+ for (; i < 10; i++) {
+ if (table[i]) {
+ int k = table[i];
+ _vm->_video->drawSprite(*tempSrf, *_fascinWin[k].savedSurface,
+ 0, 0, width - left, height - top,
+ left - _fascinWin[k].left + (_fascinWin[k].left & 7),
+ top - _fascinWin[k].top, 0);
+ // Shift skipped as always set to zero (?)
+ _vm->_video->drawSprite(*_frontSurface, *tempSrf,
+ MAX(left , _fascinWin[k].left),
+ MAX(top , _fascinWin[k].top),
+ MIN(width , (int16) (_fascinWin[k].left + _fascinWin[k].width - 1)),
+ MIN(height, (int16) (_fascinWin[k].top + _fascinWin[k].height - 1)),
+ MAX(left , _fascinWin[k].left) - left,
+ MAX(top , _fascinWin[k].top) - top, 0);
+ if (_cursorIndex != -1)
+ _vm->_video->drawSprite(*_cursorSpritesBack, *tempSrf,
+ 0, 0, _cursorWidth - 1, _cursorHeight - 1,
+ _cursorX - left, _cursorY - top, 0);
+ for (int j = 9; j > i; j--) {
+ if (table[j] && overlapWin(k, table[j])) {
+ int l = table[j];
+ _vm->_video->drawSprite(*_fascinWin[l].savedSurface, *tempSrf,
+ MAX(_fascinWin[l].left, _fascinWin[k].left)
+ - _fascinWin[l].left + (_fascinWin[l].left & 7),
+ MAX(_fascinWin[l].top , _fascinWin[k].top ) - _fascinWin[l].top,
+ MIN(_fascinWin[l].left + _fascinWin[l].width - 1, _fascinWin[k].left + _fascinWin[k].width - 1)
+ - _fascinWin[l].left + (_fascinWin[l].left & 7),
+ MIN(_fascinWin[l].top + _fascinWin[l].height - 1, _fascinWin[k].top + _fascinWin[k].height - 1)
+ - _fascinWin[l].top,
+ MAX(_fascinWin[l].left, _fascinWin[k].left) - left,
+ MAX(_fascinWin[l].top , _fascinWin[k].top ) - top, 0);
+ }
+ }
+ }
+ }
+ _vm->_video->drawSprite(*tempSrf, *_backSurface, 0, 0, width - left, height - top, left, top, 0);
+ tempSrf.reset();
+ } else {
+ invalidateRect(left, top, width, height);
+ switch (fct) {
+ case DRAW_BLITSURF: // 0 - move
+ _vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_backSurface,
+ _spriteLeft, _spriteTop,
+ _spriteLeft + _spriteRight - 1,
+ _spriteTop + _spriteBottom - 1,
+ _destSpriteX, _destSpriteY, _transparency);
+ break;
+ case DRAW_PUTPIXEL: // 1 - put a pixel
+ _vm->_video->putPixel(_destSpriteX, _destSpriteY, _frontColor, *_backSurface);
+ break;
+
+ case DRAW_FILLRECT: // 2 - fill rectangle
+ _vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1, _backColor);
+ break;
+
+ case DRAW_DRAWLINE: // 3 - draw line
+ _vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _frontColor);
+ break;
+
+ case DRAW_INVALIDATE: // 4 - Draw a circle
+ _vm->_video->drawCircle(*_backSurface, _spriteRight, _spriteRight, _spriteRight, _frontColor);
+ break;
+
+ case DRAW_LOADSPRITE: // 5 - Uncompress and load a sprite
+ decompWin(_destSpriteX, _destSpriteY, _backSurface);
+ break;
+
+ case DRAW_PRINTTEXT: // 6 - Display string
+ len = strlen(_textToPrint);
+ for (int j = 0; j < len; j++)
+ _vm->_video->drawLetter(_textToPrint[j], _destSpriteX + j * _fonts[_fontIndex]->getCharWidth(),
+ _destSpriteY, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *_backSurface);
+ _destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
+ break;
+
+ case DRAW_DRAWBAR: // 7 - draw border
+ _vm->_video->drawLine(*_backSurface, _destSpriteX, _spriteBottom, _spriteRight, _spriteBottom, _frontColor);
+ _vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _destSpriteX, _spriteBottom, _frontColor);
+ _vm->_video->drawLine(*_backSurface, _spriteRight, _destSpriteY, _spriteRight, _spriteBottom, _frontColor);
+ _vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _destSpriteY, _frontColor);
+ break;
+
+ case DRAW_CLEARRECT: // 8 - clear rectangle
+ if (_backColor < 16)
+ _vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
+ break;
+
+ case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
+ _vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
+ break;
+
+ case DRAW_DRAWLETTER: // 10 - Display a character
+ if (_fontToSprite[_fontIndex].sprite == -1) {
+ if (_letterToPrint)
+ _vm->_video->drawLetter(_letterToPrint, _destSpriteX, _destSpriteY, *_fonts[_fontIndex], _transparency,
+ _frontColor, _backColor, *_spritesArray[_destSurface]);
+ } else {
+ int xx, yy, nn;
+ nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
+ yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
+ xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
+ _vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *_spritesArray[_destSurface],
+ xx, yy,
+ xx + _fontToSprite[_fontIndex].width - 1,
+ yy + _fontToSprite[_fontIndex].height - 1,
+ _destSpriteX, _destSpriteY, _transparency);
+ }
+ break;
+
+ default:
+ error("winDraw - Unexpected fct value");
+ break;
+ }
+ }
+
+ if (_renderFlags & 16) {
+ if (_sourceSurface == kBackSurface) {
+ _spriteLeft -= _backDeltaX;
+ _spriteTop -= _backDeltaY;
+ }
+ if (_destSurface == kBackSurface) {
+ _destSpriteX -= _backDeltaX;
+ _destSpriteY -= _backDeltaY;
+ }
+ }
+
+ if (_vm->_global->_curWinId) {
+ _destSpriteX -= _fascinWin[_vm->_global->_curWinId].left;
+ _destSpriteY -= _fascinWin[_vm->_global->_curWinId].top;
+ }
+}
+
+void Draw_Fascination::decompWin(int16 x, int16 y, SurfaceDescPtr destPtr) {
+ Resource *resource;
+ resource = _vm->_game->_resources->getResource((uint16) _spriteLeft,
+ &_spriteRight, &_spriteBottom);
+
+ if (!resource)
+ return;
+
+ _vm->_video->drawPackedSprite(resource->getData(),
+ _spriteRight, _spriteBottom, x, y, _transparency, *destPtr);
+
+ delete resource;
+ return;
+}
+
+int16 Draw_Fascination::openWin(int16 id) {
+ if (_fascinWin[id].id != -1)
+ return 0;
+
+ _fascinWin[id].id = _winCount++;
+ _fascinWin[id].left = VAR((_winVarArrayLeft / 4) + id);
+ _fascinWin[id].top = VAR((_winVarArrayTop / 4) + id);
+ _fascinWin[id].width = VAR((_winVarArrayWidth / 4) + id);
+ _fascinWin[id].height = VAR((_winVarArrayHeight / 4) + id);
+
+ _fascinWin[id].savedSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
+
+ saveWin(id);
+ WRITE_VAR((_winVarArrayStatus / 4) + id, VAR((_winVarArrayStatus / 4) + id) & 0xFFFFFFFE);
+
+ return 1;
+}
+
+int16 Draw_Fascination::getWinFromCoord(int16 &dx, int16 &dy) {
+ int16 bestMatch = -1;
+
+ if ((_renderFlags & 128) == 0)
+ return -1;
+
+ for (int i = 0; i < 10; i++) {
+ if (_fascinWin[i].id != -1) {
+ if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
+ (_vm->_global->_inter_mouseX < _fascinWin[i].left + _fascinWin[i].width) &&
+ (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
+ (_vm->_global->_inter_mouseY < _fascinWin[i].top + _fascinWin[i].height)) {
+
+ if (_fascinWin[i].id == _winCount - 1) {
+ dx = _fascinWin[i].left;
+ dy = _fascinWin[i].top;
+ return(i);
+ } else {
+ if (_fascinWin[i].id > bestMatch)
+ bestMatch = _fascinWin[i].id;
+ }
+ }
+ }
+ }
+
+ if (bestMatch != -1)
+ return(0);
+ else
+ return(-1);
+}
+
+void Draw_Fascination::closeWin(int16 id) {
+ if (_fascinWin[id].id == -1)
+ return;
+
+ WRITE_VAR((_winVarArrayStatus / 4) + id, VAR((_winVarArrayStatus / 4) + id) | 1);
+ restoreWin(id);
+ _fascinWin[id].id = -1;
+ _fascinWin[id].savedSurface.reset();
+ _winCount--;
+}
+
+int16 Draw_Fascination::handleCurWin() {
+ int8 matchNum = 0;
+ int16 bestMatch = -1;
+
+ if ((_vm->_game->_mouseButtons != 1) || ((_renderFlags & 128) == 0))
+ return 0;
+
+ for (int i = 0; i < 10; i++) {
+ if (_fascinWin[i].id != -1) {
+ if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
+ (_vm->_global->_inter_mouseX < _fascinWin[i].left + _fascinWin[i].width) &&
+ (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
+ (_vm->_global->_inter_mouseY < _fascinWin[i].top + _fascinWin[i].height)) {
+
+ if (_fascinWin[i].id == _winCount - 1) {
+ if ((_vm->_global->_inter_mouseX < _fascinWin[i].left + 12) &&
+ (_vm->_global->_inter_mouseY < _fascinWin[i].top + 12) &&
+ (VAR(_winVarArrayStatus / 4 + i) & 2)) {
+
+ blitCursor();
+ activeWin(i);
+ closeWin(i);
+ _vm->_util->waitMouseRelease(1);
+ return i;
+ }
+
+ if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left + _fascinWin[i].width - 12) &&
+ (_vm->_global->_inter_mouseY < _fascinWin[i].top + 12) &&
+ (VAR(_winVarArrayStatus / 4 + i) & 4) &&
+ (_vm->_global->_mousePresent) &&
+ (_vm->_global->_videoMode != 0x07)) {
+
+ blitCursor();
+ handleWinBorder(i);
+ moveWin(i);
+ _vm->_global->_inter_mouseX = _fascinWin[i].left + _fascinWin[i].width - 11;
+ _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+ return -i;
+ }
+ return 0;
+ } else {
+ if (_fascinWin[i].id > bestMatch) {
+ bestMatch = _fascinWin[i].id;
+ matchNum = i;
+ }
+ }
+ }
+ }
+ }
+
+ if (bestMatch != -1) {
+ blitCursor();
+ activeWin(matchNum);
+ }
+
+ return 0;
+}
+
+void Draw_Fascination::moveWin(int16 id) {
+ int oldLeft = _fascinWin[id].left;
+ int oldTop = _fascinWin[id].top;
+
+ restoreWin(id);
+
+ _fascinWin[id].left = _vm->_global->_inter_mouseX;
+ _fascinWin[id].top = _vm->_global->_inter_mouseY;
+
+ WRITE_VAR((_winVarArrayLeft / 4) + id, _fascinWin[id].left);
+ WRITE_VAR((_winVarArrayTop / 4) + id, _fascinWin[id].top);
+
+ saveWin(id);
+
+ // Shift skipped as always set to zero (?)
+ _vm->_video->drawSprite(*_frontSurface, *_backSurface,
+ oldLeft, oldTop,
+ oldLeft + _fascinWin[id].width - 1,
+ oldTop + _fascinWin[id].height - 1,
+ _fascinWin[id].left, _fascinWin[id].top, 0);
+ invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
+ _fascinWin[id].left + _fascinWin[id].width - 1,
+ _fascinWin[id].top + _fascinWin[id].height - 1);
+}
+
+bool Draw_Fascination::overlapWin(int16 idWin1, int16 idWin2) {
+ if ((_fascinWin[idWin1].left + _fascinWin[idWin1].width <= _fascinWin[idWin2].left) ||
+ (_fascinWin[idWin2].left + _fascinWin[idWin2].width <= _fascinWin[idWin1].left) ||
+ (_fascinWin[idWin1].top + _fascinWin[idWin1].height <= _fascinWin[idWin2].top ) ||
+ (_fascinWin[idWin2].top + _fascinWin[idWin2].height <= _fascinWin[idWin1].top ))
+ return false;
+
+ return true;
+}
+
+void Draw_Fascination::activeWin(int16 id) {
+ bool found = false;
+ int16 t[10], t2[10];
+ int nextId = -1;
+ int oldId = -1;
+ SurfaceDescPtr tempSrf;
+ SurfaceDescPtr oldSrf[10];
+
+ if (_fascinWin[id].id == -1)
+ return;
+
+ blitInvalidated();
+
+ for (int i = 0; i < 10; i++) {
+ t[i] = -1;
+ t2[i] = -1;
+ oldSrf[i].reset();
+ }
+
+ for (int i = 0; i < 10; i++) {
+ if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id) && (overlapWin(i, id))) {
+ t[_fascinWin[i].id] = i;
+ found = true;
+ }
+ }
+
+ if (found) {
+ for (int i = 9; i >= 0; i--) {
+ if (t[i] != -1) {
+ if (nextId != -1)
+ _vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
+ _fascinWin[t[i]].left, _fascinWin[t[i]].top,
+ _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
+ _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1,
+ _fascinWin[t[i]].left & 7, 0, 0);
+ t2[i] = nextId;
+ restoreWin(t[i]);
+ nextId = t[i];
+ }
+ }
+
+ oldId = nextId;
+ _vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
+ _fascinWin[id].left, _fascinWin[id].top,
+ _fascinWin[id].left + _fascinWin[id].width - 1,
+ _fascinWin[id].top + _fascinWin[id].height - 1,
+ _fascinWin[id].left & 7, 0, 0);
+ restoreWin(id);
+ nextId = id;
+
+ for (int i = 0; i < 10; i++) {
+ if (t[i] != -1) {
+ _vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
+ _fascinWin[t[i]].left, _fascinWin[t[i]].top,
+ _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
+ _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1,
+ _fascinWin[t[i]].left & 7, 0, 0);
+ oldSrf[t[i]] = _fascinWin[nextId].savedSurface;
+ if (t2[i] != -1)
+ _vm->_video->drawSprite(*_fascinWin[t2[i]].savedSurface, *_backSurface,
+ _fascinWin[t[i]].left & 7, 0,
+ (_fascinWin[t[i]].left & 7) + _fascinWin[t[i]].width - 1,
+ _fascinWin[t[i]].height - 1, _fascinWin[t[i]].left,
+ _fascinWin[t[i]].top, 0);
+ else {
+ // Shift skipped as always set to zero (?)
+ _vm->_video->drawSprite(*_frontSurface, *_backSurface,
+ _fascinWin[t[i]].left, _fascinWin[t[i]].top,
+ _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
+ _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1,
+ _fascinWin[t[i]].left, _fascinWin[t[i]].top, 0);
+ }
+ invalidateRect(_fascinWin[t[i]].left, _fascinWin[t[i]].top,
+ _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
+ _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1);
+ nextId = t2[i];
+ }
+ }
+
+ tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
+ _vm->_video->drawSprite(*_backSurface, *tempSrf,
+ _fascinWin[id].left, _fascinWin[id].top,
+ _fascinWin[id].left + _fascinWin[id].width - 1,
+ _fascinWin[id].top + _fascinWin[id].height - 1,
+ _fascinWin[id].left & 7, 0, 0);
+ _vm->_video->drawSprite(*_fascinWin[oldId].savedSurface, *_backSurface,
+ _fascinWin[id].left & 7, 0,
+ (_fascinWin[id].left & 7) + _fascinWin[id].width - 1,
+ _fascinWin[id].height - 1,
+ _fascinWin[id].left, _fascinWin[id].top, 0);
+
+ _fascinWin[oldId].savedSurface.reset();
+ _fascinWin[oldId].savedSurface = tempSrf;
+ oldSrf[id] = _fascinWin[oldId].savedSurface;
+
+ invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
+ _fascinWin[id].left + _fascinWin[id].width - 1,
+ _fascinWin[id].top + _fascinWin[id].height - 1);
+ nextId = id;
+
+ for (int j = 0; j < 10; j++) {
+ if (oldSrf[j] != 0)
+ _fascinWin[j].savedSurface = oldSrf[j];
+ }
+ }
+
+ for (int i = 0; i < 10; i++) {
+ if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id))
+ _fascinWin[i].id--;
+ }
+
+ _fascinWin[id].id = _winCount - 1;
+}
+
+void Draw_Fascination::closeAllWin() {
+ for (int i = 0; i < 10; i++) {
+ activeWin(i);
+ closeWin(i);
+ }
+}
+
+void Draw_Fascination::saveWin(int16 id) {
+ _vm->_video->drawSprite(*_backSurface, *_fascinWin[id].savedSurface,
+ _fascinWin[id].left, _fascinWin[id].top,
+ _fascinWin[id].left + _fascinWin[id].width - 1,
+ _fascinWin[id].top + _fascinWin[id].height - 1,
+ _fascinWin[id].left & 7, 0, 0);
+}
+
+void Draw_Fascination::restoreWin(int16 id) {
+ _vm->_video->drawSprite(*_fascinWin[id].savedSurface, *_backSurface,
+ _fascinWin[id].left & 7, 0,
+ (_fascinWin[id].left & 7) + _fascinWin[id].width - 1, _fascinWin[id].height - 1,
+ _fascinWin[id].left, _fascinWin[id].top, 0);
+ invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
+ _fascinWin[id].left + _fascinWin[id].width - 1,
+ _fascinWin[id].top + _fascinWin[id].height - 1);
+}
+
+void Draw_Fascination::drawWinTrace(int16 left, int16 top, int16 width, int16 height) {
+ int16 right, bottom;
+
+ right = left + width - 1;
+ bottom = top + height - 1;
+
+ for (int32 x = left; x < right; x++) {
+ _frontSurface->getVidMem()[_frontSurface->getWidth() * top + x] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * top + x]) & 0xff;
+ _frontSurface->getVidMem()[_frontSurface->getWidth() * bottom + x] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * bottom + x]) & 0xff;
+ }
+
+ for (int32 y = top; y < bottom; y++) {
+ _frontSurface->getVidMem()[_frontSurface->getWidth() * y + left] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * y + left]) & 0xff;
+ _frontSurface->getVidMem()[_frontSurface->getWidth() * y + right] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * y + right]) & 0xff;
+ }
+
+ _vm->_video->dirtyRectsAll();
+ _vm->_video->retrace(true);
+}
+
+void Draw_Fascination::handleWinBorder(int16 id) {
+ int16 minX = 0;
+ int16 maxX = 320;
+ int16 minY = 0;
+ int16 maxY = 200;
+
+ if (VAR((_winVarArrayStatus / 4) + id) & 8)
+ minX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) >> 16L);
+ if (VAR((_winVarArrayStatus / 4) + id) & 16)
+ maxX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) & 0xFFFFL);
+ if (VAR((_winVarArrayStatus / 4) + id) & 32)
+ minY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) >> 16L);
+ if (VAR((_winVarArrayStatus / 4) + id) & 64)
+ maxY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) & 0xFFFFL);
+
+ _vm->_global->_inter_mouseX = _fascinWin[id].left;
+ _vm->_global->_inter_mouseY = _fascinWin[id].top;
+
+ if (_vm->_global->_mousePresent)
+ _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+
+ drawWinTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
+ _cursorX = _vm->_global->_inter_mouseX;
+ _cursorY = _vm->_global->_inter_mouseY;
+
+ do {
+ _vm->_game->checkKeys(&_vm->_global->_inter_mouseX, &_vm->_global->_inter_mouseY, &_vm->_game->_mouseButtons, 1);
+
+ if (_vm->_global->_inter_mouseX != _cursorX || _vm->_global->_inter_mouseY != _cursorY) {
+ if (_vm->_global->_inter_mouseX < minX) {
+ _vm->_global->_inter_mouseX = minX;
+ if (_vm->_global->_mousePresent)
+ _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+ }
+
+ if (_vm->_global->_inter_mouseY < minY) {
+ _vm->_global->_inter_mouseY = minY;
+ if (_vm->_global->_mousePresent)
+ _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+ }
+
+ if (_vm->_global->_inter_mouseX + _fascinWin[id].width > maxX) {
+ _vm->_global->_inter_mouseX = maxX - _fascinWin[id].width;
+ if (_vm->_global->_mousePresent)
+ _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+ }
+
+ if (_vm->_global->_inter_mouseY + _fascinWin[id].height > maxY) {
+ _vm->_global->_inter_mouseY = maxY - _fascinWin[id].height;
+ if (_vm->_global->_mousePresent)
+ _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
+ }
+
+ drawWinTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
+ drawWinTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
+ _cursorX = _vm->_global->_inter_mouseX;
+ _cursorY = _vm->_global->_inter_mouseY;
+ }
+ } while (_vm->_game->_mouseButtons);
+ drawWinTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
+ _cursorX = _vm->_global->_inter_mouseX;
+ _cursorY = _vm->_global->_inter_mouseY;
+}
+
} // End of namespace Gob
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp
index 5d001f4b59..4ecb759e9d 100644
--- a/engines/gob/draw_v2.cpp
+++ b/engines/gob/draw_v2.cpp
@@ -230,7 +230,10 @@ void Draw_v2::printTotText(int16 id) {
destX = (READ_LE_UINT16(ptr) & 0x7FFF) * 2;
spriteRight = READ_LE_UINT16(ptr + 4) * 2 + 1;
} else {
- destX = READ_LE_UINT16(ptr) & 0x7FFF;
+// No mask used for Fascination
+ destX = READ_LE_UINT16(ptr);
+ if (_vm->getGameType() != kGameTypeFascination)
+ destX &= 0x7FFF;
spriteRight = READ_LE_UINT16(ptr + 4);
}
diff --git a/engines/gob/expression.cpp b/engines/gob/expression.cpp
index 9652862b2f..d053345b4c 100644
--- a/engines/gob/expression.cpp
+++ b/engines/gob/expression.cpp
@@ -1002,7 +1002,6 @@ int16 Expression::parseExpr(byte stopToken, byte *type) {
Stack stack;
StackFrame stackFrame(stack);
byte operation;
- bool escape;
int16 brackStart;
uint32 varBase;
@@ -1037,7 +1036,6 @@ int16 Expression::parseExpr(byte stopToken, byte *type) {
if ((operation == stopToken) || (operation == OP_OR) ||
(operation == OP_AND) || (operation == OP_END_EXPR)) {
while (stackFrame.pos >= 2) {
- escape = false;
if ((stackFrame.opers[-2] == OP_BEGIN_EXPR) &&
((operation == OP_END_EXPR) || (operation == stopToken))) {
stackFrame.opers[-2] = stackFrame.opers[-1];
diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index 1a8823b156..b5025ba76f 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -215,7 +215,7 @@ void Game::prepareStart() {
_vm->_draw->initScreen();
_vm->_video->fillRect(*_vm->_draw->_frontSurface, 0, 0,
- _vm->_video->_surfWidth - 1, _vm->_video->_surfHeight - 1, 1);
+ _vm->_video->_surfWidth - 1, _vm->_video->_surfHeight - 1, 1);
_vm->_util->setMousePos(152, 92);
_vm->_draw->_cursorX = _vm->_global->_inter_mouseX = 152;
@@ -352,8 +352,8 @@ void Game::playTot(int16 skipPlay) {
}
}
- if (_vm->getGameType() == kGameTypeFascination)
- _vm->_draw->closeAllWin();
+ _vm->_draw->closeAllWin();
+
if (_totToLoad[0] == 0)
break;
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index f904c8c802..02a8af92bc 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -376,7 +376,7 @@ bool GobEngine::initGameParts() {
break;
case kGameTypeFascination:
- _init = new Init_v2(this);
+ _init = new Init_Fascination(this);
_video = new Video_v2(this);
_inter = new Inter_Fascination(this);
_mult = new Mult_v2(this);
diff --git a/engines/gob/hotspots.cpp b/engines/gob/hotspots.cpp
index 396d9f0a22..78b3553aeb 100644
--- a/engines/gob/hotspots.cpp
+++ b/engines/gob/hotspots.cpp
@@ -257,7 +257,7 @@ uint16 Hotspots::add(const Hotspot &hotspot) {
// Remember the current script
spot.script = _vm->_game->_script;
- debugC(1, kDebugHotspots, "Adding hotspot %03d: %3d+%3d+%3d+%3d - %04X, %04X, %04X - %5d, %5d, %5d",
+ debugC(1, kDebugHotspots, "Adding hotspot %03d: Coord:%3d+%3d+%3d+%3d - id:%04X, key:%04X, flag:%04X - fcts:%5d, %5d, %5d",
i, spot.left, spot.top, spot.right, spot.bottom,
spot.id, spot.key, spot.flags, spot.funcEnter, spot.funcLeave, spot.funcPos);
@@ -431,9 +431,10 @@ void Hotspots::pop() {
// Find the end of the filled hotspot space
int i;
Hotspot *destPtr = _hotspots;
- for (i = 0; i < kHotspotCount; i++, destPtr++)
+ for (i = 0; i < kHotspotCount; i++, destPtr++) {
if (destPtr->isEnd())
break;
+ }
if (((uint32) (kHotspotCount - i)) < backup.size)
error("Hotspots::pop(): Not enough free space in the current Hotspot "
@@ -525,25 +526,30 @@ void Hotspots::leave(uint16 index) {
int16 Hotspots::curWindow(int16 &dx, int16 &dy) const {
if ((_vm->_draw->_renderFlags & 0x80)==0)
return(0);
- for (int i = 0; i < 10; i++)
- if (_vm->_draw->_fascinWin[i].id != -1)
+ for (int i = 0; i < 10; i++) {
+ if (_vm->_draw->_fascinWin[i].id != -1) {
if (_vm->_global->_inter_mouseX >= _vm->_draw->_fascinWin[i].left &&
_vm->_global->_inter_mouseX < _vm->_draw->_fascinWin[i].left + _vm->_draw->_fascinWin[i].width &&
_vm->_global->_inter_mouseY >= _vm->_draw->_fascinWin[i].top &&
- _vm->_global->_inter_mouseY < _vm->_draw->_fascinWin[i].top + _vm->_draw->_fascinWin[i].height)
+ _vm->_global->_inter_mouseY < _vm->_draw->_fascinWin[i].top + _vm->_draw->_fascinWin[i].height) {
if (_vm->_draw->_fascinWin[i].id == _vm->_draw->_winCount-1) {
dx = _vm->_draw->_fascinWin[i].left;
dy = _vm->_draw->_fascinWin[i].top;
if (_vm->_global->_inter_mouseX < _vm->_draw->_fascinWin[i].left + 12 &&
_vm->_global->_inter_mouseY < _vm->_draw->_fascinWin[i].top + 12 &&
(VAR((_vm->_draw->_winVarArrayStatus / 4) + i) & 2))
+ // Cursor on 'Close Window'
return(5);
if (_vm->_global->_inter_mouseX >= _vm->_draw->_fascinWin[i].left + _vm->_draw->_fascinWin[i].width - 12 &&
_vm->_global->_inter_mouseY < _vm->_draw->_fascinWin[i].top + 12 &&
(VAR((_vm->_draw->_winVarArrayStatus / 4) + i) & 4))
+ // Cursor on 'Move Window'
return(6);
return(-i);
}
+ }
+ }
+ }
return(0);
}
@@ -553,10 +559,7 @@ uint16 Hotspots::checkMouse(Type type, uint16 &id, uint16 &index) const {
int16 dx = 0;
int16 dy = 0;
- int16 winId = -1;
-
- if (_vm->getGameType() == kGameTypeFascination)
- winId = _vm->_draw->isOverWin(dx, dy);
+ int16 winId = _vm->_draw->getWinFromCoord(dx, dy);
if (winId < 0) {
winId = 0;
@@ -637,7 +640,6 @@ uint16 Hotspots::checkMouse(Type type, uint16 &id, uint16 &index) const {
return kKeyEscape;
return 0;
-
}
return 0;
@@ -752,11 +754,8 @@ uint16 Hotspots::check(uint8 handleMouse, int16 delay, uint16 &id, uint16 &index
if (_vm->_game->_mouseButtons != kMouseButtonsNone) {
// Mouse button pressed
- int i;
- if (_vm->getGameType() == kGameTypeFascination)
- i = _vm->_draw->handleCurWin();
- else
- i = 0;
+ int i = _vm->_draw->handleCurWin();
+
if (!i) {
_vm->_draw->animateCursor(2);
if (delay > 0) {
@@ -777,9 +776,11 @@ uint16 Hotspots::check(uint8 handleMouse, int16 delay, uint16 &id, uint16 &index
((delay <= 0) || (_vm->_game->_mouseButtons == kMouseButtonsNone)))
_vm->_draw->blitCursor();
+
+ if ((key != _currentKey) && (_vm->getGameType() != kGameTypeFascination))
// If the hotspot changed, leave the old one
- if (key != _currentKey)
- leave(_currentIndex);
+ // Code not present in Fascination executables
+ leave(_currentIndex);
_currentKey = 0;
break;
@@ -798,12 +799,10 @@ uint16 Hotspots::check(uint8 handleMouse, int16 delay, uint16 &id, uint16 &index
if (isValid(_currentKey, _currentId, _currentIndex))
enter(_currentIndex);
} else {
- WRITE_VAR(16, (int32) i);
- if (id)
- id=0;
- if (index)
- index=0;
- return(0);
+ WRITE_VAR(16, (int32)i);
+ id = 0;
+ index = 0;
+ return 0;
}
} else
// No mouse button pressed, check whether the position changed at least
@@ -1104,7 +1103,6 @@ uint16 Hotspots::updateInput(uint16 xPos, uint16 yPos, uint16 width, uint16 heig
// Add character
_vm->_util->insertStr(tempStr, str, pos - 1);
}
-
}
}
}
@@ -1204,13 +1202,13 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,
// Type and window
byte type = _vm->_game->_script->readByte();
- byte window = 0;
+ byte windowNum = 0;
if ((type & 0x40) != 0) {
// Got a window ID
type -= 0x40;
- window = _vm->_game->_script->readByte();
+ windowNum = _vm->_game->_script->readByte();
}
// Coordinates
@@ -1232,28 +1230,28 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,
height = _vm->_game->_script->readUint16();
}
if (_vm->_draw->_renderFlags & 64) {
- warning("_renderFlags check added for Fascination");
_vm->_draw->_invalidatedTops[0] = 0;
_vm->_draw->_invalidatedLefts[0] = 0;
_vm->_draw->_invalidatedRights[0] = 319;
_vm->_draw->_invalidatedBottoms[0] = 199;
_vm->_draw->_invalidatedCount = 1;
- if (window == 0) {
+ if (windowNum == 0) {
_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left + width - 1, top, left + width - 1, top + height - 1, 0);
_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left, top, left, top + height - 1, 0);
_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left, top, left + width - 1, top, 0);
_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left, top + height - 1, left + width - 1, top + height - 1, 0);
- } else
- if ((_vm->_draw->_fascinWin[window].id != -1) && (_vm->_draw->_fascinWin[window].id == _vm->_draw->_winCount - 1)) {
- left += _vm->_draw->_fascinWin[window].left;
- top += _vm->_draw->_fascinWin[window].top;
+ } else {
+ if ((_vm->_draw->_fascinWin[windowNum].id != -1) && (_vm->_draw->_fascinWin[windowNum].id == _vm->_draw->_winCount - 1)) {
+ left += _vm->_draw->_fascinWin[windowNum].left;
+ top += _vm->_draw->_fascinWin[windowNum].top;
_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left + width - 1, top, left + width - 1, top + height - 1, 0);
_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left, top, left, top + height - 1, 0);
_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left, top, left + width - 1, top, 0);
_vm->_video->drawLine(*_vm->_draw->_spritesArray[_vm->_draw->_destSurface], left, top + height - 1, left + width - 1, top + height - 1, 0);
- left -= _vm->_draw->_fascinWin[window].left;
- top -= _vm->_draw->_fascinWin[window].top;
+ left -= _vm->_draw->_fascinWin[windowNum].left;
+ top -= _vm->_draw->_fascinWin[windowNum].top;
}
+ }
}
type &= 0x7F;
@@ -1296,6 +1294,9 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,
Font *font = 0;
uint32 funcEnter = 0, funcLeave = 0;
+ if ((windowNum != 0) && (type != 0) && (type != 2))
+ warning("evaluateNew - type %d, win %d\n",type, windowNum);
+
// Evaluate parameters for the new hotspot
switch (type) {
case kTypeNone:
@@ -1308,7 +1309,7 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,
_vm->_game->_script->skipBlock();
key = i + ((kStateFilled | kStateType2) << 12);
- flags = type + (window << 8);
+ flags = type + (windowNum << 8);
break;
case kTypeMove:
@@ -1325,7 +1326,7 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,
if (key == 0)
key = i + ((kStateFilled | kStateType2) << 12);
- flags = type + (window << 8) + (flags << 4);
+ flags = type + (windowNum << 8) + (flags << 4);
break;
case kTypeInput1NoLeave:
@@ -1390,12 +1391,15 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,
ids[i] = _vm->_game->_script->readInt16();
flags = _vm->_game->_script->readInt16();
+ if (flags > 3)
+ warning("evaluateNew: Warning, use of type 2 or 20. flags = %d, should be %d\n", flags, flags&3);
+
funcEnter = 0;
funcLeave = _vm->_game->_script->pos();
_vm->_game->_script->skipBlock();
- flags = ((uint16) kTypeClick) + (window << 8) + (flags << 4);
+ flags = ((uint16) kTypeClick) + (windowNum << 8) + (flags << 4);
break;
case kTypeClickEnter:
@@ -1408,7 +1412,7 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,
funcLeave = 0;
- flags = ((uint16) kTypeClick) + (window << 8) + (flags << 4);
+ flags = ((uint16) kTypeClick) + (windowNum << 8) + (flags << 4);
break;
}
@@ -1418,8 +1422,10 @@ void Hotspots::evaluateNew(uint16 i, uint16 *ids, InputDesc *inputs,
}
bool Hotspots::evaluateFind(uint16 key, int16 timeVal, const uint16 *ids,
- uint16 hotspotIndex1, uint16 hotspotIndex2, uint16 endIndex,
- int16 &duration, uint16 &id, uint16 &index, bool &finished) {
+ uint16 leaveWindowIndex, uint16 hotspotIndex1, uint16 hotspotIndex2,
+ uint16 endIndex, int16 &duration, uint16 &id, uint16 &index, bool &finished) {
+
+ bool fascinCheck = false;
if (id != 0)
// We already found a hotspot, nothing to do
@@ -1442,8 +1448,10 @@ bool Hotspots::evaluateFind(uint16 key, int16 timeVal, const uint16 *ids,
return false;
}
+ if ((_vm->getGameType() == kGameTypeFascination) && (getCurrentHotspot()))
+ fascinCheck = true;
- if (duration != 0) {
+ if ((duration != 0) && (!fascinCheck)) {
// We've got a time duration
if (hotspotIndex1 != 0) {
@@ -1473,6 +1481,12 @@ bool Hotspots::evaluateFind(uint16 key, int16 timeVal, const uint16 *ids,
return true;
return false;
+ } else {
+ if (leaveWindowIndex != 0)
+ findNthPlain(leaveWindowIndex, endIndex, id, index);
+
+ if (id != 0)
+ return true;
}
return false;
@@ -1500,6 +1514,11 @@ void Hotspots::evaluate() {
// Parameters of this block
_vm->_game->_handleMouse = _vm->_game->_script->peekByte(0);
int16 duration = _vm->_game->_script->peekByte(1);
+
+ byte leaveWindowIndex = 0;
+ if ( _vm->getGameType() == kGameTypeFascination )
+ leaveWindowIndex = _vm->_game->_script->peekByte(2);
+
byte hotspotIndex1 = _vm->_game->_script->peekByte(3);
byte hotspotIndex2 = _vm->_game->_script->peekByte(4);
bool needRecalculation = _vm->_game->_script->peekByte(5) != 0;
@@ -1562,7 +1581,7 @@ void Hotspots::evaluate() {
key = convertSpecialKey(key);
// Try to find a fitting hotspot
- Hotspots::evaluateFind(key, timeVal, ids, hotspotIndex1, hotspotIndex2, endIndex,
+ evaluateFind(key, timeVal, ids, leaveWindowIndex, hotspotIndex1, hotspotIndex2, endIndex,
duration, id, index, finishedDuration);
if (finishedDuration)
@@ -1623,9 +1642,9 @@ int16 Hotspots::findCursor(uint16 x, uint16 y) const {
int16 deltax = 0;
int16 deltay = 0;
- if ( _vm->getGameType() == kGameTypeFascination ) {
+ if ( _vm->getGameType() == kGameTypeFascination )
cursor = curWindow(deltax, deltay);
- }
+
if (cursor == 0) {
for (int i = 0; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {
const Hotspot &spot = _hotspots[i];
@@ -1657,7 +1676,7 @@ int16 Hotspots::findCursor(uint16 x, uint16 y) const {
cursor = 0;
for (int i = 0; (i < kHotspotCount) && !_hotspots[i].isEnd(); i++) {
const Hotspot &spot = _hotspots[i];
- // this check is /really/ Fascination specific.
+ // this check is /really/ Fascination specific.
// It's illogical, so if it's to be reused in Adi games... Be careful!
if ((spot.flags & 0xFF00) == curType)
if (spot.isIn(x - deltax, y - deltay)) {
@@ -1701,9 +1720,9 @@ void Hotspots::oPlaytoons_F_1B() {
// var_4 += unk_var;
for (int i = 0; i < kHotspotCount; i++) {
- if (_hotspots[i].isEnd()) {
+ if (_hotspots[i].isEnd())
return;
- }
+
if ((_hotspots[i].id == 0xD000 + shortId) || (_hotspots[i].id == 0xB000 + shortId) ||
(_hotspots[i].id == 0x4000 + shortId)) {
longId = _hotspots[i].id;
@@ -1724,7 +1743,6 @@ void Hotspots::oPlaytoons_F_1B() {
right -= 2;
bottom -= 2;
}
-// oPlaytoons_sub_F_1B(0x8000 + var2, left, top, right, bottom, _vm->_game->_script->getResultStr(), var3, var4, shortId);
_vm->_draw->oPlaytoons_sub_F_1B(0x8000+ var2, left, top, right, bottom, _vm->_game->_script->getResultStr(), fontIndex, var4, shortId);
return;
}
@@ -2032,7 +2050,6 @@ void Hotspots::matchInputStrings(const InputDesc *inputs) const {
cleanFloatString(spot);
if ((spot.getType() >= kTypeInput2NoLeave) && (spot.getType() <= kTypeInput3Leave)) {
-
// Look if we find a match between the wanted and the typed string
checkStringMatch(spot, inputs[inputIndex], inputPos);
strInputCount++;
diff --git a/engines/gob/hotspots.h b/engines/gob/hotspots.h
index a7cbf9d6e8..7346c66bb5 100644
--- a/engines/gob/hotspots.h
+++ b/engines/gob/hotspots.h
@@ -104,7 +104,6 @@ public:
/** implementation of oPlaytoons_F_1B code*/
void oPlaytoons_F_1B();
-
private:
struct Hotspot {
uint16 id;
@@ -225,8 +224,8 @@ private:
uint16 &inputId, bool &hasInput, uint16 &inputCount);
/** Find the hotspot requested by script commands. */
bool evaluateFind(uint16 key, int16 timeVal, const uint16 *ids,
- uint16 hotspotIndex1, uint16 hotspotIndex2, uint16 endIndex,
- int16 &duration, uint16 &id, uint16 &index, bool &finished);
+ uint16 leaveWindowIndex, uint16 hotspotIndex1, uint16 hotspotIndex2,
+ uint16 endIndex, int16 &duration, uint16 &id, uint16 &index, bool &finished);
// Finding specific hotspots
/** Find the hotspot index that corresponds to the input index. */
diff --git a/engines/gob/init.h b/engines/gob/init.h
index d4481d8e16..8fc301d7a6 100644
--- a/engines/gob/init.h
+++ b/engines/gob/init.h
@@ -96,6 +96,7 @@ public:
Init_Fascination(GobEngine *vm);
~Init_Fascination();
+ void updateConfig();
void initGame();
};
} // End of namespace Gob
diff --git a/engines/gob/init_fascin.cpp b/engines/gob/init_fascin.cpp
new file mode 100644
index 0000000000..9842b7e752
--- /dev/null
+++ b/engines/gob/init_fascin.cpp
@@ -0,0 +1,58 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/endian.h"
+
+#include "gob/gob.h"
+#include "gob/init.h"
+#include "gob/game.h"
+#include "gob/global.h"
+
+namespace Gob {
+
+Init_Fascination::Init_Fascination(GobEngine *vm) : Init_v2(vm) {
+}
+
+Init_Fascination::~Init_Fascination() {
+}
+
+void Init_Fascination::updateConfig() {
+// In Fascination, some empty texts are present and used to clean up the text area.
+// Using _doSubtitles does the trick.
+// The first obvious example is in the hotel hall: 'Use ...' is displayed at
+// the same place than the character dialogs.
+ _vm->_global->_doSubtitles = true;
+}
+
+void Init_Fascination::initGame() {
+// HACK - Suppress ADLIB_FLAG as the MDY/TBR player is not working. suppress
+// the PC Speaker too, as the script checks in the intro for it's presence
+// to play or not some noices.
+ _vm->_global->_soundFlags = MIDI_FLAG | BLASTER_FLAG;
+
+ Init::initGame();
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/init_v3.cpp b/engines/gob/init_v3.cpp
index 4a2379bad0..cb4a0b713f 100644
--- a/engines/gob/init_v3.cpp
+++ b/engines/gob/init_v3.cpp
@@ -39,7 +39,7 @@ Init_v3::~Init_v3() {
}
void Init_v3::updateConfig() {
-// In the CD version of Goblins3, some texts are flagged 'subtitles'
+// In the CD version of Goblins3, some texts are flagged 'subtitles'
// incorrectly and therefore should be displayed in all cases.
// The first obvious example is just after Death level.
if ((_vm->getGameType() == kGameTypeGob3) && _vm->isCD())
diff --git a/engines/gob/inter.cpp b/engines/gob/inter.cpp
index 0d48ad719c..f6e6d41100 100644
--- a/engines/gob/inter.cpp
+++ b/engines/gob/inter.cpp
@@ -288,7 +288,21 @@ void Inter::funcBlock(int16 retFlag) {
_vm->_util->longDelay(5000);
}
+ } // End of workaround
+ // WORKAROUND:
+ // Apart the CD version which is playing a speech in this room, all the versions
+ // of Fascination have a too short delay between the storage room and the lab.
+ // We manually add it here.
+ if ((_vm->getGameType() == kGameTypeFascination) &&
+ !strncmp(_vm->_game->_curTotFile, "PLANQUE.tot", 9)) {
+ int addr = _vm->_game->_script->pos();
+ if ((startaddr == 0x0202 && addr == 0x0330) || // Before Lab, Amiga & Atari, English
+ (startaddr == 0x023D && addr == 0x032D) || // Before Lab, PC floppy, German
+ (startaddr == 0x02C2 && addr == 0x03C2)) { // Before Lab, PC floppy, Hebrew
+ warning("Fascination - Adding delay");
+ _vm->_util->longDelay(3000);
+ }
} // End of workaround
cmd = _vm->_game->_script->readByte();
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 8dabe12637..ca97483054 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -432,6 +432,8 @@ protected:
void oFascin_playProtracker(OpGobParams &params);
+ bool oFascin_repeatUntil(OpFuncParams &params);
+ bool oFascin_assign(OpFuncParams &params);
bool oFascin_copySprite(OpFuncParams &params);
bool oFascin_keyFunc(OpFuncParams &params);
@@ -452,6 +454,7 @@ protected:
void oFascin_closeWin();
void oFascin_activeWin();
void oFascin_openWin();
+ void oFascin_initCursorAnim();
void oFascin_setRenderFlags();
void oFascin_setWinFlags();
};
diff --git a/engines/gob/inter_fascin.cpp b/engines/gob/inter_fascin.cpp
index 304f02f4fa..d2b97eea43 100644
--- a/engines/gob/inter_fascin.cpp
+++ b/engines/gob/inter_fascin.cpp
@@ -33,6 +33,7 @@
#include "gob/dataio.h"
#include "gob/draw.h"
#include "gob/game.h"
+#include "gob/expression.h"
#include "gob/script.h"
#include "gob/palanim.h"
#include "gob/video.h"
@@ -57,6 +58,8 @@ void Inter_Fascination::setupOpcodesDraw() {
OPCODEDRAW(0x05, oFascin_activeWin);
OPCODEDRAW(0x06, oFascin_openWin);
+ OPCODEDRAW(0x08, oFascin_initCursorAnim);
+
OPCODEDRAW(0x0A, oFascin_setRenderFlags);
OPCODEDRAW(0x0B, oFascin_setWinFlags);
@@ -85,7 +88,8 @@ void Inter_Fascination::setupOpcodesDraw() {
void Inter_Fascination::setupOpcodesFunc() {
Inter_v2::setupOpcodesFunc();
- OPCODEFUNC(0x09, o1_assign);
+ OPCODEFUNC(0x06, oFascin_repeatUntil);
+ OPCODEFUNC(0x09, oFascin_assign);
OPCODEFUNC(0x32, oFascin_copySprite);
}
@@ -110,6 +114,89 @@ void Inter_Fascination::setupOpcodesGob() {
OPCODEGOB(1002, o2_stopProtracker);
}
+bool Inter_Fascination::oFascin_repeatUntil(OpFuncParams &params) {
+ int16 size;
+ bool flag;
+
+ _nestLevel[0]++;
+
+ uint32 blockPos = _vm->_game->_script->pos();
+
+ do {
+ _vm->_game->_script->seek(blockPos);
+ size = _vm->_game->_script->peekUint16(2) + 2;
+
+ funcBlock(1);
+
+ _vm->_game->_script->seek(blockPos + size + 1);
+
+ flag = _vm->_game->_script->evalBoolResult();
+
+ // WORKAROUND: The script of the PC version of Fascination, when the protection check
+ // fails, writes on purpose everywhere in the memory in order to hang the computer.
+ // This results in a crash in Scummvm. This workaround avoids that crash.
+ if (_vm->getPlatform() == Common::kPlatformPC) {
+ if ((!scumm_stricmp(_vm->_game->_curTotFile, "INTRO1.TOT") && (blockPos == 3533)) ||
+ (!scumm_stricmp(_vm->_game->_curTotFile, "INTRO2.TOT") && (blockPos == 3519)))
+ _terminate = 1;
+ }
+ } while (!flag && !_break && !_terminate && !_vm->shouldQuit());
+
+ _nestLevel[0]--;
+
+ if (*_breakFromLevel > -1) {
+ _break = false;
+ *_breakFromLevel = -1;
+ }
+ return false;
+}
+
+bool Inter_Fascination::oFascin_assign(OpFuncParams &params) {
+ byte destType = _vm->_game->_script->peekByte();
+ int16 dest = _vm->_game->_script->readVarIndex();
+
+ byte loopCount;
+ if (_vm->_game->_script->peekByte() == 99) {
+ _vm->_game->_script->skip(1);
+ loopCount = _vm->_game->_script->readByte();
+ } else
+ loopCount = 1;
+
+ for (int i = 0; i < loopCount; i++) {
+ int16 result;
+ int16 srcType = _vm->_game->_script->evalExpr(&result);
+
+ switch (destType) {
+ case TYPE_VAR_INT8:
+ if (srcType != TYPE_IMM_INT16) {
+ char* str = _vm->_game->_script->getResultStr();
+ WRITE_VARO_STR(dest, str);
+ } else
+ WRITE_VARO_UINT8(dest + i, _vm->_game->_script->getResultInt());
+ break;
+
+ case TYPE_VAR_INT32_AS_INT16:
+ case TYPE_ARRAY_INT16:
+ WRITE_VARO_UINT16(dest + i * 2, _vm->_game->_script->getResultInt());
+ break;
+
+ case TYPE_VAR_INT32:
+ case TYPE_ARRAY_INT32:
+ WRITE_VAR_OFFSET(dest + i * 4, _vm->_game->_script->getResultInt());
+ break;
+
+ case TYPE_VAR_STR:
+ case TYPE_ARRAY_STR:
+ if (srcType == TYPE_IMM_INT16)
+ WRITE_VARO_UINT8(dest, result);
+ else
+ WRITE_VARO_STR(dest, _vm->_game->_script->getResultStr());
+ break;
+ }
+ }
+
+ return false;
+}
bool Inter_Fascination::oFascin_copySprite(OpFuncParams &params) {
_vm->_draw->_sourceSurface = _vm->_game->_script->readInt16();
@@ -129,8 +216,6 @@ bool Inter_Fascination::oFascin_copySprite(OpFuncParams &params) {
}
void Inter_Fascination::oFascin_playTirb(OpGobParams &params) {
- warning("funcPlayImd with parameter : 'tirb.imd'");
-
VideoPlayer::Properties vidProps;
vidProps.type = VideoPlayer::kVideoTypePreIMD;
@@ -149,8 +234,6 @@ void Inter_Fascination::oFascin_playTirb(OpGobParams &params) {
}
void Inter_Fascination::oFascin_playTira(OpGobParams &params) {
- warning("funcPlayImd with parameter : 'tira.imd'");
-
VideoPlayer::Properties vidProps;
vidProps.type = VideoPlayer::kVideoTypePreIMD;
@@ -255,6 +338,13 @@ void Inter_Fascination::oFascin_openWin() {
WRITE_VAR((retVal / 4), (int32) _vm->_draw->openWin(id));
}
+void Inter_Fascination::oFascin_initCursorAnim() {
+ int16 ind = _vm->_game->_script->readValExpr();
+ _vm->_draw->_cursorAnimLow[ind] = _vm->_game->_script->readInt16();
+ _vm->_draw->_cursorAnimHigh[ind] = _vm->_game->_script->readInt16();
+ _vm->_draw->_cursorAnimDelays[ind] = _vm->_game->_script->readInt16();
+}
+
void Inter_Fascination::oFascin_setRenderFlags() {
int16 expr;
_vm->_game->_script->evalExpr(&expr);
@@ -270,4 +360,5 @@ void Inter_Fascination::oFascin_setWinFlags() {
void Inter_Fascination::oFascin_playProtracker(OpGobParams &params) {
_vm->_sound->protrackerPlay("mod.extasy");
}
+
} // End of namespace Gob
diff --git a/engines/gob/inter_v4.cpp b/engines/gob/inter_v4.cpp
index d0824ffb58..ce1f19e9a7 100644
--- a/engines/gob/inter_v4.cpp
+++ b/engines/gob/inter_v4.cpp
@@ -228,7 +228,7 @@ void Inter_v4::o4_playVmdOrMusic() {
_vm->_vidPlayer->evaluateFlags(props);
- int slot;
+ int slot = 0;
if ((fileName[0] != 0) && ((slot = _vm->_vidPlayer->openVideo(true, fileName, props)) < 0)) {
WRITE_VAR(11, (uint32) -1);
return;
diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp
index 73ef46bf31..a5a4f7d666 100644
--- a/engines/gob/inter_v6.cpp
+++ b/engines/gob/inter_v6.cpp
@@ -171,7 +171,7 @@ void Inter_v6::o6_playVmdOrMusic() {
_vm->_vidPlayer->evaluateFlags(props);
- int slot;
+ int slot = 0;
if ((fileName[0] != 0) && ((slot = _vm->_vidPlayer->openVideo(true, fileName, props)) < 0)) {
WRITE_VAR(11, (uint32) -1);
return;
diff --git a/engines/gob/module.mk b/engines/gob/module.mk
index 69e7dbcf52..862d1424a8 100644
--- a/engines/gob/module.mk
+++ b/engines/gob/module.mk
@@ -23,6 +23,7 @@ MODULE_OBJS := \
init.o \
init_v1.o \
init_v2.o \
+ init_fascin.o \
init_v3.o \
init_v4.o \
init_v6.o \
diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp
index 66488054e7..ab513d78bb 100644
--- a/engines/gob/mult_v2.cpp
+++ b/engines/gob/mult_v2.cpp
@@ -946,7 +946,7 @@ void Mult_v2::animate() {
_vm->_draw->_destSpriteX = maxleft;
_vm->_draw->_destSpriteY = maxtop;
_vm->_draw->_transparency = 0;
- _vm->_draw->spriteOperation(DRAW_DRAWLETTER);
+ _vm->_draw->spriteOperation(DRAW_BLITSURF);
}
// Figure out the correct drawing order
diff --git a/engines/gob/scenery.cpp b/engines/gob/scenery.cpp
index f9587dc0b3..a667d6615d 100644
--- a/engines/gob/scenery.cpp
+++ b/engines/gob/scenery.cpp
@@ -80,6 +80,10 @@ Scenery::~Scenery() {
void Scenery::init() {
for (int i = 0; i < 10; i++) {
+ if (_vm->getGameType() == kGameTypeFascination) {
+ freeAnim(i);
+ freeStatic(i);
+ }
_animPictCount[i] = 0;
_staticPictCount[i] = -1;
}
@@ -919,13 +923,24 @@ void Scenery::writeAnimLayerInfo(uint16 index, uint16 layer,
int16 varDX, int16 varDY, int16 varUnk0, int16 varFrames) {
assert(index < 10);
- assert(layer < _animations[index].layersCount);
- AnimLayer &animLayer = _animations[index].layers[layer];
- WRITE_VAR_OFFSET(varDX, animLayer.animDeltaX);
- WRITE_VAR_OFFSET(varDY, animLayer.animDeltaY);
- WRITE_VAR_OFFSET(varUnk0, animLayer.unknown0);
- WRITE_VAR_OFFSET(varFrames, animLayer.framesCount);
+// WORKAROUND - Fascination Hebrew is using scripts from the CD versions, but of course
+// no CD track, so the anim syncing failed, and the anims were suppressed. But they
+// didn't updated the scripts. Skipping the wrong anims is a solution.
+ if ((_vm->getGameType() == kGameTypeFascination) && (layer >= _animations[index].layersCount)) {
+ WRITE_VAR_OFFSET(varDX, 0);
+ WRITE_VAR_OFFSET(varDY, 0);
+ WRITE_VAR_OFFSET(varUnk0, 0);
+ WRITE_VAR_OFFSET(varFrames, 0);
+ } else {
+ assert(layer < _animations[index].layersCount);
+
+ AnimLayer &animLayer = _animations[index].layers[layer];
+ WRITE_VAR_OFFSET(varDX, animLayer.animDeltaX);
+ WRITE_VAR_OFFSET(varDY, animLayer.animDeltaY);
+ WRITE_VAR_OFFSET(varUnk0, animLayer.unknown0);
+ WRITE_VAR_OFFSET(varFrames, animLayer.framesCount);
+ }
}
int16 Scenery::getStaticLayersCount(uint16 index) {
diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp
index f2b9004a41..bc4495fafd 100644
--- a/engines/gob/sound/sound.cpp
+++ b/engines/gob/sound/sound.cpp
@@ -610,9 +610,14 @@ void Sound::cdPlayMultMusic() {
void Sound::cdPlay(const char *trackName) {
if (!_cdrom)
return;
-
debugC(1, kDebugSound, "CDROM: Playing track \"%s\"", trackName);
- _cdrom->startTrack(trackName);
+
+// WORKAROUND - In Fascination CD, in the storage room, a track has the wrong
+// name in the scripts, and therefore doesn't play. This fixes the problem.
+ if ((_vm->getGameType() == kGameTypeFascination) && !scumm_stricmp(trackName, "boscle"))
+ _cdrom->startTrack("bosscle");
+ else
+ _cdrom->startTrack(trackName);
}
void Sound::cdStop() {
diff --git a/engines/gob/util.cpp b/engines/gob/util.cpp
index 26899232e2..c895c6301d 100644
--- a/engines/gob/util.cpp
+++ b/engines/gob/util.cpp
@@ -435,7 +435,7 @@ void Util::cleanupStr(char *str) {
cutFromStr(str, 0, 1);
// Trim spaces right
- while ((strlen(str) > 0) && (str[strlen(str) - 1] == ' '))
+ while ((*str != '\0') && (str[strlen(str) - 1] == ' '))
cutFromStr(str, strlen(str) - 1, 1);
// Merge double spaces
diff --git a/engines/hugo/detection.cpp b/engines/hugo/detection.cpp
new file mode 100644
index 0000000000..d19eee0041
--- /dev/null
+++ b/engines/hugo/detection.cpp
@@ -0,0 +1,209 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "engines/advancedDetector.h"
+
+#include "hugo/hugo.h"
+
+namespace Hugo {
+
+struct HugoGameDescription {
+ ADGameDescription desc;
+ GameType gameType;
+};
+
+uint32 HugoEngine::getFeatures() const {
+ return _gameDescription->desc.flags;
+}
+
+static const PlainGameDescriptor hugoGames[] = {
+ // Games
+ {"hugo1", "Hugo 1: Hugo's House of Horrors"},
+ {"hugo2", "Hugo 2: Hugo's Mystery Adventure"},
+ {"hugo3", "Hugo 3: Hugo's Amazon Adventure"},
+ {0, 0}
+};
+
+static const HugoGameDescription gameDescriptions[] = {
+
+ // Hugo1 DOS
+ {
+ {
+ "hugo1", 0,
+ AD_ENTRY1s("house.art", "c9403b2fe539185c9fd569b6cc4ff5ca", 14811),
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ ADGF_NO_FLAGS,
+ Common::GUIO_NONE
+ },
+ kGameTypeHugo1
+ },
+ // Hugo1 Windows
+ {
+ {
+ "hugo1", 0,
+ AD_ENTRY1s("objects.dat", "3ba0f108f7690a05a34c56a02fbe644a", 126488),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ GF_PACKED,
+ Common::GUIO_NONE
+ },
+ kGameTypeHugo1
+ },
+ // Hugo2 DOS
+ {
+ {
+ "hugo2", 0,
+ AD_ENTRY1s("objects.dat", "88a718cc0ff2b3b25d49aaaa69d6d52c", 155240),
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ GF_PACKED,
+ Common::GUIO_NONE
+ },
+ kGameTypeHugo2
+ },
+ // Hugo2 Windows
+ {
+ {
+ "hugo2", 0,
+ AD_ENTRY1s("objects.dat", "5df4ffc851e66a544c0e95e4e084a806", 158480),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ GF_PACKED,
+ Common::GUIO_NONE
+ },
+ kGameTypeHugo2
+ },
+ // Hugo3 DOS
+ {
+ {
+ "hugo3", 0,
+ AD_ENTRY1s("objects.dat", "bb1b061538a445f2eb99b682c0f506cc", 136419),
+ Common::EN_ANY,
+ Common::kPlatformPC,
+ GF_PACKED,
+ Common::GUIO_NONE
+ },
+ kGameTypeHugo3
+ },
+ // Hugo3 Windows
+ {
+ {
+ "hugo3", 0,
+ AD_ENTRY1s("objects.dat", "c9a8af7aa14cc907434eecee3ddd06d3", 136638),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ GF_PACKED,
+ Common::GUIO_NONE
+ },
+ kGameTypeHugo3
+ },
+
+ {AD_TABLE_END_MARKER, kGameTypeNone}
+};
+
+static const ADParams detectionParams = {
+ // Pointer to ADGameDescription or its superset structure
+ (const byte *)gameDescriptions,
+ // Size of that superset structure
+ sizeof(HugoGameDescription),
+ // Number of bytes to compute MD5 sum for
+ 5000,
+ // List of all engine targets
+ hugoGames,
+ // Structure for autoupgrading obsolete targets
+ 0,
+ // Name of single gameid (optional)
+ 0,
+ // List of files for file-based fallback detection (optional)
+ 0,
+ // Flags
+ 0,
+ // Additional GUI options (for every game}
+ Common::GUIO_NONE,
+ // Maximum directory depth
+ 1,
+ // List of directory globs
+ 0
+};
+
+class HugoMetaEngine : public AdvancedMetaEngine {
+public:
+ HugoMetaEngine() : AdvancedMetaEngine(detectionParams) {}
+
+ const char *getName() const {
+ return "Hugo Engine";
+ }
+
+ const char *getOriginalCopyright() const {
+ return "Hugo Engine (C) 1989-1997 David P. Gray";
+ }
+
+ bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const;
+
+ bool hasFeature(MetaEngineFeature f) const;
+};
+
+bool HugoMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const {
+ if (gd) {
+ *engine = new HugoEngine(syst, (const HugoGameDescription *)gd);
+ ((HugoEngine *)*engine)->initGame((const HugoGameDescription *)gd);
+ }
+ return gd != 0;
+}
+
+bool HugoMetaEngine::hasFeature(MetaEngineFeature f) const {
+ return false;
+}
+
+} // End of namespace Hugo
+
+#if PLUGIN_ENABLED_DYNAMIC(HUGO)
+REGISTER_PLUGIN_DYNAMIC(HUGO, PLUGIN_TYPE_ENGINE, Hugo::HugoMetaEngine);
+#else
+REGISTER_PLUGIN_STATIC(HUGO, PLUGIN_TYPE_ENGINE, Hugo::HugoMetaEngine);
+#endif
+
+namespace Hugo {
+
+void HugoEngine::initGame(const HugoGameDescription *gd) {
+ char tmpStr[8];
+
+ _gameType = gd->gameType;
+ _platform = gd->desc.platform;
+ _packedFl = (getFeatures() & GF_PACKED);
+ _gameVariant = _gameType - 1 + ((_platform == Common::kPlatformWindows) ? 0 : 3);
+
+//Generate filenames
+ if (gd->desc.platform == Common::kPlatformWindows)
+ sprintf(tmpStr, "%s%c", gd->desc.gameid, 'w');
+ else
+ sprintf(tmpStr, "%s%c", gd->desc.gameid, 'd');
+
+ sprintf(_initFilename, "%s-00.SAV", tmpStr);
+ sprintf(_saveFilename, "%s-%s.SAV", tmpStr, "%d");
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/display.cpp b/engines/hugo/display.cpp
new file mode 100644
index 0000000000..ddd193c2a6
--- /dev/null
+++ b/engines/hugo/display.cpp
@@ -0,0 +1,456 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+// Display.c - DIB related code for HUGOWIN
+
+#include "common/system.h"
+
+#include "hugo/game.h"
+#include "hugo/hugo.h"
+#include "hugo/display.h"
+#include "hugo/file.h"
+#include "hugo/util.h"
+
+namespace Hugo {
+
+#define CENTER -1 // Used to center text in x
+#define NUM_COLORS 16 // Num colors to save in palette
+#define DMAX 16 // Size of add/restore rect lists
+#define BMAX (DMAX * 2) // Size of dirty rect blit list
+
+#define INX(X, B) (X >= B->x && X <= B->x + B->dx)
+#define INY(Y, B) (Y >= B->y && Y <= B->y + B->dy)
+#define OVERLAP(A, B) ((INX(A->x, B) || INX(A->x + A->dx, B) || INX(B->x, A) || INX(B->x + B->dx, A)) && (INY(A->y, B) || INY(A->y + A->dy, B) || INY(B->y, A) || INY(B->y + B->dy, A)))
+
+struct rect_t { // Rectangle used in Display list
+ int16 x; // Position in dib
+ int16 y; // Position in dib
+ int16 dx; // width
+ int16 dy; // height
+};
+
+Screen::Screen(HugoEngine &vm) : _vm(vm) {
+
+}
+
+void Screen::createPal() {
+ debugC(1, kDebugDisplay, "createPal");
+
+ g_system->setPalette(_vm._palette, 0, NUM_COLORS);
+}
+
+void Screen::initDisplay() {
+ debugC(1, kDebugDisplay, "initDisplay");
+ // Create logical palette
+ createPal();
+}
+
+// Move an image from source to destination
+void Screen::moveImage(image_pt srcImage, uint16 x1, uint16 y1, uint16 dx, uint16 dy, uint16 width1, image_pt dstImage, uint16 x2, uint16 y2, uint16 width2) {
+ int16 wrap_src = width1 - dx; // Wrap to next src row
+ int16 wrap_dst = width2 - dx; // Wrap to next dst row
+ int16 x;
+
+ debugC(3, kDebugDisplay, "moveImage(srcImage, %d, %d, %d, %d, %d, dstImage, %d, %d, %d)", x1, y1, dx, dy, width1, x2, y2, width2);
+
+ srcImage += y1 * width1 + x1; // Offset into src image
+ dstImage += y2 * width2 + x2; // offset into dst image
+
+ while (dy--) { // For each row
+ for (x = dx; x--;) // For each column
+ *dstImage++ = *srcImage++;
+ srcImage += wrap_src; // Wrap to next line
+ dstImage += wrap_dst;
+ }
+}
+
+void Screen::displayBackground() {
+ debugC(1, kDebugDisplay, "displayBackground");
+
+ g_system->copyRectToScreen(_frontBuffer, 320, 0, 0, 320, 200);
+}
+
+// Blit the supplied rectangle from _frontBuffer to the screen
+void Screen::displayRect(int16 x, int16 y, int16 dx, int16 dy) {
+ debugC(3, kDebugDisplay, "displayRect(%d, %d, %d, %d)", x, y, dx, dy);
+
+ g_system->copyRectToScreen(&_frontBuffer[x + y * 320], 320, x, y, dx, dy);
+}
+
+void Screen::remapPal(uint16 oldIndex, uint16 newIndex) {
+// Change a color by remapping supplied palette index with new index
+ debugC(1, kDebugDisplay, "Remap_pal(%d, %d)", oldIndex, newIndex);
+
+ warning("STUB: Remap_pal()");
+ //bminfo.bmiColors[oldIndex] = ctab[newIndex];
+}
+
+void Screen::savePal(Common::WriteStream *f) {
+ debugC(1, kDebugDisplay, "savePal");
+
+ warning("STUB: savePal()");
+ //fwrite(bminfo.bmiColors, sizeof(bminfo.bmiColors), 1, f);
+}
+
+void Screen::restorePal(Common::SeekableReadStream *f) {
+ debugC(1, kDebugDisplay, "restorePal");
+
+ warning("STUB: restorePal()");
+ //fread(bminfo.bmiColors, sizeof(bminfo.bmiColors), 1, f);
+}
+
+
+// Set the new background color
+void Screen::setBackgroundColor(long color) {
+ debugC(1, kDebugDisplay, "setBackgroundColor(%ld)", color);
+
+ // How??? Translate existing pixels in dib before objects rendered?
+}
+
+// Write the supplied character in the supplied color to x,y pixel coords
+void Screen::writeChar(int16 x, int16 y, char c, byte color) {
+ debugC(1, kDebugDisplay, "writeChar(%d, %d, %c, %d)", x, y, c, color);
+
+ warning("STUB: writeChar()");
+ // x = (int16)((long) x * config.cx / XPIX);
+ // y = (int16)((long) y * config.cy / YPIX);
+ // SetTextColor(hDC, GetPalIndex(color));
+ // TextOut(hDC, x, y, &c, 1);
+}
+
+// Return the overlay state (Foreground/Background) of the currently
+// processed object by looking down the current column for an overlay
+// base bit set (in which case the object is foreground).
+overlayState_t Screen::findOvl(seq_t *seq_p, image_pt dst_p, uint16 y) {
+ debugC(4, kDebugDisplay, "findOvl");
+
+ for (; y < seq_p->lines; y++) { // Each line in object
+ image_pt ovb_p = _vm.getBaseBoundaryOverlay() + ((uint16)(dst_p - _frontBuffer) >> 3); // Ptr into overlay bits
+ if (*ovb_p & (0x80 >> ((uint16)(dst_p - _frontBuffer) & 7))) // Overlay bit is set
+ return FG; // Found a bit - must be foreground
+ dst_p += XPIX;
+ }
+
+ return BG; // No bits set, must be background
+}
+
+// Merge an object frame into _frontBuffer at sx, sy and update rectangle list.
+// If fore TRUE, force object above any overlay
+void Screen::displayFrame(int sx, int sy, seq_t *seq, bool foreFl) {
+ overlayState_t overlayState = UNDEF; // Overlay state of object
+ image_pt image; // Ptr to object image data
+ image_pt subFrontBuffer; // Ptr to offset in _frontBuffer
+ image_pt overlay; // Ptr to overlay data
+ int16 frontBufferwrap; // Wrap dst_p to next line
+ int16 imageWrap; // Wrap src_p to next line
+ uint16 x, y; // Index into object data
+
+ debugC(3, kDebugDisplay, "displayFrame(%d, %d, seq, %d)", sx, sy, (foreFl) ? 1 : 0);
+
+ image = seq->imagePtr; // Source ptr
+ subFrontBuffer = &_frontBuffer[sy * XPIX + sx]; // Destination ptr
+ overlay = &_vm.getFirstOverlay()[(sy * XPIX + sx) >> 3]; // Overlay ptr
+ frontBufferwrap = XPIX - seq->x2 - 1; // Wraps dest_p after each line
+ imageWrap = seq->bytesPerLine8 - seq->x2 - 1;
+
+ for (y = 0; y < seq->lines; y++) { // Each line in object
+ for (x = 0; x <= seq->x2; x++) {
+ if (*image) { // Non-transparent
+ overlay = _vm.getFirstOverlay() + ((uint16)(subFrontBuffer - _frontBuffer) >> 3); // Ptr into overlay bits
+ if (*overlay & (0x80 >> ((uint16)(subFrontBuffer - _frontBuffer) & 7))) { // Overlay bit is set
+ if (overlayState == UNDEF) // Overlay defined yet?
+ overlayState = findOvl(seq, subFrontBuffer, y);// No, find it.
+ if (foreFl || overlayState == FG) // Object foreground
+ *subFrontBuffer = *image; // Copy pixel
+ } else // No overlay
+ *subFrontBuffer = *image; // Copy pixel
+ }
+ image++;
+ subFrontBuffer++;
+ }
+ image += imageWrap;
+ subFrontBuffer += frontBufferwrap;
+ }
+
+ // Add this rectangle to the display list
+ displayList(D_ADD, sx, sy, seq->x2 + 1, seq->lines);
+}
+
+// Merge rectangles A,B leaving result in B
+void Screen::merge(rect_t *rectA, rect_t *rectB) {
+ debugC(6, kDebugDisplay, "merge");
+
+ int16 xa = rectA->x + rectA->dx; // Find x2,y2 for each rectangle
+ int16 xb = rectB->x + rectB->dx;
+ int16 ya = rectA->y + rectA->dy;
+ int16 yb = rectB->y + rectB->dy;
+
+ rectB->x = MIN(rectA->x, rectB->x); // Minimum x,y
+ rectB->y = MIN(rectA->y, rectB->y);
+ rectB->dx = MAX(xa, xb) - rectB->x; // Maximum dx,dy
+ rectB->dy = MAX(ya, yb) - rectB->y;
+}
+
+// Coalesce the rectangles in the restore/add list into one unified
+// blist. len is the sizes of alist or rlist. blen is current length
+// of blist. bmax is the max size of the blist. Note that blist can
+// have holes, in which case dx = 0. Returns used length of blist.
+int16 Screen::mergeLists(rect_t *list, rect_t *blist, int16 len, int16 blen, int16 bmax) {
+ int16 coalesce[BMAX]; // List of overlapping rects
+
+ debugC(4, kDebugDisplay, "mergeLists");
+
+ // Process the list
+ for (int16 a = 0; a < len; a++, list++) {
+ // Compile list of overlapping rectangles in blit list
+ int16 c = 0;
+ rect_t *bp = blist;
+ for (int16 b = 0; b < blen; b++, bp++)
+ if (bp->dx) // blist entry used
+ if (OVERLAP(list, bp))
+ coalesce[c++] = b;
+
+ // Any overlapping blit rects?
+ if (c == 0) // None, add a new entry
+ blist[blen++] = *list;
+ else { // At least one overlapping
+ // Merge add-list entry with first blist entry
+ bp = &blist[coalesce[0]];
+ merge(list, bp);
+
+ // Merge any more blist entries
+ while (--c) {
+ rect_t *cp = &blist[coalesce[c]];
+ merge(cp, bp);
+ cp->dx = 0; // Delete entry
+ }
+ }
+ }
+ return blen;
+}
+
+// Process the display list
+// Trailing args are int16 x,y,dx,dy for the D_ADD operation
+void Screen::displayList(dupdate_t update, ...) {
+ static int16 addIndex, restoreIndex; // Index into add/restore lists
+ static rect_t restoreList[DMAX]; // The restore list
+ static rect_t addList[DMAX]; // The add list
+ static rect_t blistList[BMAX]; // The blit list
+ int16 blitLength = 0; // Length of blit list
+ rect_t *p; // Ptr to dlist entry
+ va_list marker; // Args used for D_ADD operation
+
+ debugC(6, kDebugDisplay, "displayList");
+
+ switch (update) {
+ case D_INIT: // Init lists, restore whole screen
+ addIndex = restoreIndex = 0;
+ memcpy(_frontBuffer, _backBuffer, sizeof(_frontBuffer));
+ break;
+ case D_ADD: // Add a rectangle to list
+ if (addIndex >= DMAX) {
+ Utils::Warn(false, "%s", "Display list exceeded");
+ return;
+ }
+ va_start(marker, update); // Initialize variable arguments
+ p = &addList[addIndex];
+ p->x = va_arg(marker, int); // x
+ p->y = va_arg(marker, int); // y
+ p->dx = va_arg(marker, int); // dx
+ p->dy = va_arg(marker, int); // dy
+ va_end(marker); // Reset variable arguments
+ addIndex++;
+ break;
+ case D_DISPLAY: // Display whole list
+ // Don't blit if newscreen just loaded because _frontBuffer will
+ // get blitted via InvalidateRect() at end of this cycle
+ // and blitting here causes objects to appear too soon.
+ if (_vm.getGameStatus().newScreenFl) {
+ _vm.getGameStatus().newScreenFl = false;
+ break;
+ }
+
+ // Coalesce restore-list, add-list into combined blit-list
+ blitLength = mergeLists(restoreList, blistList, restoreIndex, blitLength, BMAX);
+ blitLength = mergeLists(addList, blistList, addIndex, blitLength, BMAX);
+
+ // Blit the combined blit-list
+ for (restoreIndex = 0, p = blistList; restoreIndex < blitLength; restoreIndex++, p++)
+ if (p->dx) // Marks a used entry
+ displayRect(p->x, p->y, p->dx, p->dy);
+ break;
+ case D_RESTORE: // Restore each rectangle
+ for (restoreIndex = 0, p = addList; restoreIndex < addIndex; restoreIndex++, p++) {
+ // Restoring from _backBuffer to _frontBuffer
+ restoreList[restoreIndex] = *p; // Copy add-list to restore-list
+ moveImage(_backBuffer, p->x, p->y, p->dx, p->dy, XPIX, _frontBuffer, p->x, p->y, XPIX);
+ }
+ addIndex = 0; // Reset add-list
+ break;
+ }
+}
+
+void Screen::writeChr(int sx, int sy, byte color, char *local_fontdata) {
+ /*
+ Write supplied character (font data) at sx,sy in supplied color
+ Font data as follows:
+
+ *(fontdata+1) = Font Height (pixels)
+ *(fontdata+1) = Font Width (pixels)
+ *(fontdata+x) = Font Bitmap (monochrome)
+ */
+
+ debugC(2, kDebugDisplay, "writeChr(%d, %d, %d, %d)", sx, sy, color, local_fontdata[0]);
+
+ byte height = local_fontdata[0];
+ byte width = 8; //local_fontdata[1];
+
+ // This can probably be optimized quite a bit...
+ for (int y = 0; y < height; ++y)
+ for (int x = 0; x < width; ++x) {
+ int pixel = y * width + x;
+ int bitpos = pixel % 8;
+ int offset = pixel / 8;
+ byte bitTest = (1 << bitpos);
+ if ((local_fontdata[2 + offset] & bitTest) == bitTest)
+ _frontBuffer[(sy + y) * 320 + sx + x] = color;
+ //printf("offset: %u, bitpos %u\n", offset, bitpos);
+ }
+}
+
+// Returns height of characters in current font
+int16 Screen::fontHeight() {
+ debugC(2, kDebugDisplay, "fontHeight");
+
+ static int16 height[NUM_FONTS] = {5, 7, 8};
+ return(height[_fnt - FIRST_FONT]);
+}
+
+
+// Returns length of supplied string in pixels
+int16 Screen::stringLength(char *s) {
+ int16 sum;
+ byte **fontArr = _font[_fnt];
+
+ debugC(2, kDebugDisplay, "stringLength(%s)", s);
+
+ for (sum = 0; *s; s++)
+ sum += *(fontArr[(uint)*s] + 1) + 1;
+
+ return(sum);
+}
+
+// Return x which would center supplied string
+int16 Screen::center(char *s) {
+ debugC(1, kDebugDisplay, "center(%s)", s);
+
+ return ((int16)((XPIX - stringLength(s)) >> 1));
+}
+
+// Write string at sx,sy in supplied color in current font
+// If sx == CENTER, center it
+void Screen::writeStr(int16 sx, int16 sy, char *s, byte color) {
+ byte **font = _font[_fnt];
+
+ debugC(2, kDebugDisplay, "writeStr(%d, %d, %s, %d)", sx, sy, s, color);
+
+ if (sx == CENTER)
+ sx = center(s);
+
+ for (; *s; s++) {
+ writeChr(sx, sy, color, (char *)font[(uint)*s]);
+ sx += *(font[(uint)*s] + 1) + 1;
+ }
+}
+
+// Shadowed version of writestr
+void Screen::shadowStr(int16 sx, int16 sy, char *s, byte color) {
+ debugC(1, kDebugDisplay, "shadowStr(%d, %d, %s, %d)", sx, sy, s, color);
+
+ if (sx == CENTER)
+ sx = center(s);
+
+ writeStr(sx + 1, sy + 1, s, _TBLACK);
+ writeStr(sx, sy, s, color);
+}
+
+// Load font file, construct font ptrs and reverse data bytes
+void Screen::loadFont(int16 fontId) {
+ byte height, width;
+ static bool fontLoadedFl[NUM_FONTS] = {false, false, false};
+
+ debugC(2, kDebugDisplay, "loadFont(%d)", fontId);
+
+ _fnt = fontId - FIRST_FONT; // Set current font number
+
+ if (fontLoadedFl[_fnt]) // If already loaded, return
+ return;
+
+ fontLoadedFl[_fnt] = true;
+ _vm.file().readUIFItem(fontId, _fontdata[_fnt]);
+
+ // Compile font ptrs. Note: First ptr points to height,width of font
+ _font[_fnt][0] = _fontdata[_fnt]; // Store height,width of fonts
+
+ int16 offset = 2; // Start at fontdata[2] ([0],[1] used for height,width)
+
+ // Setup the font array (127 characters)
+ for (int i = 1; i < 128; i++) {
+ _font[_fnt][i] = _fontdata[_fnt] + offset;
+ height = *(_fontdata[_fnt] + offset);
+ width = *(_fontdata[_fnt] + offset + 1);
+
+ int16 size = height * ((width + 7) >> 3);
+ for (int j = 0; j < size; j++)
+ Utils::reverseByte(&_fontdata[_fnt][offset + 2 + j]);
+
+ offset += 2 + size;
+ }
+}
+
+void Screen::userHelp() {
+// Introduce user to the game
+// DOS versions Only
+ Utils::Box(BOX_ANY , "%s",
+ "F1 - Press F1 again\n"
+ " for instructions\n"
+ "F2 - Sound on/off\n"
+ "F3 - Recall last line\n"
+ "F4 - Save game\n"
+ "F5 - Restore game\n"
+ "F6 - Inventory\n"
+ "F8 - Turbo button\n"
+ "F9 - Boss button\n\n"
+ "ESC - Return to game");
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/display.h b/engines/hugo/display.h
new file mode 100644
index 0000000000..5062664c18
--- /dev/null
+++ b/engines/hugo/display.h
@@ -0,0 +1,103 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_DISPLAY_H
+#define HUGO_DISPLAY_H
+namespace Hugo {
+
+enum overlayState_t {UNDEF, FG, BG}; // Overlay state
+struct rect_t;
+
+class Screen {
+public:
+ Screen(HugoEngine &vm);
+
+ int16 fontHeight();
+ int16 stringLength(char *s);
+
+ void displayBackground();
+ void displayFrame(int sx, int sy, seq_t *seq, bool foreFl);
+ void displayList(dupdate_t update, ...);
+ void displayRect(int16 x, int16 y, int16 dx, int16 dy);
+ void initDisplay();
+ void loadFont(int16 fontId);
+ void moveImage(image_pt srcImage, uint16 x1, uint16 y1, uint16 dx, uint16 dy, uint16 width1, image_pt dstImage, uint16 x2, uint16 y2, uint16 width2);
+ void remapPal(uint16 oldIndex, uint16 newIndex);
+ void restorePal(Common::SeekableReadStream *f);
+ void savePal(Common::WriteStream *f);
+ void setBackgroundColor(long color);
+ void shadowStr(int16 sx, int16 sy, char *s, byte color);
+ void userHelp();
+ void writeChar(int16 x, int16 y, char c, byte color);
+ void writeStr(int16 sx, int16 sy, char *s, byte color);
+
+ icondib_t &getIconBuffer() {
+ return _iconBuffer;
+ }
+ viewdib_t &getBackBuffer() {
+ return _backBuffer;
+ }
+ viewdib_t &getBackBufferBackup() {
+ return _backBufferBackup;
+ }
+ viewdib_t &getFrontBuffer() {
+ return _frontBuffer;
+ }
+ viewdib_t &getGUIBuffer() {
+ return _GUIBuffer;
+ }
+
+private:
+ HugoEngine &_vm;
+
+ // Fonts used in dib (non-GDI)
+ byte _fnt; // Current font number
+ byte _fontdata[NUM_FONTS][FONTSIZE]; // Font data
+ byte *_font[NUM_FONTS][FONT_LEN]; // Ptrs to each char
+
+ viewdib_t _frontBuffer;
+ viewdib_t _backBuffer;
+ viewdib_t _GUIBuffer; // User interface images
+ viewdib_t _backBufferBackup; // Backup _backBuffer during inventory
+ icondib_t _iconBuffer; // Inventory icon DIB
+
+ void createPal();
+ overlayState_t findOvl(seq_t *seq_p, image_pt dst_p, uint16 y);
+ void merge(rect_t *rectA, rect_t *rectB);
+ int16 mergeLists(rect_t *list, rect_t *blist, int16 len, int16 blen, int16 bmax);
+ void writeChr(int sx, int sy, byte color, char *local_fontdata);
+ int16 center(char *s);
+};
+
+} // End of namespace Hugo
+
+#endif //HUGO_DISPLAY_H
diff --git a/engines/hugo/engine.cpp b/engines/hugo/engine.cpp
new file mode 100644
index 0000000000..ab31f5da93
--- /dev/null
+++ b/engines/hugo/engine.cpp
@@ -0,0 +1,973 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo 1-3 Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#include "common/system.h"
+#include "common/random.h"
+#include "common/EventRecorder.h"
+
+#include "hugo/game.h"
+#include "hugo/hugo.h"
+#include "hugo/engine.h"
+#include "hugo/global.h"
+#include "hugo/file.h"
+#include "hugo/schedule.h"
+#include "hugo/display.h"
+#include "hugo/parser.h"
+#include "hugo/route.h"
+#include "hugo/util.h"
+#include "hugo/sound.h"
+
+namespace Hugo {
+
+#define EDGE 10 // Closest object can get to edge of screen
+#define EDGE2 (EDGE * 2) // Push object further back on edge collision
+#define SHIFT 8 // Place hero this far inside bounding box
+#define MAX_OBJECTS 128 // Used in Update_images()
+#define BOUND(X, Y) ((_boundary[Y * XBYTES + X / 8] & (0x80 >> X % 8)) != 0) // Boundary bit set
+
+config_t _config; // User's config
+maze_t _maze = {false, 0, 0, 0, 0, 0, 0, 0, 0}; // Default to not in maze
+hugo_boot_t _boot; // Boot info structure file
+char _textBoxBuffer[MAX_BOX]; // Buffer for text box
+command_t _line = ""; // Line of user text input
+
+
+// Sets the playlist to be the default tune selection
+void HugoEngine::initPlaylist(bool playlist[MAX_TUNES]) {
+ debugC(1, kDebugEngine, "initPlaylist");
+
+ for (int16 i = 0; i < MAX_TUNES; i++)
+ playlist[i] = false;
+ for (int16 i = 0; _defltTunes[i] != -1; i++)
+ playlist[_defltTunes[i]] = true;
+}
+
+// Initialize the dynamic game status
+void HugoEngine::initStatus() {
+ debugC(1, kDebugEngine, "initStatus");
+ _status.initSaveFl = false; // Don't force initial save
+ _status.storyModeFl = false; // Not in story mode
+ _status.gameOverFl = false; // Hero not knobbled yet
+ _status.recordFl = false; // Not record mode
+ _status.playbackFl = false; // Not playback mode
+ _status.demoFl = false; // Not demo mode
+ _status.textBoxFl = false; // Not processing a text box
+// Strangerke - Not used ?
+// _status.mmtime = false; // Multimedia timer support
+ _status.lookFl = false; // Toolbar "look" button
+ _status.recallFl = false; // Toolbar "recall" button
+ _status.leftButtonFl = false; // Left mouse button pressed
+ _status.rightButtonFl = false; // Right mouse button pressed
+ _status.newScreenFl = false; // Screen not just loaded
+ _status.jumpExitFl = false; // Can't jump to a screen exit
+ _status.godModeFl = false; // No special cheats allowed
+ _status.helpFl = false; // Not calling WinHelp()
+ _status.path[0] = 0; // Path to write files
+ _status.saveSlot = 0; // Slot to save/restore game
+ _status.screenWidth = 0; // Desktop screen width
+
+ // Initialize every start of new game
+ _status.tick = 0; // Tick count
+ _status.saveTick = 0; // Time of last save
+ _status.viewState = V_IDLE; // View state
+ _status.inventoryState = I_OFF; // Inventory icon bar state
+ _status.inventoryHeight = 0; // Inventory icon bar pos
+ _status.inventoryObjId = -1; // Inventory object selected (none)
+ _status.routeIndex = -1; // Hero not following a route
+ _status.go_for = GO_SPACE; // Hero walking to space
+ _status.go_id = -1; // Hero not walking to anything
+}
+
+// Initialize default config values. Must be done before Initialize().
+// Reset needed to save config.cx,cy which get splatted during OnFileNew()
+void HugoEngine::initConfig(inst_t action) {
+ static int16 cx, cy; // Save window size, pos
+ int16 i;
+
+ debugC(1, kDebugEngine, "initConfig(%d)", action);
+
+ switch (action) {
+ case INSTALL:
+ _config.musicFl = true; // Music state initially on
+ _config.soundFl = true; // Sound state initially on
+ _config.turboFl = false; // Turbo state initially off
+ _config.backgroundMusicFl = false; // No music when inactive
+ _config.cx = VIEW_DX * 2; // Window view size
+ _config.cy = VIEW_DY * 2;
+
+ _config.musicVolume = 85; // Music volume %
+ _config.soundVolume = 100; // Sound volume %
+ initPlaylist(_config.playlist); // Initialize default tune playlist
+
+ file().readBootFile(); // Read startup structure
+
+ cx = _config.cx; // Save these around OnFileNew()
+ cy = _config.cy;
+ break;
+ case RESET:
+ _config.cx = cx; // Restore cx, cy
+ _config.cy = cy;
+
+ // Find first tune and play it
+ for (i = 0; i < MAX_TUNES; i++)
+ if (_config.playlist[i]) {
+ sound().playMusic(i);
+ break;
+ }
+
+ file().initSavedGame(); // Initialize saved game
+ break;
+ case RESTORE:
+ warning("Unhandled action RESTORE");
+ break;
+ }
+}
+void HugoEngine::initialize() {
+ debugC(1, kDebugEngine, "initialize");
+
+ sound().initSound();
+ scheduler().initEventQueue(); // Init scheduler stuff
+ screen().initDisplay(); // Create Dibs and palette
+ file().openDatabaseFiles(); // Open database files
+ calcMaxScore(); // Initialise maxscore
+
+ _rnd = new Common::RandomSource();
+ g_eventRec.registerRandomSource(*_rnd, "hugo");
+
+ _rnd->setSeed(42); // Kick random number generator
+
+ switch (getGameType()) {
+ case kGameTypeHugo1:
+ _episode = "\"HUGO'S HOUSE OF HORRORS\"";
+ _picDir = "";
+ break;
+ case kGameTypeHugo2:
+ _episode = "\"Hugo's Mystery Adventure\"";
+ _picDir = "hugo2/";
+ break;
+ case kGameTypeHugo3:
+ _episode = "\"Hugo's Amazon Adventure\"";
+ _picDir = "hugo3/";
+ break;
+ default:
+ error("Unknown game");
+ }
+}
+
+// Restore all resources before termination
+void HugoEngine::shutdown() {
+ debugC(1, kDebugEngine, "shutdown");
+
+ file().closeDatabaseFiles();
+ if (_status.recordFl || _status.playbackFl)
+ file().closePlaybackFile();
+ freeObjects();
+}
+
+void HugoEngine::readObjectImages() {
+ debugC(1, kDebugEngine, "readObjectImages");
+
+ for (int i = 0; i < _numObj; i++)
+ file().readImage(i, &_objects[i]);
+}
+
+// Read the uif image file (inventory icons)
+void HugoEngine::readUIFImages() {
+ debugC(1, kDebugEngine, "readUIFImages");
+
+ file().readUIFItem(UIF_IMAGES, screen().getGUIBuffer()); // Read all uif images
+}
+
+// Read scenery, overlay files for given screen number
+void HugoEngine::readScreenFiles(int screenNum) {
+ debugC(1, kDebugEngine, "readScreenFiles(%d)", screenNum);
+
+ file().readBackground(screenNum); // Scenery file
+ memcpy(screen().getBackBuffer(), screen().getFrontBuffer(), sizeof(screen().getFrontBuffer()));// Make a copy
+ file().readOverlay(screenNum, _boundary, BOUNDARY); // Boundary file
+ file().readOverlay(screenNum, _overlay, OVERLAY); // Overlay file
+ file().readOverlay(screenNum, _ovlBase, OVLBASE); // Overlay base file
+}
+
+// Update all object positions. Process object 'local' events
+// including boundary events and collisions
+void HugoEngine::moveObjects() {
+ object_t *obj;
+ seq_t *currImage;
+ int x1, x2, y1, y2; // object coordinates
+ int dx, dy; // Allowable motion wrt boundary
+ int8 radius; // Radius for chase (8 bit signed)
+
+ debugC(4, kDebugEngine, "moveObjects");
+
+ // If route mode enabled, do special route processing
+ if (_status.routeIndex >= 0)
+ route().processRoute();
+
+ // Perform any adjustments to velocity based on special path types
+ // and store all (visible) object baselines into the boundary file.
+ // Don't store foreground or background objects
+ for (int i = 0; i < _numObj; i++) {
+ obj = &_objects[i]; // Get pointer to object
+ currImage = obj->currImagePtr; // Get ptr to current image
+ if (obj->screenIndex == *_screen_p) {
+ switch (obj->pathType) {
+ case CHASE:
+ case CHASE2:
+ radius = obj->radius; // Default to object's radius
+ if (radius < 0) // If radius infinity, use closer value
+ radius = DX;
+
+ dx = _hero->x + _hero->currImagePtr->x1 - obj->x - currImage->x1;
+ dy = _hero->y + _hero->currImagePtr->y2 - obj->y - currImage->y2 - 1;
+ if (abs(dx) <= radius)
+ obj->vx = 0;
+ else
+ obj->vx = (dx > 0) ? MIN(dx, obj->vxPath) : MAX(dx, -obj->vxPath);
+ if (abs(dy) <= radius)
+ obj->vy = 0;
+ else
+ obj->vy = (dy > 0) ? MIN(dy, obj->vyPath) : MAX(dy, -obj->vyPath);
+
+ // Set first image in sequence (if multi-seq object)
+ switch (obj->seqNumb) {
+ case 4:
+ if (!obj->vx) { // Got 4 directions
+ if (obj->vx != obj->oldvx) { // vx just stopped
+ if (dy >= 0)
+ obj->currImagePtr = obj->seqList[DOWN].seqPtr;
+ else
+ obj->currImagePtr = obj->seqList[_UP].seqPtr;
+ }
+ } else if (obj->vx != obj->oldvx) {
+ if (dx > 0)
+ obj->currImagePtr = obj->seqList[RIGHT].seqPtr;
+ else
+ obj->currImagePtr = obj->seqList[LEFT].seqPtr;
+ }
+ break;
+ case 3:
+ case 2:
+ if (obj->vx != obj->oldvx) { // vx just stopped
+ if (dx > 0) // Left & right only
+ obj->currImagePtr = obj->seqList[RIGHT].seqPtr;
+ else
+ obj->currImagePtr = obj->seqList[LEFT].seqPtr;
+ }
+ break;
+ }
+
+ if (obj->vx || obj->vy)
+ obj->cycling = CYCLE_FORWARD;
+ else {
+ obj->cycling = NOT_CYCLING;
+ boundaryCollision(obj); // Must have got hero!
+ }
+ obj->oldvx = obj->vx;
+ obj->oldvy = obj->vy;
+ currImage = obj->currImagePtr; // Get (new) ptr to current image
+ break;
+ case WANDER2:
+ case WANDER:
+ if (!_rnd->getRandomNumber(3 * NORMAL_TPS)) { // Kick on random interval
+ obj->vx = _rnd->getRandomNumber(obj->vxPath << 1) - obj->vxPath;
+ obj->vy = _rnd->getRandomNumber(obj->vyPath << 1) - obj->vyPath;
+
+ // Set first image in sequence (if multi-seq object)
+ if (obj->seqNumb > 1) {
+ if (!obj->vx && (obj->seqNumb >= 4)) {
+ if (obj->vx != obj->oldvx) { // vx just stopped
+ if (obj->vy > 0)
+ obj->currImagePtr = obj->seqList[DOWN].seqPtr;
+ else
+ obj->currImagePtr = obj->seqList[_UP].seqPtr;
+ }
+ } else if (obj->vx != obj->oldvx) {
+ if (obj->vx > 0)
+ obj->currImagePtr = obj->seqList[RIGHT].seqPtr;
+ else
+ obj->currImagePtr = obj->seqList[LEFT].seqPtr;
+ }
+ }
+ obj->oldvx = obj->vx;
+ obj->oldvy = obj->vy;
+ currImage = obj->currImagePtr; // Get (new) ptr to current image
+ }
+ if (obj->vx || obj->vy)
+ obj->cycling = CYCLE_FORWARD;
+ break;
+ default:
+ ; // Really, nothing
+ }
+ // Store boundaries
+ if ((obj->cycling > ALMOST_INVISIBLE) && (obj->priority == FLOATING))
+ storeBoundary(obj->x + currImage->x1, obj->x + currImage->x2, obj->y + currImage->y2);
+ }
+ }
+
+ // Move objects, allowing for boundaries
+ for (int i = 0; i < _numObj; i++) {
+ obj = &_objects[i]; // Get pointer to object
+ if ((obj->screenIndex == *_screen_p) && (obj->vx || obj->vy)) {
+ // Only process if it's moving
+
+ // Do object movement. Delta_x,y return allowed movement in x,y
+ // to move as close to a boundary as possible without crossing it.
+ currImage = obj->currImagePtr; // Get ptr to current image
+ x1 = obj->x + currImage->x1; // Left edge of object
+ x2 = obj->x + currImage->x2; // Right edge
+ y1 = obj->y + currImage->y1; // Top edge
+ y2 = obj->y + currImage->y2; // Bottom edge
+
+ if ((obj->cycling > ALMOST_INVISIBLE) && (obj->priority == FLOATING))
+ clearBoundary(x1, x2, y2); // Clear our own boundary
+ dx = deltaX(x1, x2, obj->vx, y2);
+ if (dx != obj->vx) {
+ // An object boundary collision!
+ boundaryCollision(obj);
+ obj->vx = 0;
+ }
+
+ dy = deltaY(x1, x2, obj->vy, y2);
+
+ if (dy != obj->vy) {
+ // An object boundary collision!
+ boundaryCollision(obj);
+ obj->vy = 0;
+ }
+
+ if ((obj->cycling > ALMOST_INVISIBLE) && (obj->priority == FLOATING))
+ storeBoundary(x1, x2, y2); // Re-store our own boundary
+
+ obj->x += dx; // Update object position
+ obj->y += dy;
+
+ // Don't let object go outside screen
+ if (x1 < EDGE)
+ obj->x = EDGE2;
+ if (x2 > (XPIX - EDGE))
+ obj->x = XPIX - EDGE2 - (x2 - x1);
+ if (y1 < EDGE)
+ obj->y = EDGE2;
+ if (y2 > (YPIX - EDGE))
+ obj->y = YPIX - EDGE2 - (y2 - y1);
+
+ if ((obj->vx == 0) && (obj->vy == 0) && (obj->pathType != WANDER2) && (obj->pathType != CHASE2))
+ obj->cycling = NOT_CYCLING;
+ }
+ }
+
+ // Clear all object baselines from the boundary file.
+ for (int i = 0; i < _numObj; i++) {
+ obj = &_objects[i]; // Get pointer to object
+ currImage = obj->currImagePtr; // Get ptr to current image
+ if ((obj->screenIndex == *_screen_p) && (obj->cycling > ALMOST_INVISIBLE) && (obj->priority == FLOATING))
+ clearBoundary(obj->oldx + currImage->x1, obj->oldx + currImage->x2, obj->oldy + currImage->y2);
+ }
+
+ // If maze mode is enabled, do special maze processing
+ if (_maze.enabledFl)
+ processMaze();
+}
+
+// Return maximum allowed movement (from zero to vx) such that object does
+// not cross a boundary (either background or another object)
+int HugoEngine::deltaX(int x1, int x2, int vx, int y) {
+// Explanation of algorithm: The boundaries are drawn as contiguous
+// lines 1 pixel wide. Since DX,DY are not necessarily 1, we must
+// detect boundary crossing. If vx positive, examine each pixel from
+// x1 old to x2 new, else x2 old to x1 new, both at the y2 line.
+// If vx zero, no need to check. If vy non-zero then examine each
+// pixel on the line segment x1 to x2 from y old to y new.
+// Fix from Hugo I v1.5:
+// Note the diff is munged in the return statement to cater for a special
+// cases arising from differences in image widths from one sequence to
+// another. The problem occurs reversing direction at a wall where the
+// new image intersects before the object can move away. This is cured
+// by comparing the intersection with half the object width pos. If the
+// intersection is in the other half wrt the intended direction, use the
+// desired vx, else use the computed delta. i.e. believe the desired vx
+ int b;
+
+ debugC(3, kDebugEngine, "deltaX(%d, %d, %d, %d)", x1, x2, vx, y);
+
+ if (vx == 0)
+ return(0); // Object stationary
+
+ y *= XBYTES; // Offset into boundary file
+ if (vx > 0) {
+ // Moving to right
+ for (int i = x1 >> 3; i <= (x2 + vx) >> 3; i++) // Search by byte
+ if ((b = Utils::firstBit((byte)(_boundary[y + i] | _objBound[y + i]))) < 8) { // b is index or 8
+ // Compute x of boundary and test if intersection
+ b += i << 3;
+ if ((b >= x1) && (b <= x2 + vx))
+ return((b < x1 + ((x2 - x1) >> 1)) ? vx : b - x2 - 1); // return dx
+ }
+ } else {
+ // Moving to left
+ for (int i = x2 >> 3; i >= (x1 + vx) >> 3; i--)// Search by byte
+ if ((b = Utils::lastBit((byte)(_boundary[y + i] | _objBound[y + i]))) < 8) { // b is index or 8
+ // Compute x of boundary and test if intersection
+ b += i << 3;
+ if ((b >= x1 + vx) && (b <= x2))
+ return((b > x1 + ((x2 - x1) >> 1)) ? vx : b - x1 + 1); // return dx
+ }
+ }
+ return(vx);
+}
+
+// Similar to Delta_x, but for movement in y direction. Special case of
+// bytes at end of line segment; must only count boundary bits falling on
+// line segment.
+int HugoEngine::deltaY(int x1, int x2, int vy, int y) {
+ int inc, i, j, b;
+
+ debugC(3, kDebugEngine, "deltaY(%d, %d, %d, %d)", x1, x2, vy, y);
+
+ if (vy == 0)
+ return(0); // Object stationary
+
+ inc = (vy > 0) ? 1 : -1;
+ for (j = y + inc; j != (y + vy + inc); j += inc) //Search by byte
+ for (i = x1 >> 3; i <= x2 >> 3; i++)
+ if ((b = _boundary[j * XBYTES + i] | _objBound[j * XBYTES + i]) != 0) { // Any bit set
+ // Make sure boundary bits fall on line segment
+ if (i == (x2 >> 3)) // Adjust right end
+ b &= 0xff << ((i << 3) + 7 - x2);
+ else if (i == (x1 >> 3)) // Adjust left end
+ b &= 0xff >> (x1 - (i << 3));
+ if (b)
+ return(j - y - inc);
+ }
+ return(vy);
+}
+
+// Store a horizontal line segment in the object boundary file
+void HugoEngine::storeBoundary(int x1, int x2, int y) {
+ byte *b; // ptr to boundary byte
+
+ debugC(5, kDebugEngine, "storeBoundary(%d, %d, %d)", x1, x2, y);
+
+ for (int i = x1 >> 3; i <= x2 >> 3; i++) { // For each byte in line
+ b = &_objBound[y * XBYTES + i]; // get boundary byte
+ if (i == x2 >> 3) // Adjust right end
+ *b |= 0xff << ((i << 3) + 7 - x2);
+ else if (i == x1 >> 3) // Adjust left end
+ *b |= 0xff >> (x1 - (i << 3));
+ else
+ *b = 0xff;
+ }
+}
+
+// Clear a horizontal line segment in the object boundary file
+void HugoEngine::clearBoundary(int x1, int x2, int y) {
+ int i;
+ byte *b; // ptr to boundary byte
+
+ debugC(5, kDebugEngine, "clearBoundary(%d, %d, %d)", x1, x2, y);
+
+ for (i = x1 >> 3; i <= x2 >> 3; i++) { // For each byte in line
+ b = &_objBound[y * XBYTES + i]; // get boundary byte
+ if (i == x2 >> 3) // Adjust right end
+ *b &= ~(0xff << ((i << 3) + 7 - x2));
+ else if (i == x1 >> 3) // Adjust left end
+ *b &= ~(0xff >> (x1 - (i << 3)));
+ else
+ *b = 0;
+ }
+}
+
+// Maze mode is enabled. Check to see whether hero has crossed the maze
+// bounding box, if so, go to the next room */
+void HugoEngine::processMaze() {
+ seq_t *currImage;
+ int x1, x2, y1, y2; // hero coordinates
+
+ debugC(1, kDebugEngine, "processMaze");
+
+ currImage = _hero->currImagePtr; // Get ptr to current image
+ x1 = _hero->x + currImage->x1; // Left edge of object
+ x2 = _hero->x + currImage->x2; // Right edge
+ y1 = _hero->y + currImage->y1; // Top edge
+ y2 = _hero->y + currImage->y2; // Bottom edge
+
+ if (x1 < _maze.x1) {
+ // Exit west
+ _actListArr[_alNewscrIndex][3].a8.screenIndex = *_screen_p - 1;
+ _actListArr[_alNewscrIndex][0].a2.x = _maze.x2 - SHIFT - (x2 - x1);
+ _actListArr[_alNewscrIndex][0].a2.y = _hero->y;
+ _status.routeIndex = -1;
+ scheduler().insertActionList(_alNewscrIndex);
+ } else if (x2 > _maze.x2) {
+ // Exit east
+ _actListArr[_alNewscrIndex][3].a8.screenIndex = *_screen_p + 1;
+ _actListArr[_alNewscrIndex][0].a2.x = _maze.x1 + SHIFT;
+ _actListArr[_alNewscrIndex][0].a2.y = _hero->y;
+ _status.routeIndex = -1;
+ scheduler().insertActionList(_alNewscrIndex);
+ } else if (y1 < _maze.y1 - SHIFT) {
+ // Exit north
+ _actListArr[_alNewscrIndex][3].a8.screenIndex = *_screen_p - _maze.size;
+ _actListArr[_alNewscrIndex][0].a2.x = _maze.x3;
+ _actListArr[_alNewscrIndex][0].a2.y = _maze.y2 - SHIFT - (y2 - y1);
+ _status.routeIndex = -1;
+ scheduler().insertActionList(_alNewscrIndex);
+ } else if (y2 > _maze.y2 - SHIFT / 2) {
+ // Exit south
+ _actListArr[_alNewscrIndex][3].a8.screenIndex = *_screen_p + _maze.size;
+ _actListArr[_alNewscrIndex][0].a2.x = _maze.x4;
+ _actListArr[_alNewscrIndex][0].a2.y = _maze.y1 + SHIFT;
+ _status.routeIndex = -1;
+ scheduler().insertActionList(_alNewscrIndex);
+ }
+}
+
+// Compare function for the quicksort. The sort is to order the objects in
+// increasing vertical position, using y+y2 as the baseline
+// Returns -1 if ay2 < by2 else 1 if ay2 > by2 else 0
+int HugoEngine::y2comp(const void *a, const void *b) {
+ int ay2, by2;
+
+ debugC(6, kDebugEngine, "y2comp");
+
+ const object_t *p1 = &s_Engine->_objects[*(const byte *)a];
+ const object_t *p2 = &s_Engine->_objects[*(const byte *)b];
+
+ if (p1 == p2)
+ // Why does qsort try the same indexes?
+ return (0);
+
+ if (p1->priority == BACKGROUND)
+ return (-1);
+
+ if (p2->priority == BACKGROUND)
+ return (1);
+
+ if (p1->priority == FOREGROUND)
+ return (1);
+
+ if (p2->priority == FOREGROUND)
+ return (-1);
+
+ ay2 = p1->y + p1->currImagePtr->y2;
+ by2 = p2->y + p2->currImagePtr->y2;
+
+ return(ay2 - by2);
+}
+
+// Draw all objects on screen as follows:
+// 1. Sort 'FLOATING' objects in order of y2 (base of object)
+// 2. Display new object frames/positions in dib
+// Finally, cycle any animating objects to next frame
+void HugoEngine::updateImages() {
+ int i, j, num_objs;
+ object_t *obj; // Pointer to object
+ seq_t *seqPtr; // Save curr_seq_p
+ byte objindex[MAX_OBJECTS]; // Array of indeces to objects
+
+ debugC(5, kDebugEngine, "updateImages");
+
+ // Initialise the index array to visible objects in current screen
+ for (i = 0, num_objs = 0; i < _numObj; i++) {
+ obj = &_objects[i];
+ if ((obj->screenIndex == *_screen_p) && (obj->cycling >= ALMOST_INVISIBLE))
+ objindex[num_objs++] = i;
+ }
+
+ // Sort the objects into increasing y+y2 (painter's algorithm)
+ qsort(objindex, num_objs, sizeof(objindex[0]), y2comp);
+
+ // Add each visible object to display list
+ for (i = 0; i < num_objs; i++) {
+ obj = &_objects[objindex[i]];
+ // Count down inter-frame timer
+ if (obj->frameTimer)
+ obj->frameTimer--;
+
+ if (obj->cycling > ALMOST_INVISIBLE) // Only if visible
+ switch (obj->cycling) {
+ case NOT_CYCLING:
+ screen().displayFrame(obj->x, obj->y, obj->currImagePtr, obj->priority == OVEROVL);
+ break;
+ case CYCLE_FORWARD:
+ if (obj->frameTimer) // Not time to see next frame yet
+ screen().displayFrame(obj->x, obj->y, obj->currImagePtr, obj->priority == OVEROVL);
+ else
+ screen().displayFrame(obj->x, obj->y, obj->currImagePtr->nextSeqPtr, obj->priority == OVEROVL);
+ break;
+ case CYCLE_BACKWARD:
+ seqPtr = obj->currImagePtr;
+ if (!obj->frameTimer) // Show next frame
+ while (seqPtr->nextSeqPtr != obj->currImagePtr)
+ seqPtr = seqPtr->nextSeqPtr;
+ screen().displayFrame(obj->x, obj->y, seqPtr, obj->priority == OVEROVL);
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Cycle any animating objects
+ for (i = 0; i < num_objs; i++) {
+ obj = &_objects[objindex[i]];
+ if (obj->cycling != INVISIBLE) {
+ // Only if it's visible
+ if (obj->cycling == ALMOST_INVISIBLE)
+ obj->cycling = INVISIBLE;
+
+ // Now Rotate to next picture in sequence
+ switch (obj->cycling) {
+ case NOT_CYCLING:
+ break;
+ case CYCLE_FORWARD:
+ if (!obj->frameTimer) {
+ // Time to step to next frame
+ obj->currImagePtr = obj->currImagePtr->nextSeqPtr;
+ // Find out if this is last frame of sequence
+ // If so, reset frame_timer and decrement n_cycle
+ if (obj->frameInterval || obj->cycleNumb) {
+ obj->frameTimer = obj->frameInterval;
+ for (j = 0; j < obj->seqNumb; j++)
+ if (obj->currImagePtr->nextSeqPtr == obj->seqList[j].seqPtr)
+ if (obj->cycleNumb) // Decr cycleNumb if Non-continous
+ if (!--obj->cycleNumb)
+ obj->cycling = NOT_CYCLING;
+ }
+ }
+ break;
+ case CYCLE_BACKWARD:
+ if (!obj->frameTimer) {
+ // Time to step to prev frame
+ seqPtr = obj->currImagePtr;
+ while (obj->currImagePtr->nextSeqPtr != seqPtr)
+ obj->currImagePtr = obj->currImagePtr->nextSeqPtr;
+ // Find out if this is first frame of sequence
+ // If so, reset frame_timer and decrement n_cycle
+ if (obj->frameInterval || obj->cycleNumb) {
+ obj->frameTimer = obj->frameInterval;
+ for (j = 0; j < obj->seqNumb; j++)
+ if (obj->currImagePtr == obj->seqList[j].seqPtr)
+ if (obj->cycleNumb) // Decr cycleNumb if Non-continous
+ if (!--obj->cycleNumb)
+ obj->cycling = NOT_CYCLING;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ obj->oldx = obj->x;
+ obj->oldy = obj->y;
+ }
+ }
+}
+
+// Return object index of the topmost object under the cursor, or -1 if none
+// Objects are filtered if not "useful"
+int16 HugoEngine::findObject(uint16 x, uint16 y) {
+ object_t *obj;
+ seq_t *curImage;
+ int16 objIndex = -1; // Index of found object
+ uint16 y2Max = 0; // Greatest y2
+ int i;
+
+ debugC(3, kDebugEngine, "findObject(%d, %d)", x, y);
+
+ // Check objects on screen
+ for (i = 0, obj = _objects; i < _numObj; i++, obj++) {
+ // Object must be in current screen and "useful"
+ if (obj->screenIndex == *_screen_p && (obj->genericCmd || obj->objValue || obj->cmdIndex)) {
+ curImage = obj->currImagePtr;
+ // Object must have a visible image...
+ if (curImage != NULL && obj->cycling != INVISIBLE) {
+ // If cursor inside object
+ if (x >= (uint16)obj->x && x <= obj->x + curImage->x2 && y >= (uint16)obj->y && y <= obj->y + curImage->y2)
+ // If object is closest so far
+ if (obj->y + curImage->y2 > y2Max) {
+ y2Max = obj->y + curImage->y2;
+ objIndex = i; // Found an object!
+ }
+ } else
+ // ...or a dummy object that has a hotspot rectangle
+ if (curImage == NULL && obj->vxPath != 0 && !obj->carriedFl) {
+ // If cursor inside special rectangle
+ if ((int16)x >= obj->oldx && (int16)x < obj->oldx + obj->vxPath && (int16)y >= obj->oldy && (int16)y < obj->oldy + obj->vyPath)
+ // If object is closest so far
+ if (obj->oldy + obj->vyPath - 1 > (int16)y2Max) {
+ y2Max = obj->oldy + obj->vyPath - 1;
+ objIndex = i; // Found an object!
+ }
+ }
+ }
+ }
+ return objIndex;
+}
+
+// Find a clear space around supplied object that hero can walk to
+bool HugoEngine::findObjectSpace(object_t *obj, int16 *destx, int16 *desty) {
+// bool found = false; // TRUE if we found a clear space
+ bool foundFl;
+ seq_t *curImage = obj->currImagePtr;
+ int16 x;
+ int16 y = obj->y + curImage->y2 - 1;
+
+ debugC(1, kDebugEngine, "findObjectSpace(obj, %d, %d)", *destx, *desty);
+
+// if (!found) // Try left rear corner
+ for (foundFl = true, *destx = x = obj->x + curImage->x1; x < *destx + HERO_MAX_WIDTH; x++)
+ if (BOUND(x, y))
+ foundFl = false;
+
+ if (!foundFl) // Try right rear corner
+ for (foundFl = true, *destx = x = obj->x + curImage->x2 - HERO_MAX_WIDTH + 1; x <= obj->x + (int16)curImage->x2; x++)
+ if (BOUND(x, y))
+ foundFl = false;
+
+ if (!foundFl) // Try left front corner
+ for (foundFl = true, y += 2, *destx = x = obj->x + curImage->x1; x < *destx + HERO_MAX_WIDTH; x++)
+ if (BOUND(x, y))
+ foundFl = false;
+
+ if (!foundFl) // Try right rear corner
+ for (foundFl = true, *destx = x = obj->x + curImage->x2 - HERO_MAX_WIDTH + 1; x <= obj->x + (int16)curImage->x2; x++)
+ if (BOUND(x, y))
+ foundFl = false;
+
+ *desty = y;
+ return(foundFl);
+}
+
+// Search background command list for this screen for supplied object.
+// Return first associated verb (not "look") or NULL if none found.
+char *HugoEngine::useBG(char *name) {
+ int i;
+ objectList_t p = _backgroundObjects[*_screen_p];
+
+ debugC(1, kDebugEngine, "useBG(%s)", name);
+
+ for (i = 0; *_arrayVerbs[p[i].verbIndex]; i++)
+ if ((name == _arrayNouns[p[i].nounIndex][0] &&
+ p[i].verbIndex != _look) &&
+ ((p[i].roomState == DONT_CARE) || (p[i].roomState == _screenStates[*_screen_p])))
+ return (_arrayVerbs[p[i].verbIndex][0]);
+
+ return (NULL);
+}
+
+// If status.objid = -1, pick up objid, else use status.objid on objid,
+// if objid can't be picked up, use it directly
+void HugoEngine::useObject(int16 objId) {
+ object_t *obj = &_objects[objId]; // Ptr to object
+ uses_t *use; // Ptr to use entry
+ target_t *target; // Ptr to target entry
+ bool foundFl; // TRUE if found target entry
+ char *verb; // Background verb to use directly
+
+ debugC(1, kDebugEngine, "useObject(%d)", objId);
+
+ if (_status.inventoryObjId == -1) {
+ // Get or use objid directly
+ if ((obj->genericCmd & TAKE) || obj->objValue) // Get collectible item
+ sprintf(_line, "%s %s", _arrayVerbs[_take][0], _arrayNouns[obj->nounIndex][0]);
+ else if (obj->cmdIndex != 0) // Use non-collectible item if able
+ sprintf(_line, "%s %s", _arrayVerbs[_cmdList[obj->cmdIndex][1].verbIndex][0], _arrayNouns[obj->nounIndex][0]);
+ else if ((verb = useBG(_arrayNouns[obj->nounIndex][0])) != NULL)
+ sprintf(_line, "%s %s", verb, _arrayNouns[obj->nounIndex][0]);
+ else
+ return; // Can't use object directly
+ } else {
+ // Use status.objid on objid
+ // Default to first cmd verb
+ sprintf(_line, "%s %s %s", _arrayVerbs[_cmdList[_objects[_status.inventoryObjId].cmdIndex][1].verbIndex][0], _arrayNouns[_objects[_status.inventoryObjId].nounIndex][0], _arrayNouns[obj->nounIndex][0]);
+
+ // Check valid use of objects and override verb if necessary
+ for (use = _uses; use->objId != _numObj; use++)
+ if (_status.inventoryObjId == use->objId) {
+ // Look for secondary object, if found use matching verb
+ for (foundFl = false, target = use->targets; _arrayNouns[target->nounIndex] != NULL; target++)
+ if (_arrayNouns[target->nounIndex][0] == _arrayNouns[obj->nounIndex][0]) {
+ foundFl = true;
+ sprintf(_line, "%s %s %s", _arrayVerbs[target->verbIndex][0], _arrayNouns[_objects[_status.inventoryObjId].nounIndex][0], _arrayNouns[obj->nounIndex][0]);
+ }
+
+ // No valid use of objects found, print failure string
+ if (!foundFl) {
+ // Deselect dragged icon if inventory not active
+ if (_status.inventoryState != I_ACTIVE)
+ _status.inventoryObjId = -1;
+ Utils::Box(BOX_ANY, "%s", _textData[use->dataIndex]);
+ return;
+ }
+ }
+ }
+
+ if (_status.inventoryState == I_ACTIVE) // If inventory active, remove it
+ _status.inventoryState = I_UP;
+ _status.inventoryObjId = -1; // Deselect any dragged icon
+ parser().lineHandler(); // and process command
+}
+
+// Issue "Look at <object>" command
+// Note special case of swapped hero image
+void HugoEngine::lookObject(object_t *obj) {
+ debugC(1, kDebugEngine, "lookObject");
+
+ if (obj == _hero) {
+ // Hero swapped - look at other
+ obj = &_objects[_heroImage];
+ }
+ parser().command("%s %s", _arrayVerbs[_look][0], _arrayNouns[obj->nounIndex][0]);
+}
+
+// Free all object images
+void HugoEngine::freeObjects() {
+ object_t *obj;
+ seq_t *seq;
+
+ debugC(1, kDebugEngine, "freeObjects");
+
+ // Nothing to do if not allocated yet
+ if (_hero->seqList[0].seqPtr == NULL)
+ return;
+
+ // Free all sequence lists and image data
+ for (int i = 0; i < _numObj; i++) {
+ obj = &_objects[i];
+ for (int j = 0; j < obj->seqNumb; j++) { // for each sequence
+ seq = obj->seqList[j].seqPtr; // Free image
+ if (seq == NULL) // Failure during database load
+ break;
+ do {
+ free(seq->imagePtr);
+ seq = seq->nextSeqPtr;
+ } while (seq != obj->seqList[j].seqPtr);
+ free(seq); // Free sequence record
+ }
+ }
+}
+
+// Add action lists for this screen to event queue
+void HugoEngine::screenActions(int screenNum) {
+ uint16 *screenAct = _screenActs[screenNum];
+
+ debugC(1, kDebugEngine, "screenActions(%d)", screenNum);
+
+ if (screenAct) {
+ for (int i = 0; screenAct[i]; i++)
+ scheduler().insertActionList(screenAct[i]);
+ }
+}
+
+// Set the new screen number into the hero object and any carried objects
+void HugoEngine::setNewScreen(int screenNum) {
+ debugC(1, kDebugEngine, "setNewScreen(%d)", screenNum);
+
+ *_screen_p = screenNum; // HERO object
+ for (int i = HERO + 1; i < _numObj; i++) // Any others
+ if (_objects[i].carriedFl) // being carried
+ _objects[i].screenIndex = screenNum;
+}
+
+// An object has collided with a boundary. See if any actions are required
+void HugoEngine::boundaryCollision(object_t *obj) {
+ int x, y, dx, dy;
+ int8 radius; // 8 bits signed
+ hotspot_t *hotspot;
+
+ debugC(1, kDebugEngine, "boundaryCollision");
+
+ if (obj == _hero) {
+ // Hotspots only relevant to HERO
+ if (obj->vx > 0)
+ x = obj->x + obj->currImagePtr->x2;
+ else
+ x = obj->x + obj->currImagePtr->x1;
+ y = obj->y + obj->currImagePtr->y2;
+
+ for (int i = 0; _hotspots[i].screenIndex >= 0; i++) {
+ hotspot = &_hotspots[i];
+ if (hotspot->screenIndex == obj->screenIndex)
+ if ((x >= hotspot->x1) && (x <= hotspot->x2) && (y >= hotspot->y1) && (y <= hotspot->y2)) {
+ scheduler().insertActionList(hotspot->actIndex);
+ break;
+ }
+ }
+ } else {
+ // Check whether an object collided with HERO
+ dx = _hero->x + _hero->currImagePtr->x1 - obj->x - obj->currImagePtr->x1;
+ dy = _hero->y + _hero->currImagePtr->y2 - obj->y - obj->currImagePtr->y2;
+ // If object's radius is infinity, use a closer value
+ radius = obj->radius;
+ if (radius < 0)
+ radius = DX * 2;
+ if ((abs(dx) <= radius) && (abs(dy) <= radius))
+ scheduler().insertActionList(obj->actIndex);
+ }
+}
+
+// Initialize screen components and display results
+void HugoEngine::initNewScreenDisplay() {
+ debugC(1, kDebugEngine, "initNewScreenDisplay");
+
+ screen().displayList(D_INIT);
+ screen().setBackgroundColor(_TBLACK);
+ screen().displayBackground();
+
+ // Stop premature object display in Display_list(D_DISPLAY)
+ _status.newScreenFl = true;
+}
+
+// Add up all the object values and all the bonus points
+void HugoEngine::calcMaxScore() {
+ int i;
+
+ debugC(1, kDebugEngine, "calcMaxScore");
+
+ for (i = 0; i < _numObj; i++)
+ _maxscore += _objects[i].objValue;
+
+ for (i = 0; i < _numBonuses; i++)
+ _maxscore += _points[i].score;
+}
+
+// Exit game, advertise trilogy, show copyright
+void HugoEngine::endGame() {
+ debugC(1, kDebugEngine, "endGame");
+
+ if (!_boot.registered)
+ Utils::Box(BOX_ANY, "%s", _textEngine[kEsAdvertise]);
+ Utils::Box(BOX_ANY, "%s\n%s", _episode, COPYRIGHT);
+ _status.viewState = V_EXIT;
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/engine.h b/engines/hugo/engine.h
new file mode 100644
index 0000000000..0d14d244b5
--- /dev/null
+++ b/engines/hugo/engine.h
@@ -0,0 +1,44 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo 1-3 Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_ENGINE_H
+#define HUGO_ENGINE_H
+namespace Hugo {
+
+enum seqTextEngine {
+ // Strings used by the engine
+ kEsAdvertise = 0
+};
+
+} // End of namespace Hugo
+
+#endif // HUGO_ENGINE_H
diff --git a/engines/hugo/file.cpp b/engines/hugo/file.cpp
new file mode 100644
index 0000000000..b4645c4d0b
--- /dev/null
+++ b/engines/hugo/file.cpp
@@ -0,0 +1,904 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#include "common/system.h"
+#include "common/file.h"
+#include "common/savefile.h"
+
+#include "hugo/game.h"
+#include "hugo/hugo.h"
+#include "hugo/file.h"
+#include "hugo/global.h"
+#include "hugo/schedule.h"
+#include "hugo/display.h"
+#include "hugo/util.h"
+
+namespace Hugo {
+FileManager::FileManager(HugoEngine &vm) : _vm(vm) {
+
+}
+
+byte *FileManager::convertPCC(byte *p, uint16 y, uint16 bpl, image_pt dataPtr) {
+// Convert 4 planes (RGBI) data to 8-bit DIB format
+// Return original plane data ptr
+ uint16 r, g, b, i; // Byte index within each plane
+ int8 bit; // Bit index within a byte
+
+ debugC(2, kDebugFile, "convertPCC(byte *p, %d, %d, image_pt data_p)", y, bpl);
+
+ dataPtr += y * bpl * 8; // Point to correct DIB line
+ for (r = 0, g = bpl, b = g + bpl, i = b + bpl; r < bpl; r++, g++, b++, i++) // Each byte in all planes
+ for (bit = 7; bit >= 0; bit--) // Each bit in byte
+ *dataPtr++ = (((p[r] >> bit & 1) << 0) |
+ ((p[g] >> bit & 1) << 1) |
+ ((p[b] >> bit & 1) << 2) |
+ ((p[i] >> bit & 1) << 3));
+ return p;
+}
+
+seq_t *FileManager::readPCX(Common::File &f, seq_t *seqPtr, byte *imagePtr, bool firstFl, const char *name) {
+// Read a pcx file of length len. Use supplied seq_p and image_p or
+// allocate space if NULL. Name used for errors. Returns address of seq_p
+// Set first TRUE to initialize b_index (i.e. not reading a sequential image in file).
+
+ struct { // Structure of PCX file header
+ byte mfctr, vers, enc, bpx;
+ uint16 x1, y1, x2, y2; // bounding box
+ uint16 xres, yres;
+ byte palette[48]; // EGA color palette
+ byte vmode, planes;
+ uint16 bytesPerLine; // Bytes per line
+ byte fill2[60];
+ } PCC_header; // Header of a PCC file
+
+ byte c, d; // code and data bytes from PCX file
+ byte pline[XPIX]; // Hold 4 planes of data
+ byte *p = pline; // Ptr to above
+ byte i; // PCX repeat count
+ uint16 bytesPerLine4; // BPL in 4-bit format
+ uint16 size; // Size of image
+ uint16 y = 0; // Current line index
+
+ debugC(1, kDebugFile, "readPCX(..., %s)", name);
+
+ // Read in the PCC header and check consistency
+ PCC_header.mfctr = f.readByte();
+ PCC_header.vers = f.readByte();
+ PCC_header.enc = f.readByte();
+ PCC_header.bpx = f.readByte();
+ PCC_header.x1 = f.readUint16LE();
+ PCC_header.y1 = f.readUint16LE();
+ PCC_header.x2 = f.readUint16LE();
+ PCC_header.y2 = f.readUint16LE();
+ PCC_header.xres = f.readUint16LE();
+ PCC_header.yres = f.readUint16LE();
+ f.read(PCC_header.palette, sizeof(PCC_header.palette));
+ PCC_header.vmode = f.readByte();
+ PCC_header.planes = f.readByte();
+ PCC_header.bytesPerLine = f.readUint16LE();
+ f.read(PCC_header.fill2, sizeof(PCC_header.fill2));
+
+ if (PCC_header.mfctr != 10)
+ Utils::Error(PCCH_ERR, "%s", name);
+
+ // Allocate memory for seq_t if NULL
+ if (seqPtr == NULL)
+ if ((seqPtr = (seq_t *)malloc(sizeof(seq_t))) == NULL)
+ Utils::Error(HEAP_ERR, "%s", name);
+
+ // Find size of image data in 8-bit DIB format
+ // Note save of x2 - marks end of valid data before garbage
+ bytesPerLine4 = PCC_header.bytesPerLine * 4; // 4-bit bpl
+ seqPtr->bytesPerLine8 = bytesPerLine4 * 2; // 8-bit bpl
+ seqPtr->lines = PCC_header.y2 - PCC_header.y1 + 1;
+ seqPtr->x2 = PCC_header.x2 - PCC_header.x1 + 1;
+ size = seqPtr->lines * seqPtr->bytesPerLine8;
+
+ // Allocate memory for image data if NULL
+ if (imagePtr == NULL)
+ if ((imagePtr = (byte *)malloc((size_t) size)) == NULL)
+ Utils::Error(HEAP_ERR, "%s", name);
+ seqPtr->imagePtr = imagePtr;
+
+ // Process the image data, converting to 8-bit DIB format
+ while (y < seqPtr->lines) {
+ c = f.readByte();
+ if ((c & REP_MASK) == REP_MASK) {
+ d = f.readByte(); // Read data byte
+ for (i = 0; i < (c & LEN_MASK); i++) {
+ *p++ = d;
+ if ((uint16)(p - pline) == bytesPerLine4)
+ p = convertPCC(pline, y++, PCC_header.bytesPerLine, imagePtr);
+ }
+ } else {
+ *p++ = c;
+ if ((uint16)(p - pline) == bytesPerLine4)
+ p = convertPCC(pline, y++, PCC_header.bytesPerLine, imagePtr);
+ }
+ }
+ return seqPtr;
+}
+
+void FileManager::readImage(int objNum, object_t *objPtr) {
+// Read object file of PCC images into object supplied
+ byte x, y, j, k;
+ uint16 x2; // Limit on x in image data
+ seq_t *seqPtr = 0; // Ptr to sequence structure
+ image_pt dibPtr; // Ptr to DIB data
+ objBlock_t objBlock; // Info on file within database
+ bool firstFl = true; // Initializes pcx read function
+
+ debugC(1, kDebugFile, "readImage(%d, object_t *objPtr)", objNum);
+
+ if (!objPtr->seqNumb) // This object has no images
+ return;
+
+ if (_vm.isPacked()) {
+ _objectsArchive.seek((uint32)objNum * sizeof(objBlock_t), SEEK_SET);
+
+ objBlock.objOffset = _objectsArchive.readUint32LE();
+ objBlock.objLength = _objectsArchive.readUint32LE();
+
+ _objectsArchive.seek(objBlock.objOffset, SEEK_SET);
+ } else {
+ char *buf = (char *) malloc(2048 + 1); // Buffer for file access
+ strcat(strcat(strcpy(buf, _vm._picDir), _vm._arrayNouns[objPtr->nounIndex][0]), OBJEXT);
+ if (!_objectsArchive.open(buf)) {
+ warning("File %s not found, trying again with %s%s", buf, _vm._arrayNouns[objPtr->nounIndex][0], OBJEXT);
+ strcat(strcpy(buf, _vm._arrayNouns[objPtr->nounIndex][0]), OBJEXT);
+ if (!_objectsArchive.open(buf))
+ Utils::Error(FILE_ERR, "%s", buf);
+ }
+ }
+
+ // Now read the images into an images list
+ for (j = 0; j < objPtr->seqNumb; j++) { // for each sequence
+ for (k = 0; k < objPtr->seqList[j].imageNbr; k++) { // each image
+ if (k == 0) { // First image
+ // Read this image - allocate both seq and image memory
+ seqPtr = readPCX(_objectsArchive, NULL, NULL, firstFl, _vm._arrayNouns[objPtr->nounIndex][0]);
+ objPtr->seqList[j].seqPtr = seqPtr;
+ firstFl = false;
+ } else { // Subsequent image
+ // Read this image - allocate both seq and image memory
+ seqPtr->nextSeqPtr = readPCX(_objectsArchive, NULL, NULL, firstFl, _vm._arrayNouns[objPtr->nounIndex][0]);
+ seqPtr = seqPtr->nextSeqPtr;
+ }
+
+ // Compute the bounding box - x1, x2, y1, y2
+ // Note use of x2 - marks end of valid data in row
+ x2 = seqPtr->x2;
+ seqPtr->x1 = seqPtr->x2;
+ seqPtr->x2 = 0;
+ seqPtr->y1 = seqPtr->lines;
+ seqPtr->y2 = 0;
+ dibPtr = seqPtr->imagePtr;
+ for (y = 0; y < seqPtr->lines; y++, dibPtr += seqPtr->bytesPerLine8 - x2)
+ for (x = 0; x < x2; x++)
+ if (*dibPtr++) { // Some data found
+ if (x < seqPtr->x1)
+ seqPtr->x1 = x;
+ if (x > seqPtr->x2)
+ seqPtr->x2 = x;
+ if (y < seqPtr->y1)
+ seqPtr->y1 = y;
+ if (y > seqPtr->y2)
+ seqPtr->y2 = y;
+ }
+ }
+ seqPtr->nextSeqPtr = objPtr->seqList[j].seqPtr; // loop linked list to head
+ }
+
+ // Set the current image sequence to first or last
+ switch (objPtr->cycling) {
+ case INVISIBLE: // (May become visible later)
+ case ALMOST_INVISIBLE:
+ case NOT_CYCLING:
+ case CYCLE_FORWARD:
+ objPtr->currImagePtr = objPtr->seqList[0].seqPtr;
+ break;
+ case CYCLE_BACKWARD:
+ objPtr->currImagePtr = seqPtr;
+ break;
+ }
+
+ if (!_vm.isPacked())
+ _objectsArchive.close();
+}
+
+void FileManager::readBackground(int screenIndex) {
+// Read a PCX image into dib_a
+ seq_t seq; // Image sequence structure for Read_pcx
+ sceneBlock_t sceneBlock; // Read a database header entry
+
+ debugC(1, kDebugFile, "readBackground(%d)", screenIndex);
+
+ if (_vm.isPacked()) {
+ _sceneryArchive.seek((uint32) screenIndex * sizeof(sceneBlock_t), SEEK_SET);
+
+ sceneBlock.scene_off = _sceneryArchive.readUint32LE();
+ sceneBlock.scene_len = _sceneryArchive.readUint32LE();
+ sceneBlock.b_off = _sceneryArchive.readUint32LE();
+ sceneBlock.b_len = _sceneryArchive.readUint32LE();
+ sceneBlock.o_off = _sceneryArchive.readUint32LE();
+ sceneBlock.o_len = _sceneryArchive.readUint32LE();
+ sceneBlock.ob_off = _sceneryArchive.readUint32LE();
+ sceneBlock.ob_len = _sceneryArchive.readUint32LE();
+
+ _sceneryArchive.seek(sceneBlock.scene_off, SEEK_SET);
+ } else {
+ char *buf = (char *) malloc(2048 + 1); // Buffer for file access
+ strcat(strcat(strcpy(buf, _vm._picDir), _vm._screenNames[screenIndex]), BKGEXT);
+ if (!_sceneryArchive.open(buf)) {
+ warning("File %s not found, trying again with %s.ART", buf, _vm._screenNames[screenIndex]);
+ strcat(strcpy(buf, _vm._screenNames[screenIndex]), ".ART");
+ if (!_sceneryArchive.open(buf))
+ Utils::Error(FILE_ERR, "%s", buf);
+ }
+ }
+
+ // Read the image into dummy seq and static dib_a
+ readPCX(_sceneryArchive, &seq, _vm.screen().getFrontBuffer(), true, _vm._screenNames[screenIndex]);
+
+ if (!_vm.isPacked())
+ _sceneryArchive.close();
+}
+
+sound_pt FileManager::getSound(int16 sound, uint16 *size) {
+// Read sound (or music) file data. Call with SILENCE to free-up
+// any allocated memory. Also returns size of data
+
+ static sound_hdr_t s_hdr[MAX_SOUNDS]; // Sound lookup table
+ sound_pt soundPtr; // Ptr to sound data
+ Common::File fp; // Handle to SOUND_FILE
+// bool music = sound < NUM_TUNES; // TRUE if music, else sound file
+
+ debugC(1, kDebugFile, "getSound(%d, %d)", sound, *size);
+
+ // No more to do if SILENCE (called for cleanup purposes)
+ if (sound == _vm._soundSilence)
+ return(NULL);
+
+ // Open sounds file
+ if (!fp.open(SOUND_FILE)) {
+// Error(FILE_ERR, "%s", SOUND_FILE);
+ warning("Hugo Error: File not found %s", SOUND_FILE);
+ return(NULL);
+ }
+
+ // If this is the first call, read the lookup table
+ static bool has_read_header = false;
+ if (!has_read_header) {
+ if (fp.read(s_hdr, sizeof(s_hdr)) != sizeof(s_hdr))
+ Utils::Error(FILE_ERR, "%s", SOUND_FILE);
+ has_read_header = true;
+ }
+
+ *size = s_hdr[sound].size;
+ if (*size == 0)
+ Utils::Error(SOUND_ERR, "%s", SOUND_FILE);
+
+ // Allocate memory for sound or music, if possible
+ if ((soundPtr = (byte *)malloc(s_hdr[sound].size)) == 0) {
+ Utils::Warn(false, "%s", "Low on memory");
+ return(NULL);
+ }
+
+ // Seek to data and read it
+ fp.seek(s_hdr[sound].offset, SEEK_SET);
+ if (fp.read(soundPtr, s_hdr[sound].size) != s_hdr[sound].size)
+ Utils::Error(FILE_ERR, "%s", SOUND_FILE);
+
+ fp.close();
+
+ return soundPtr;
+}
+
+bool FileManager::fileExists(char *filename) {
+// Return whether file exists or not
+ Common::File f;
+ if (f.open(filename)) {
+ f.close();
+ return true;
+ }
+ return false;
+}
+
+void FileManager::readOverlay(int screenNum, image_pt image, ovl_t overlayType) {
+// Open and read in an overlay file, close file
+ uint32 i = 0;
+ int16 j, k;
+ int8 data; // Must be 8 bits signed
+ image_pt tmpImage = image; // temp ptr to overlay file
+ sceneBlock_t sceneBlock; // Database header entry
+
+ debugC(1, kDebugFile, "readOverlay(%d, ...)", screenNum);
+
+ if (_vm.isPacked()) {
+ _sceneryArchive.seek((uint32)screenNum * sizeof(sceneBlock_t), SEEK_SET);
+
+ sceneBlock.scene_off = _sceneryArchive.readUint32LE();
+ sceneBlock.scene_len = _sceneryArchive.readUint32LE();
+ sceneBlock.b_off = _sceneryArchive.readUint32LE();
+ sceneBlock.b_len = _sceneryArchive.readUint32LE();
+ sceneBlock.o_off = _sceneryArchive.readUint32LE();
+ sceneBlock.o_len = _sceneryArchive.readUint32LE();
+ sceneBlock.ob_off = _sceneryArchive.readUint32LE();
+ sceneBlock.ob_len = _sceneryArchive.readUint32LE();
+
+ switch (overlayType) {
+ case BOUNDARY:
+ _sceneryArchive.seek(sceneBlock.b_off, SEEK_SET);
+ i = sceneBlock.b_len;
+ break;
+ case OVERLAY:
+ _sceneryArchive.seek(sceneBlock.o_off, SEEK_SET);
+ i = sceneBlock.o_len;
+ break;
+ case OVLBASE:
+ _sceneryArchive.seek(sceneBlock.ob_off, SEEK_SET);
+ i = sceneBlock.ob_len;
+ break;
+ default:
+ Utils::Error(FILE_ERR, "%s", "Bad ovl_type");
+ break;
+ }
+ if (i == 0) {
+ for (i = 0; i < OVL_SIZE; i++)
+ image[i] = 0;
+ return;
+ }
+ } else {
+ const char *ovl_ext[] = {".b", ".o", ".ob"};
+ char *buf = (char *) malloc(2048 + 1); // Buffer for file access
+
+ strcat(strcpy(buf, _vm._screenNames[screenNum]), ovl_ext[overlayType]);
+
+ if (!fileExists(buf)) {
+ for (i = 0; i < OVL_SIZE; i++)
+ image[i] = 0;
+ return;
+ }
+
+ if (!_sceneryArchive.open(buf))
+ Utils::Error(FILE_ERR, "%s", buf);
+
+// if (eof(f_scenery)) {
+// _lclose(f_scenery);
+// return;
+// }
+ }
+
+ switch (_vm._gameVariant) {
+ case 0: // Hugo 1 DOS and WIN don't pack data
+ case 3:
+ _sceneryArchive.read(tmpImage, OVL_SIZE);
+ break;
+ default:
+ // Read in the overlay file using MAC Packbits. (We're not proud!)
+ k = 0; // byte count
+ do {
+ data = _sceneryArchive.readByte(); // Read a code byte
+ if ((byte)data == 0x80) // Noop
+ k = k;
+ else if (data >= 0) { // Copy next data+1 literally
+ for (i = 0; i <= (byte)data; i++, k++)
+ *tmpImage++ = _sceneryArchive.readByte();
+ } else { // Repeat next byte -data+1 times
+ j = _sceneryArchive.readByte();
+
+ for (i = 0; i < (byte)(-data + 1); i++, k++)
+ *tmpImage++ = j;
+ }
+ } while (k < OVL_SIZE);
+ break;
+ }
+
+ if (!_vm.isPacked())
+ _sceneryArchive.close();
+}
+
+void FileManager::saveSeq(object_t *obj) {
+// Save sequence number and image number in given object
+ byte j, k;
+ seq_t *q;
+ bool found;
+
+ debugC(1, kDebugFile, "saveSeq");
+
+ for (j = 0, found = false; !found && (j < obj->seqNumb); j++) {
+ q = obj->seqList[j].seqPtr;
+ for (k = 0; !found && (k < obj->seqList[j].imageNbr); k++) {
+ if (obj->currImagePtr == q) {
+ found = true;
+ obj->curSeqNum = j;
+ obj->curImageNum = k;
+ } else
+ q = q->nextSeqPtr;
+ }
+ }
+}
+
+void FileManager::restoreSeq(object_t *obj) {
+// Set up cur_seq_p from stored sequence and image number in object
+ int j;
+ seq_t *q;
+
+ debugC(1, kDebugFile, "restoreSeq");
+
+ q = obj->seqList[obj->curSeqNum].seqPtr;
+ for (j = 0; j < obj->curImageNum; j++)
+ q = q->nextSeqPtr;
+ obj->currImagePtr = q;
+}
+
+void FileManager::saveGame(int16 slot, const char *descrip) {
+// Save game to supplied slot (-1 is INITFILE)
+ int i;
+ char path[256]; // Full path of saved game
+
+ debugC(1, kDebugFile, "saveGame(%d, %s)", slot, descrip);
+
+ // Get full path of saved game file - note test for INITFILE
+ if (slot == -1)
+ sprintf(path, "%s", _vm._initFilename);
+ else
+ sprintf(path, _vm._saveFilename, slot);
+
+ Common::WriteStream *out = 0;
+ if (!(out = _vm.getSaveFileManager()->openForSaving(path))) {
+ warning("Can't create file '%s', game not saved", path);
+ return;
+ }
+
+ // Write version. We can't restore from obsolete versions
+ out->write(&kSavegameVersion, sizeof(kSavegameVersion));
+
+ // Save description of saved game
+ out->write(descrip, DESCRIPLEN);
+
+ // Save objects
+ for (i = 0; i < _vm._numObj; i++) {
+ // Save where curr_seq_p is pointing to
+ saveSeq(&_vm._objects[i]);
+ out->write(&_vm._objects[i], sizeof(object_t));
+ }
+
+ const status_t &gameStatus = _vm.getGameStatus();
+
+ // Save whether hero image is swapped
+ out->write(&_vm._heroImage, sizeof(_vm._heroImage));
+
+ // Save score
+ int score = _vm.getScore();
+ out->write(&score, sizeof(score));
+
+ // Save story mode
+ out->write(&gameStatus.storyModeFl, sizeof(gameStatus.storyModeFl));
+
+ // Save jumpexit mode
+ out->write(&gameStatus.jumpExitFl, sizeof(gameStatus.jumpExitFl));
+
+ // Save gameover status
+ out->write(&gameStatus.gameOverFl, sizeof(gameStatus.gameOverFl));
+
+ // Save screen states
+ out->write(_vm._screenStates, sizeof(*_vm._screenStates) * _vm._numScreens);
+
+ // Save points table
+ out->write(_vm._points, sizeof(point_t) * _vm._numBonuses);
+
+ // Now save current time and all current events in event queue
+ _vm.scheduler().saveEvents(out);
+
+ // Save palette table
+ _vm.screen().savePal(out);
+
+ // Save maze status
+ out->write(&_maze, sizeof(maze_t));
+
+ out->finalize();
+
+ delete out;
+}
+
+void FileManager::restoreGame(int16 slot) {
+// Restore game from supplied slot number (-1 is INITFILE)
+ int i;
+ char path[256]; // Full path of saved game
+ object_t *p;
+ seqList_t seqList[MAX_SEQUENCES];
+// cmdList *cmds; // Save command list pointer
+ uint16 cmdIndex; // Save command list pointer
+// char ver[sizeof(VER)]; // Compare versions
+
+ debugC(1, kDebugFile, "restoreGame(%d)", slot);
+
+ // Initialize new-game status
+ _vm.initStatus();
+
+ // Get full path of saved game file - note test for INITFILE
+ if (slot == -1)
+ sprintf(path, "%s", _vm._initFilename);
+ else
+ sprintf(path, _vm._saveFilename, slot);
+
+ Common::SeekableReadStream *in = 0;
+ if (!(in = _vm.getSaveFileManager()->openForLoading(path)))
+ return;
+
+ // Check version, can't restore from different versions
+ int saveVersion;
+ in->read(&saveVersion, sizeof(saveVersion));
+ if (saveVersion != kSavegameVersion) {
+ Utils::Error(GEN_ERR, "%s", "Savegame of incompatible version");
+ return;
+ }
+
+ // Skip over description
+ in->seek(DESCRIPLEN, SEEK_CUR);
+
+ // If hero image is currently swapped, swap it back before restore
+ if (_vm._heroImage != HERO)
+ _vm.scheduler().swapImages(HERO, _vm._heroImage);
+
+ // Restore objects, retain current seqList which points to dynamic mem
+ // Also, retain cmnd_t pointers
+ for (i = 0; i < _vm._numObj; i++) {
+ p = &_vm._objects[i];
+ memcpy(seqList, p->seqList, sizeof(seqList_t));
+ cmdIndex = p->cmdIndex;
+ in->read(p, sizeof(object_t));
+ p->cmdIndex = cmdIndex;
+ memcpy(p->seqList, seqList, sizeof(seqList_t));
+ }
+
+ in->read(&_vm._heroImage, sizeof(_vm._heroImage));
+
+ // If hero swapped in saved game, swap it
+ if ((i = _vm._heroImage) != HERO)
+ _vm.scheduler().swapImages(HERO, _vm._heroImage);
+ _vm._heroImage = i;
+
+ status_t &gameStatus = _vm.getGameStatus();
+
+ int score;
+ in->read(&score, sizeof(score));
+ _vm.setScore(score);
+
+ in->read(&gameStatus.storyModeFl, sizeof(gameStatus.storyModeFl));
+ in->read(&gameStatus.jumpExitFl, sizeof(gameStatus.jumpExitFl));
+ in->read(&gameStatus.gameOverFl, sizeof(gameStatus.gameOverFl));
+ in->read(_vm._screenStates, sizeof(*_vm._screenStates) * _vm._numScreens);
+
+ // Restore points table
+ in->read(_vm._points, sizeof(point_t) * _vm._numBonuses);
+
+ // Restore ptrs to currently loaded objects
+ for (i = 0; i < _vm._numObj; i++)
+ restoreSeq(&_vm._objects[i]);
+
+ // Now restore time of the save and the event queue
+ _vm.scheduler().restoreEvents(in);
+
+ // Restore palette and change it if necessary
+ _vm.screen().restorePal(in);
+
+ // Restore maze status
+ in->read(&_maze, sizeof(maze_t));
+
+ delete in;
+}
+
+void FileManager::initSavedGame() {
+// Initialize the size of a saved game (from the fixed initial game).
+// If status.initsave is TRUE, or the initial saved game is not found,
+// force a save to create one. Normally the game will be shipped with
+// the initial game file but useful to force a write during development
+// when the size is changeable.
+// The net result is a valid INITFILE, with status.savesize initialized.
+ Common::File f; // Handle of saved game file
+ char path[256]; // Full path of INITFILE
+
+ debugC(1, kDebugFile, "initSavedGame");
+
+ // Get full path of INITFILE
+ sprintf(path, "%s", _vm._initFilename);
+
+
+ // Force save of initial game
+ if (_vm.getGameStatus().initSaveFl)
+ saveGame(-1, "");
+
+ // If initial game doesn't exist, create it
+ Common::SeekableReadStream *in = 0;
+ if (!(in = _vm.getSaveFileManager()->openForLoading(path))) {
+ saveGame(-1, "");
+ if (!(in = _vm.getSaveFileManager()->openForLoading(path))) {
+ Utils::Error(WRITE_ERR, "%s", path);
+ return;
+ }
+ }
+
+ // Must have an open saved game now
+ _vm.getGameStatus().saveSize = in->size();
+ delete in;
+
+ // Check sanity - maybe disk full or path set to read-only drive?
+ if (_vm.getGameStatus().saveSize == -1)
+ Utils::Error(WRITE_ERR, "%s", path);
+}
+
+// Record and playback handling stuff:
+typedef struct {
+// int key; // Character
+ uint32 time; // Time at which character was pressed
+} pbdata_t;
+static pbdata_t pbdata;
+FILE *fpb;
+
+void FileManager::openPlaybackFile(bool playbackFl, bool recordFl) {
+ debugC(1, kDebugFile, "openPlaybackFile(%d, %d)", (playbackFl) ? 1 : 0, (recordFl) ? 1 : 0);
+
+ if (playbackFl) {
+ if (!(fpb = fopen(PBFILE, "r+b")))
+ Utils::Error(FILE_ERR, "%s", PBFILE);
+ } else if (recordFl)
+ fpb = fopen(PBFILE, "wb");
+ pbdata.time = 0; // Say no key available
+}
+
+void FileManager::closePlaybackFile() {
+ fclose(fpb);
+}
+
+void FileManager::openDatabaseFiles() {
+//TODO : HUGO 1 DOS uses _stringtData instead of a strings.dat
+//This should be tested adequately and should be handled by an error and not by a warning.
+ debugC(1, kDebugFile, "openDatabaseFiles");
+
+ if (!_stringArchive.open(STRING_FILE))
+// Error(FILE_ERR, "%s", STRING_FILE);
+ warning("Hugo Error: File not found %s", STRING_FILE);
+ if (_vm.isPacked()) {
+ if (!_sceneryArchive.open(SCENERY_FILE))
+ Utils::Error(FILE_ERR, "%s", SCENERY_FILE);
+ if (!_objectsArchive.open(OBJECTS_FILE))
+ Utils::Error(FILE_ERR, "%s", OBJECTS_FILE);
+ }
+}
+
+void FileManager::closeDatabaseFiles() {
+// TODO: stringArchive shouldn't be closed in Hugo 1 DOS
+ debugC(1, kDebugFile, "closeDatabaseFiles");
+
+ _stringArchive.close();
+ if (_vm.isPacked()) {
+ _sceneryArchive.close();
+ _objectsArchive.close();
+ }
+}
+
+char *FileManager::fetchString(int index) {
+//TODO : HUGO 1 DOS uses _stringtData instead of a strings.dat
+// Fetch string from file, decode and return ptr to string in memory
+ uint32 off1, off2;
+
+ debugC(1, kDebugFile, "fetchString(%d)", index);
+
+ // Get offset to string[index] (and next for length calculation)
+ _stringArchive.seek((uint32)index * sizeof(uint32), SEEK_SET);
+ if (_stringArchive.read((char *)&off1, sizeof(uint32)) == 0)
+ Utils::Error(FILE_ERR, "%s", "String offset");
+ if (_stringArchive.read((char *)&off2, sizeof(uint32)) == 0)
+ Utils::Error(FILE_ERR, "%s", "String offset");
+
+ // Check size of string
+ if ((off2 - off1) >= MAX_BOX)
+ Utils::Error(FILE_ERR, "%s", "Fetched string too long!");
+
+ // Position to string and read it into gen purpose _textBoxBuffer
+ _stringArchive.seek(off1, SEEK_SET);
+ if (_stringArchive.read(_textBoxBuffer, (uint16)(off2 - off1)) == 0)
+ Utils::Error(FILE_ERR, "%s", "Fetch_string");
+
+ // Null terminate, decode and return it
+ _textBoxBuffer[off2-off1] = '\0';
+ _vm.scheduler().decodeString(_textBoxBuffer);
+ return _textBoxBuffer;
+}
+
+void FileManager::printBootText() {
+// Read the encrypted text from the boot file and print it
+ Common::File ofp;
+ int i;
+ char *buf;
+
+ debugC(1, kDebugFile, "printBootText");
+
+ if (!ofp.open(BOOTFILE)) {
+ if (_vm._gameVariant == 3) {
+ //TODO initialize properly _boot structure
+ warning("printBootText - Skipping as H1 Dos may be a freeware");
+ return;
+ } else
+ Utils::Error(FILE_ERR, "%s", BOOTFILE);
+ }
+
+ // Allocate space for the text and print it
+ buf = (char *)malloc(_boot.exit_len + 1);
+ if (buf) {
+ // Skip over the boot structure (already read) and read exit text
+ ofp.seek((long)sizeof(_boot), SEEK_SET);
+ if (ofp.read(buf, _boot.exit_len) != (size_t)_boot.exit_len)
+ Utils::Error(FILE_ERR, "%s", BOOTFILE);
+
+ // Decrypt the exit text, using CRYPT substring
+ for (i = 0; i < _boot.exit_len; i++)
+ buf[i] ^= CRYPT[i % strlen(CRYPT)];
+
+ buf[i] = '\0';
+ //Box(BOX_OK, "%s", buf_p);
+ //MessageBox(hwnd, buf_p, "License", MB_ICONINFORMATION);
+ warning("printBootText(): License: %s", buf);
+ }
+
+ free(buf);
+ ofp.close();
+}
+
+void FileManager::readBootFile() {
+// Reads boot file for program environment. Fatal error if not there or
+// file checksum is bad. De-crypts structure while checking checksum
+ byte checksum;
+ byte *p;
+ Common::File ofp;
+ uint32 i;
+
+ debugC(1, kDebugFile, "readBootFile");
+
+ if (!ofp.open(BOOTFILE)) {
+ if (_vm._gameVariant == 3) {
+ //TODO initialize properly _boot structure
+ warning("readBootFile - Skipping as H1 Dos may be a freeware");
+ return;
+ } else
+ Utils::Error(FILE_ERR, "%s", BOOTFILE);
+ }
+
+ if (ofp.size() < (int32)sizeof(_boot))
+ Utils::Error(FILE_ERR, "%s", BOOTFILE);
+
+ _boot.checksum = ofp.readByte();
+ _boot.registered = ofp.readByte();
+ ofp.read(_boot.pbswitch, sizeof(_boot.pbswitch));
+ ofp.read(_boot.distrib, sizeof(_boot.distrib));
+ _boot.exit_len = ofp.readUint16LE();
+
+ p = (byte *)&_boot;
+ for (i = 0, checksum = 0; i < sizeof(_boot); i++) {
+ checksum ^= p[i];
+ p[i] ^= CRYPT[i % strlen(CRYPT)];
+ }
+ ofp.close();
+
+ if (checksum)
+ Utils::Error(GEN_ERR, "%s", "Program startup file invalid");
+}
+
+uif_hdr_t *FileManager::getUIFHeader(uif_t id) {
+// Returns address of uif_hdr[id], reading it in if first call
+ static uif_hdr_t UIFHeader[MAX_UIFS]; // Lookup for uif fonts/images
+ static bool firstFl = true;
+ Common::File ip; // Image data file
+
+ debugC(1, kDebugFile, "getUIFHeader(%d)", id);
+
+ // Initialize offset lookup if not read yet
+ if (firstFl) {
+ firstFl = false;
+ // Open unbuffered to do far read
+ if (!ip.open(UIF_FILE))
+ Utils::Error(FILE_ERR, "%s", UIF_FILE);
+
+ if (ip.size() < (int32)sizeof(UIFHeader))
+ Utils::Error(FILE_ERR, "%s", UIF_FILE);
+
+ for (int i = 0; i < MAX_UIFS; ++i) {
+ UIFHeader[i].size = ip.readUint16LE();
+ UIFHeader[i].offset = ip.readUint32LE();
+ }
+
+ ip.close();
+ }
+ return &UIFHeader[id];
+}
+
+void FileManager::readUIFItem(int16 id, byte *buf) {
+// Read uif item into supplied buffer.
+ Common::File ip; // UIF_FILE handle
+ uif_hdr_t *UIFHeaderPtr; // Lookup table of items
+ seq_t seq; // Dummy seq_t for image data
+
+ debugC(1, kDebugFile, "readUIFItem(%d, ...)", id);
+
+ // Open uif file to read data
+ if (!ip.open(UIF_FILE))
+ Utils::Error(FILE_ERR, "%s", UIF_FILE);
+
+ // Seek to data
+ UIFHeaderPtr = getUIFHeader((uif_t)id);
+ ip.seek(UIFHeaderPtr->offset, SEEK_SET);
+
+ // We support pcx images and straight data
+ switch (id) {
+ case UIF_IMAGES: // Read uif images file
+ readPCX(ip, &seq, buf, true, UIF_FILE);
+ break;
+ default: // Read file data into supplied array
+ if (ip.read(buf, UIFHeaderPtr->size) != UIFHeaderPtr->size)
+ Utils::Error(FILE_ERR, "%s", UIF_FILE);
+ break;
+ }
+
+ ip.close();
+}
+
+void FileManager::instructions() {
+// Simple instructions given when F1 pressed twice in a row
+// Only in DOS versions
+
+ Common::File f;
+ char line[1024], *wrkLine;
+ char readBuf[2];
+
+ wrkLine = line;
+ if (!f.open(HELPFILE)) {
+ warning("help.dat not found");
+ return;
+ }
+
+ while (f.read(readBuf, 1)) {
+ wrkLine[0] = readBuf[0];
+ wrkLine++;
+ do {
+ f.read(wrkLine, 1);
+ } while (*wrkLine++ != EOP);
+ wrkLine[-2] = '\0'; /* Remove EOP and previous CR */
+ Utils::Box(BOX_ANY, "%s", line);
+ wrkLine = line;
+ f.read(readBuf, 2); /* Remove CRLF after EOP */
+ }
+ f.close();
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/file.h b/engines/hugo/file.h
new file mode 100644
index 0000000000..c044a7307f
--- /dev/null
+++ b/engines/hugo/file.h
@@ -0,0 +1,88 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_FILE_H
+#define HUGO_FILE_H
+
+// TODO get rid of those defines
+#define HELPFILE "help.dat"
+#define EOP '#' /* Marks end of a page in help file */
+
+namespace Hugo {
+
+class FileManager {
+public:
+ FileManager(HugoEngine &vm);
+
+
+ bool fileExists(char *filename);
+
+ char *fetchString(int index);
+
+ sound_pt getSound(short sound, uint16 *size);
+
+ void closePlaybackFile();
+ void closeDatabaseFiles();
+ void initSavedGame();
+ void instructions();
+ void openDatabaseFiles();
+ void readBackground(int screenIndex);
+ void readBootFile();
+ void readImage(int objNum, object_t *objPtr);
+ void readOverlay(int screenNum, image_pt image, ovl_t overlayType);
+ void readUIFItem(short id, byte *buf);
+ void restoreGame(short slot);
+ void restoreSeq(object_t *obj);
+ void saveGame(short slot, const char *descrip);
+ void saveSeq(object_t *obj);
+
+private:
+ HugoEngine &_vm;
+
+ Common::File _stringArchive; /* Handle for string file */
+ Common::File _sceneryArchive; /* Handle for scenery file */
+ Common::File _objectsArchive; /* Handle for objects file */
+
+ byte *convertPCC(byte *p, uint16 y, uint16 bpl, image_pt data_p);
+ seq_t *readPCX(Common::File &f, seq_t *seqPtr, byte *imagePtr, bool firstFl, const char *name);
+ uif_hdr_t *getUIFHeader(uif_t id);
+
+//Strangerke : Not used?
+ void openPlaybackFile(bool playbackFl, bool recordFl);
+ void printBootText();
+// bool pkkey();
+// char pbget();
+};
+
+} // End of namespace Hugo
+
+#endif //HUGO_FILE_H
diff --git a/engines/hugo/game.h b/engines/hugo/game.h
new file mode 100644
index 0000000000..d032a4b817
--- /dev/null
+++ b/engines/hugo/game.h
@@ -0,0 +1,880 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_GAME_H
+#define HUGO_GAME_H
+
+#include "common/keyboard.h"
+
+namespace Common {
+class WriteStream;
+class SeekableReadStream;
+}
+
+namespace Hugo {
+
+// WARNING!! Run the program at least once before release to
+// generate the initial save file! (Using the -i cmd switch)
+// Set EPISODE_NUM & build. Build pictures.mak and run "Tools/Hugo N".
+// Copy helpedit\hugow_?.hlp to .\hugowin?.hlp
+// Type "PPG" in the game to enter cheat mode.
+
+#define DEBUG false // Allow me to do special things (EDIT, GOTO)
+#define STORY true // Skip any intro stuff if FALSE
+//#define DATABASE TRUE // Use database instead of individual files. Individual files are used by Hugo1 DOS!
+//#define BETA FALSE // Puts big msg in intro/about box
+#define EPISODE_NUM 1 // Episode we are building
+#define TITLE "Hugo for Windows"
+#define COPYRIGHT "Copyright © 1995-97, David P. Gray"
+// Started code on 04/01/95
+// Don't forget to update Hugowin.rc2 with version info
+//#define VER "1.0" // 10/01/95 Initial Release
+//#define VER "1.1" // 10/06/95 Restore system volume levels on exit
+//#define VER "v1.2"// 10/12/95 Added "background music" checkbox in volume dlg
+//#define VER "v1.3"// 10/23/95 Support game 1 as shareware
+//#define VER "v1.4"// 12/06/95 Faster graphics, logical palette
+#define VER "v1.5" // 10/07/97 Added order form, new web site
+
+// Game specific equates
+#define MAX_TUNES 16 // Max number of tunes
+#define NORMAL_TPS 9 // Number of ticks (frames) per second
+#define TURBO_TPS 16 // This many in turbo mode
+#define DX 5 // Num pixels moved in x by HERO per step
+#define DY 4 // Num pixels moved in y by HERO per step
+#define XBYTES 40 // number of bytes in a compressed line
+#define XPIX 320 // Width of pcx background file
+#define YPIX 200 // Height of pcx background file
+#define VIEW_DX XPIX // Width of window view
+#define VIEW_DY 184 // Height of window view
+#define INV_DX 32 // Width of an inventory icon
+#define INV_DY 32 // Height of inventory icon
+#define DIBOFF_Y 8 // Offset into dib SrcY (old status line area)
+#define OVL_SIZE (XBYTES * YPIX) // Size of an overlay file
+#define MAX_SEQUENCES 4 // Number of sequences of images in object
+#define MAX_CHARS (XBYTES - 2) // Max length of user input line
+#define NUM_ROWS 25 // Number of text lines in display
+#define MAX_BOX (MAX_CHARS * NUM_ROWS) // Max chars on screen
+#define DONT_CARE 0xFF // Any state allowed in command verb
+#define MAX_FPATH 256 // Max length of a full path name
+#define HERO_MAX_WIDTH 24 // Maximum width of hero
+#define HERO_MIN_WIDTH 16 // Minimum width of hero
+#define LOOK_NAME 1 // Index of name used in showing takeables
+#define TAKE_NAME 2 // Index of name used in confirming take
+#define TAKE_TEXT "Picked up the %s ok."
+#define REP_MASK 0xC0 // Top 2 bits mean a repeat code
+#define MAX_STRLEN 1024
+#define WARNLEN 512
+#define ERRLEN 512
+#define STEP_DY 8 // Pixels per step movement
+
+// Only for non-database
+#define BKGEXT ".PCX" // Extension of background files
+#define OBJEXT ".PIX" // Extension of object picture files
+#define NAME_LEN 12 // Max length of a DOS file name
+
+// Definitions of 'generic' commands: Max # depends on size of gencmd in
+// the object_t record since each requires 1 bit. Currently up to 16
+#define LOOK 1
+#define TAKE 2
+#define DROP 4
+#define LOOK_S 8 // Description depends on state of object
+
+// Macros:
+#define TPS ((_config.turboFl) ? TURBO_TPS : NORMAL_TPS)
+
+
+enum TEXTCOLORS {
+ _TBLACK, _TBLUE, _TGREEN, _TCYAN,
+ _TRED, _TMAGENTA, _TBROWN, _TWHITE,
+ _TGRAY, _TLIGHTBLUE, _TLIGHTGREEN, _TLIGHTCYAN,
+ _TLIGHTRED, _TLIGHTMAGENTA, _TLIGHTYELLOW, _TBRIGHTWHITE
+};
+
+#define CRYPT "Copyright 1992, David P Gray, Gray Design Associates"
+
+struct hugo_boot_t { // Common HUGO boot file
+ char checksum; // Checksum for boot structure (not exit text)
+ char registered; // TRUE if registered version, else FALSE
+ char pbswitch[8]; // Playback switch string
+ char distrib[32]; // Distributor branding string
+ uint16 exit_len; // Length of exit text (next in file)
+};
+
+#define MAX_UIFS 32 // Max possible uif items in hdr
+#define NUM_FONTS 3 // Number of dib fonts
+#define FIRST_FONT U_FONT5
+#define FONT_LEN 128 // Number of chars in font
+#define FONTSIZE 1200 // Max size of font data
+
+struct uif_hdr_t { // UIF font/image look up
+ uint16 size; // Size of uif item
+ uint32 offset; // Offset of item in file
+};
+
+enum uif_t {U_FONT5, U_FONT6, U_FONT8, UIF_IMAGES, NUM_UIF_ITEMS};
+
+// Game specific type definitions
+typedef byte *image_pt; // ptr to an object image (sprite)
+typedef byte *sound_pt; // ptr to sound (or music) data
+
+// Enumerate overlay file types
+enum ovl_t {BOUNDARY, OVERLAY, OVLBASE};
+
+// Enumerate error types
+enum {
+ GEN_ERR, FILE_ERR, WRITE_ERR, PCCH_ERR, HEAP_ERR, EVNT_ERR, SOUND_ERR
+ //MOUSE_ERR, VID_ERR, FONT_ERR, ARG_ERR, CHK_ERR, TIMER_ERR, VBX_ERR
+};
+
+// Enumerate ways of cycling a sequence of frames
+enum cycle_t {INVISIBLE, ALMOST_INVISIBLE, NOT_CYCLING, CYCLE_FORWARD, CYCLE_BACKWARD};
+
+// Enumerate sequence index matching direction of travel
+enum {RIGHT, LEFT, DOWN, _UP};
+
+// Channel requirement during sound effect
+enum stereo_t {BOTH_CHANNELS, RIGHT_CHANNEL, LEFT_CHANNEL};
+
+// Priority for sound effect
+enum priority_t {LOW_PRI, MED_PRI, HIGH_PRI};
+
+// Enumerate the different path types for an object
+enum path_t {
+ USER, // User has control of object via cursor keys
+ AUTO, // Computer has control, controlled by action lists
+ QUIET, // Computer has control and no commands allowed
+ CHASE, // Computer has control, object is chasing hero
+ CHASE2, // Same as CHASE, except keeps cycling when stationary
+ WANDER, // Computer has control, object is wandering randomly
+ WANDER2 // Same as WANDER, except keeps cycling when stationary
+};
+
+// Enumerate whether object is foreground, background or 'floating'
+// If floating, HERO can collide with it and fore/back ground is determined
+// by relative y-coord of object base. This is the general case.
+// If fore or background, no collisions can take place and object is either
+// behind or in front of all others, although can still be hidden by the
+// the overlay plane. OVEROVL means the object is FLOATING (to other
+// objects) but is never hidden by the overlay plane
+enum {FOREGROUND, BACKGROUND, FLOATING, OVEROVL};
+
+// Game view state machine
+enum vstate_t {V_IDLE, V_INTROINIT, V_INTRO, V_PLAY, V_INVENT, V_EXIT};
+
+enum font_t {LARGE_ROMAN, MED_ROMAN, NUM_GDI_FONTS, INIT_FONTS, DEL_FONTS};
+
+// Ways to dismiss a text/prompt box
+enum box_t {BOX_ANY, BOX_OK, BOX_PROMPT, BOX_YESNO};
+
+// Standard viewport sizes
+enum wsize_t {SIZE_DEF, SIZE_1, SIZE_2, SIZE_3};
+
+// Display list functions
+enum dupdate_t {D_INIT, D_ADD, D_DISPLAY, D_RESTORE};
+
+// General device installation commands
+enum inst_t {INSTALL, RESTORE, RESET};
+
+// Inventory icon bar states
+enum istate_t {I_OFF, I_UP, I_DOWN, I_ACTIVE};
+
+// Actions for Process_inventory()
+enum invact_t {INV_INIT, INV_LEFT, INV_RIGHT, INV_GET};
+
+// Purpose of an automatic route
+enum go_t {GO_SPACE, GO_EXIT, GO_LOOK, GO_GET};
+
+// Following are points for achieving certain actions.
+struct point_t {
+ byte score; // The value of the point
+ bool scoredFl; // Whether scored yet
+};
+
+// Structure for initializing maze processing
+struct maze_t {
+ bool enabledFl; // TRUE when maze processing enabled
+ byte size; // Size of (square) maze matrix
+ int x1, y1, x2, y2; // maze hotspot bounding box
+ int x3, x4; // north, south x entry coordinates
+ byte firstScreenIndex; // index of first screen in maze
+};
+
+// Following defines the action types and action list
+enum action_t { // Parameters:
+ ANULL = 0xff, // Special NOP used to 'delete' events in DEL_EVENTS
+ ASCHEDULE = 0, // 0 - Ptr to action list to be rescheduled
+ START_OBJ, // 1 - Object number
+ INIT_OBJXY, // 2 - Object number, x,y
+ PROMPT, // 3 - index of prompt & response string, ptrs to action
+ // lists. First if response matches, 2nd if not.
+ BKGD_COLOR, // 4 - new background color
+ INIT_OBJVXY, // 5 - Object number, vx, vy
+ INIT_CARRY, // 6 - Object number, carried status
+ INIT_HF_COORD, // 7 - Object number (gets hero's 'feet' coordinates)
+ NEW_SCREEN, // 8 - New screen number
+ INIT_OBJSTATE, // 9 - Object number, new object state
+ INIT_PATH, // 10 - Object number, new path type
+ COND_R, // 11 - Conditional on object state - req state, 2 act_lists
+ TEXT, // 12 - Simple text box
+ SWAP_IMAGES, // 13 - Swap 2 object images
+ COND_SCR, // 14 - Conditional on current screen
+ AUTOPILOT, // 15 - Set object to home in on another (stationary) object
+ INIT_OBJ_SEQ, // 16 - Object number, sequence index to set curr_seq_p to
+ SET_STATE_BITS, // 17 - Objnum, mask to OR with obj states word
+ CLEAR_STATE_BITS, // 18 - Objnum, mask to ~AND with obj states word
+ TEST_STATE_BITS, // 19 - Objnum, mask to test obj states word
+ DEL_EVENTS, // 20 - Action type to delete all occurrences of
+ GAMEOVER, // 21 - Disable hero & commands. Game is over
+ INIT_HH_COORD, // 22 - Object number (gets hero's actual coordinates)
+ EXIT, // 23 - Exit game back to DOS
+ BONUS, // 24 - Get score bonus for an action
+ COND_BOX, // 25 - Conditional on object within bounding box
+ SOUND, // 26 - Set currently playing sound
+ ADD_SCORE, // 27 - Add object's value to current score
+ SUB_SCORE, // 28 - Subtract object's value from current score
+ COND_CARRY, // 29 - Conditional on carrying object
+ INIT_MAZE, // 30 - Start special maze hotspot processing
+ EXIT_MAZE, // 31 - Exit special maze processing
+ INIT_PRIORITY, // 32 - Initialize fbg field
+ INIT_SCREEN, // 33 - Initialise screen field of object
+ AGSCHEDULE, // 34 - Global schedule - lasts over new screen
+ REMAPPAL, // 35 - Remappe palette - palette index, color
+ COND_NOUN, // 36 - Conditional on noun appearing in line
+ SCREEN_STATE, // 37 - Set new screen state - used for comments
+ INIT_LIPS, // 38 - Position lips object for supplied object
+ INIT_STORY_MODE, // 39 - Set story mode TRUE/FALSE (user can't type)
+ WARN, // 40 - Same as TEXT but can't dismiss box by typing
+ COND_BONUS, // 41 - Conditional on bonus having been scored
+ TEXT_TAKE, // 42 - Issue text box with "take" info string
+ YESNO, // 43 - Prompt user for Yes or No
+ STOP_ROUTE, // 44 - Skip any route in progress (hero still walks)
+ COND_ROUTE, // 45 - Conditional on route in progress
+ INIT_JUMPEXIT, // 46 - Initialize status.jumpexit
+ INIT_VIEW, // 47 - Initialize viewx, viewy, dir
+ INIT_OBJ_FRAME, // 48 - Object number, seq,frame to set curr_seq_p to
+ OLD_SONG = 49 // Added by Strangerke - Set currently playing sound, old way: that is, using a string index instead of a reference in a file
+};
+
+
+struct act0 { // Type 0 - Schedule
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 actIndex; // Ptr to an action list
+};
+
+struct act1 { // Type 1 - Start an object
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int cycleNumb; // Number of times to cycle
+ cycle_t cycle; // Direction to start cycling
+};
+
+struct act2 { // Type 2 - Initialise an object coords
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int x, y; // Coordinates
+};
+
+struct act3 { // Type 3 - Prompt user for text
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 promptIndex; // Index of prompt string
+ int *responsePtr; // Array of indexes to valid response
+ // string(s) (terminate list with -1)
+ uint16 actPassIndex; // Ptr to action list if success
+ uint16 actFailIndex; // Ptr to action list if failure
+ bool encodedFl; // (HUGO 1 DOS ONLY) Whether response is encoded or not
+};
+
+struct act4 { // Type 4 - Set new background color
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ long newBackgroundColor; // New color
+};
+
+struct act5 { // Type 5 - Initialise an object velocity
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int vx, vy; // velocity
+};
+
+struct act6 { // Type 6 - Initialise an object carrying
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ bool carriedFl; // carrying
+};
+
+struct act7 { // Type 7 - Initialise an object to hero's coords
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+};
+
+struct act8 { // Type 8 - switch to new screen
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int screenIndex; // The new screen number
+};
+
+struct act9 { // Type 9 - Initialise an object state
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ byte newState; // New state
+};
+
+struct act10 { // Type 10 - Initialise an object path type
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int newPathType; // New path type
+ int8 vxPath, vyPath; // Max delta velocities e.g. for CHASE
+};
+
+struct act11 { // Type 11 - Conditional on object's state
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ byte stateReq; // Required state
+ uint16 actPassIndex; // Ptr to action list if success
+ uint16 actFailIndex; // Ptr to action list if failure
+};
+
+struct act12 { // Type 12 - Simple text box
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int stringIndex; // Index (enum) of string in strings.dat
+};
+
+struct act13 { // Type 13 - Swap first object image with second
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int obj1; // Index of first object
+ int obj2; // 2nd
+};
+
+struct act14 { // Type 14 - Conditional on current screen
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The required object
+ int screenReq; // The required screen number
+ uint16 actPassIndex; // Ptr to action list if success
+ uint16 actFailIndex; // Ptr to action list if failure
+};
+
+struct act15 { // Type 15 - Home in on an object
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int obj1; // The object number homing in
+ int obj2; // The object number to home in on
+ int8 dx, dy; // Max delta velocities
+};
+// Note: Don't set a sequence at time 0 of a new screen, it causes
+// problems clearing the boundary bits of the object! timer > 0 is safe
+struct act16 { // Type 16 - Set curr_seq_p to seq
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int seqIndex; // The index of seq array to set to
+};
+
+struct act17 { // Type 17 - SET obj individual state bits
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int stateMask; // The mask to OR with current obj state
+};
+
+struct act18 { // Type 18 - CLEAR obj individual state bits
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int stateMask; // The mask to ~AND with current obj state
+};
+
+struct act19 { // Type 19 - TEST obj individual state bits
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int stateMask; // The mask to AND with current obj state
+ uint16 actPassIndex; // Ptr to action list (all bits set)
+ uint16 actFailIndex; // Ptr to action list (not all set)
+};
+
+struct act20 { // Type 20 - Remove all events with this type of action
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ action_t actTypeDel; // The action type to remove
+};
+
+struct act21 { // Type 21 - Gameover. Disable hero & commands
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+};
+
+struct act22 { // Type 22 - Initialise an object to hero's coords
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+};
+
+struct act23 { // Type 23 - Exit game back to DOS
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+};
+
+struct act24 { // Type 24 - Get bonus score
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int pointIndex; // Index into points array
+};
+
+struct act25 { // Type 25 - Conditional on bounding box
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The required object number
+ int x1, y1, x2, y2; // The bounding box
+ uint16 actPassIndex; // Ptr to action list if success
+ uint16 actFailIndex; // Ptr to action list if failure
+};
+
+struct act26 { // Type 26 - Play a sound
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int16 soundIndex; // Sound index in data file
+};
+
+struct act27 { // Type 27 - Add object's value to score
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // object number
+};
+
+struct act28 { // Type 28 - Subtract object's value from score
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // object number
+};
+
+struct act29 { // Type 29 - Conditional on object carried
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The required object number
+ uint16 actPassIndex; // Ptr to action list if success
+ uint16 actFailIndex; // Ptr to action list if failure
+};
+
+struct act30 { // Type 30 - Start special maze processing
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ byte mazeSize; // Size of (square) maze
+ int x1, y1, x2, y2; // Bounding box of maze
+ int x3, x4; // Extra x points for perspective correction
+ byte firstScreenIndex; // First (top left) screen of maze
+};
+
+struct act31 { // Type 31 - Exit special maze processing
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+};
+
+struct act32 { // Type 32 - Init fbg field of object
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ byte priority; // Value of foreground/background field
+};
+
+struct act33 { // Type 33 - Init screen field of object
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int screenIndex; // Screen number
+};
+
+struct act34 { // Type 34 - Global Schedule
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 actIndex; // Ptr to an action list
+};
+
+struct act35 { // Type 35 - Remappe palette
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int16 oldColorIndex; // Old color index, 0..15
+ int16 newColorIndex; // New color index, 0..15
+};
+
+struct act36 { // Type 36 - Conditional on noun mentioned
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 nounIndex; // The required noun (list)
+ uint16 actPassIndex; // Ptr to action list if success
+ uint16 actFailIndex; // Ptr to action list if failure
+};
+
+struct act37 { // Type 37 - Set new screen state
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int screenIndex; // The screen number
+ byte newState; // The new state
+};
+
+struct act38 { // Type 38 - Position lips
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int lipsObjNumb; // The LIPS object
+ int objNumb; // The object to speak
+ byte dxLips; // Relative offset of x
+ byte dyLips; // Relative offset of y
+};
+
+struct act39 { // Type 39 - Init story mode
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ bool storyModeFl; // New state of story_mode flag
+};
+
+struct act40 { // Type 40 - Unsolicited text box
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int stringIndex; // Index (enum) of string in strings.dat
+};
+
+struct act41 { // Type 41 - Conditional on bonus scored
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int BonusIndex; // Index into bonus list
+ uint16 actPassIndex; // Index of the action list if scored for the first time
+ uint16 actFailIndex; // Index of the action list if already scored
+};
+
+struct act42 { // Type 42 - Text box with "take" string
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object taken
+};
+
+struct act43 { // Type 43 - Prompt user for Yes or No
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int promptIndex; // index of prompt string
+ uint16 actYesIndex; // Ptr to action list if YES
+ uint16 actNoIndex; // Ptr to action list if NO
+};
+
+struct act44 { // Type 44 - Stop any route in progress
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+};
+
+struct act45 { // Type 45 - Conditional on route in progress
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int routeIndex; // Must be >= current status.rindex
+ uint16 actPassIndex; // Ptr to action list if en-route
+ uint16 actFailIndex; // Ptr to action list if not
+};
+
+struct act46 { // Type 46 - Init status.jumpexit
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ bool jumpExitFl; // New state of jumpexit flag
+};
+
+struct act47 { // Type 47 - Init viewx,viewy,dir
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object
+ int16 viewx; // object.viewx
+ int16 viewy; // object.viewy
+ int16 direction; // object.dir
+};
+
+struct act48 { // Type 48 - Set curr_seq_p to frame n
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int seqIndex; // The index of seq array to set to
+ int frameIndex; // The index of frame to set to
+};
+
+struct act49 { // Added by Strangerke - Type 79 - Play a sound (DOS way)
+ action_t actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 soundIndex; // Sound index in string array
+};
+
+union act {
+ act0 a0;
+ act1 a1;
+ act2 a2;
+ act3 a3;
+ act4 a4;
+ act5 a5;
+ act6 a6;
+ act7 a7;
+ act8 a8;
+ act9 a9;
+ act10 a10;
+ act11 a11;
+ act12 a12;
+ act13 a13;
+ act14 a14;
+ act15 a15;
+ act16 a16;
+ act17 a17;
+ act18 a18;
+ act19 a19;
+ act20 a20;
+ act21 a21;
+ act22 a22;
+ act23 a23;
+ act24 a24;
+ act25 a25;
+ act26 a26;
+ act27 a27;
+ act28 a28;
+ act29 a29;
+ act30 a30;
+ act31 a31;
+ act32 a32;
+ act33 a33;
+ act34 a34;
+ act35 a35;
+ act36 a36;
+ act37 a37;
+ act38 a38;
+ act39 a39;
+ act40 a40;
+ act41 a41;
+ act42 a42;
+ act43 a43;
+ act44 a44;
+ act45 a45;
+ act46 a46;
+ act47 a47;
+ act48 a48;
+ act49 a49;
+};
+
+// The following determines how a verb is acted on, for an object
+struct cmd {
+ uint16 verbIndex; // the verb
+ uint16 reqIndex; // ptr to list of required objects
+ uint16 textDataNoCarryIndex; // ptr to string if any of above not carried
+ byte reqState; // required state for verb to be done
+ byte newState; // new states if verb done
+ uint16 textDataWrongIndex; // ptr to string if wrong state
+ uint16 textDataDoneIndex; // ptr to string if verb done
+ uint16 actIndex; // Ptr to action list if verb done
+};
+
+// The following is a linked list of images in an animation sequence
+// The image data is in 8-bit DIB format, i.e. 1 byte = 1 pixel
+struct seq_t { // Linked list of images
+ byte *imagePtr; // ptr to image
+ uint16 bytesPerLine8; // bytes per line (8bits)
+ uint16 lines; // lines
+ uint16 x1, x2, y1, y2; // Offsets from x,y: data bounding box
+ seq_t *nextSeqPtr; // ptr to next record
+};
+
+// The following is an array of structures of above sequences
+struct seqList_t {
+ uint16 imageNbr; // Number of images in sequence
+ seq_t *seqPtr; // Ptr to sequence structure
+};
+
+// Following is definition of object attributes
+struct object_t {
+ uint16 nounIndex; // String identifying object
+ uint16 dataIndex; // String describing the object
+ uint16 *stateDataIndex; // Added by Strangerke to handle the LOOK_S state-dependant descriptions
+ path_t pathType; // Describe path object follows
+ int vxPath, vyPath; // Delta velocities (e.g. for CHASE)
+ uint16 actIndex; // Action list to do on collision with hero
+ byte seqNumb; // Number of sequences in list
+ seq_t *currImagePtr; // Sequence image currently in use
+ seqList_t seqList[MAX_SEQUENCES]; // Array of sequence structure ptrs and lengths
+ cycle_t cycling; // Whether cycling, forward or backward
+ byte cycleNumb; // No. of times to cycle
+ byte frameInterval; // Interval (in ticks) between frames
+ byte frameTimer; // Decrementing timer for above
+ int8 radius; // Defines sphere of influence by hero
+ byte screenIndex; // Screen in which object resides
+ int x, y; // Current coordinates of object
+ int oldx, oldy; // Previous coordinates of object
+ int8 vx, vy; // Velocity
+ byte objValue; // Value of object
+ int genericCmd; // Bit mask of 'generic' commands for object
+ uint16 cmdIndex; // ptr to list of cmd structures for verbs
+ bool carriedFl; // TRUE if object being carried
+ byte state; // state referenced in cmd list
+ bool verbOnlyFl; // TRUE if verb-only cmds allowed e.g. sit,look
+ byte priority; // Whether object fore, background or floating
+ int16 viewx, viewy; // Position to view object from (or 0 or -1)
+ int16 direction; // Direction to view object from
+ byte curSeqNum; // Save which seq number currently in use
+ byte curImageNum; // Save which image of sequence currently in use
+ int8 oldvx; // Previous vx (used in wandering)
+ int8 oldvy; // Previous vy
+};
+
+// Following is structure of verbs and nouns for 'background' objects
+// These are objects that appear in the various screens, but nothing
+// interesting ever happens with them. Rather than just be dumb and say
+// "don't understand" we produce an interesting msg to keep user sane.
+struct background_t {
+ uint16 verbIndex;
+ uint16 nounIndex;
+ int commentIndex; // Index of comment produced on match
+ bool matchFl; // TRUE if noun must match when present
+ byte roomState; // "State" of room. Comments might differ.
+ byte bonusIndex; // Index of bonus score (0 = no bonus)
+};
+
+typedef background_t *objectList_t;
+
+typedef byte overlay_t[OVL_SIZE]; // Overlay file
+typedef byte viewdib_t[(long)XPIX *YPIX]; // Viewport dib
+typedef byte icondib_t[XPIX *INV_DY]; // Icon bar dib
+
+typedef char command_t[MAX_CHARS + 8]; // Command line (+spare for prompt,cursor)
+typedef char fpath_t[MAX_FPATH]; // File path
+
+// Structure to define an EXIT or other collision-activated hotspot
+struct hotspot_t {
+ int screenIndex; // Screen in which hotspot appears
+ int x1, y1, x2, y2; // Bounding box of hotspot
+ uint16 actIndex; // Actions to carry out if a 'hit'
+ int16 viewx, viewy, direction; // Used in auto-route mode
+};
+
+struct status_t { // Game status (not saved)
+ bool initSaveFl; // Force save of initial game
+ bool storyModeFl; // Game is telling story - no commands
+ bool gameOverFl; // Game is over - hero knobbled
+ bool playbackFl; // Game is in playback mode
+ bool recordFl; // Game is in record mode
+ bool demoFl; // Game is in demo mode
+ bool debugFl; // Game is in debug mode
+ bool textBoxFl; // Game is (halted) in text box
+// Strangerke - Not used ?
+// bool mmtimeFl; // Multimedia timer supported
+ bool lookFl; // Toolbar "look" button pressed
+ bool recallFl; // Toolbar "recall" button pressed
+ bool leftButtonFl; // Left mouse button pressed
+ bool rightButtonFl; // Right button pressed
+ bool newScreenFl; // New screen just loaded in dib_a
+ bool jumpExitFl; // Allowed to jump to a screen exit
+ bool godModeFl; // Allow DEBUG features in live version
+ bool helpFl; // Calling WinHelp (don't disable music)
+ uint32 tick; // Current time in ticks
+ uint32 saveTick; // Time of last save in ticks
+ vstate_t viewState; // View state machine
+ istate_t inventoryState; // Inventory icon bar state
+ int16 inventoryHeight; // Inventory icon bar height
+ int16 inventoryObjId; // Inventory object selected, or -1
+ int16 routeIndex; // Index into route list, or -1
+ go_t go_for; // Purpose of an automatic route
+ int16 go_id; // Index of exit of object walking to
+ fpath_t path; // Alternate path for saved files
+ long saveSize; // Size of a saved game
+ int16 saveSlot; // Current slot to save/restore game
+ int16 screenWidth; // Desktop screen width
+ int16 song; // Current song
+ int16 cx, cy; // Cursor position (dib coords)
+};
+
+struct config_t { // User's config (saved)
+ bool musicFl; // State of Music button/menu item
+ bool soundFl; // State of Sound button/menu item
+ bool turboFl; // State of Turbo button/menu item
+// int16 wx, wy; // Position of viewport
+ int16 cx, cy; // Size of viewport
+ bool backgroundMusicFl; // Continue music when task inactive
+ byte musicVolume; // Music volume percentage
+ byte soundVolume; // Sound volume percentage
+ bool playlist[MAX_TUNES]; // Tune playlist
+};
+
+struct target_t { // Secondary target for action
+ uint16 nounIndex; // Secondary object
+ uint16 verbIndex; // Action on secondary object
+};
+
+struct uses_t { // Define uses of certain objects
+ int16 objId; // Primary object
+ uint16 dataIndex; // String if no secondary object matches
+ target_t *targets; // List of secondary targets
+};
+
+// Global externs
+extern config_t _config; // User's config
+extern maze_t _maze; // Maze control structure
+extern hugo_boot_t _boot; // Boot info structure
+extern char _textBoxBuffer[]; // Useful box text buffer
+extern command_t _line; // Line of user text input
+
+/* Structure of scenery file lookup entry */
+struct sceneBlock_t {
+ uint32 scene_off;
+ uint32 scene_len;
+ uint32 b_off;
+ uint32 b_len;
+ uint32 o_off;
+ uint32 o_len;
+ uint32 ob_off;
+ uint32 ob_len;
+};
+
+/* Structure of object file lookup entry */
+struct objBlock_t {
+ uint32 objOffset;
+ uint32 objLength;
+};
+
+#include "common/pack-start.h" // START STRUCT PACKING
+struct sound_hdr_t { // Sound file lookup entry
+ uint16 size; // Size of sound data in bytes
+ uint32 offset; // Offset of sound data in file
+} PACKED_STRUCT;
+#include "common/pack-end.h" // END STRUCT PACKING
+
+} // End of namespace Hugo
+
+#endif
diff --git a/engines/hugo/global.h b/engines/hugo/global.h
new file mode 100644
index 0000000000..110a5957fe
--- /dev/null
+++ b/engines/hugo/global.h
@@ -0,0 +1,55 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+namespace Hugo {
+
+#define HERO 0 // In all enums, HERO is the first element
+
+#define DESCRIPLEN 32 /* Length of description string */
+#define MAX_SOUNDS 64 /* Max number of sounds */
+#define BOOTFILE "HUGO.BSF" /* Name of boot structure file */
+#define CONFIGFILE "CONFIG.DAT" /* Name of config file */
+#define LEN_MASK 0x3F /* Lower 6 bits are length */
+#define PBFILE "playback.dat"
+
+/* Name scenery and objects picture databases */
+#define SCENERY_FILE "scenery.dat"
+#define OBJECTS_FILE "objects.dat"
+#define STRING_FILE "strings.dat"
+#define SOUND_FILE "sounds.dat"
+
+/* User interface database (Windows Only) */
+#define UIF_FILE "uif.dat"
+
+static const int kSavegameVersion = 1;
+
+} // End of namespace Hugo
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
new file mode 100644
index 0000000000..58f4dc444e
--- /dev/null
+++ b/engines/hugo/hugo.cpp
@@ -0,0 +1,1476 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/system.h"
+#include "common/events.h"
+#include "common/debug-channels.h"
+
+#include "hugo/hugo.h"
+#include "hugo/global.h"
+#include "hugo/game.h"
+#include "hugo/file.h"
+#include "hugo/schedule.h"
+#include "hugo/display.h"
+#include "hugo/mouse.h"
+#include "hugo/inventory.h"
+#include "hugo/parser.h"
+#include "hugo/route.h"
+#include "hugo/sound.h"
+#include "hugo/intro.h"
+
+#include "engines/util.h"
+
+namespace Hugo {
+
+HugoEngine *HugoEngine::s_Engine = NULL;
+
+overlay_t HugoEngine::_boundary;
+overlay_t HugoEngine::_overlay;
+overlay_t HugoEngine::_ovlBase;
+overlay_t HugoEngine::_objBound;
+
+HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(syst), _gameDescription(gd), _mouseX(0), _mouseY(0),
+ _textData(0), _stringtData(0), _screenNames(0), _textEngine(0), _textIntro(0), _textMouse(0), _textParser(0), _textSchedule(0), _textUtil(0),
+ _arrayNouns(0), _arrayVerbs(0), _arrayReqs(0), _hotspots(0), _invent(0), _uses(0), _catchallList(0), _backgroundObjects(0),
+ _points(0), _cmdList(0), _screenActs(0), _objects(0), _actListArr(0), _heroImage(0), _defltTunes(0), _palette(0), _introX(0),
+ _introY(0), _maxInvent(0), _numBonuses(0), _numScreens(0), _tunesNbr(0), _soundSilence(0), _soundTest(0), _screenStates(0), _numObj(0),
+ _score(0), _maxscore(0)
+
+{
+ DebugMan.addDebugChannel(kDebugSchedule, "Schedule", "Script Schedule debug level");
+ DebugMan.addDebugChannel(kDebugEngine, "Engine", "Engine debug level");
+ DebugMan.addDebugChannel(kDebugDisplay, "Display", "Display debug level");
+ DebugMan.addDebugChannel(kDebugMouse, "Mouse", "Mouse debug level");
+ DebugMan.addDebugChannel(kDebugParser, "Parser", "Parser debug level");
+ DebugMan.addDebugChannel(kDebugFile, "File", "File IO debug level");
+ DebugMan.addDebugChannel(kDebugRoute, "Route", "Route debug level");
+ DebugMan.addDebugChannel(kDebugInventory, "Inventory", "Inventory debug level");
+}
+
+HugoEngine::~HugoEngine() {
+ delete _soundHandler;
+ delete _route;
+ delete _parser;
+ delete _inventoryHandler;
+ delete _mouseHandler;
+ delete _screen;
+ delete _scheduler;
+ delete _fileManager;
+
+ free(_palette);
+ free(_introX);
+ free(_introY);
+
+#if 0
+ freeTexts(_textData);
+ freeTexts(_stringtData);
+ freeTexts(_textEngine);
+ freeTexts(_textIntro);
+ freeTexts(_textMouse);
+ freeTexts(_textParser);
+ freeTexts(_textSchedule);
+ freeTexts(_textUtil);
+#endif
+ free(_textData);
+ free(_stringtData);
+ free(_screenNames);
+ free(_textEngine);
+ free(_textIntro);
+ free(_textMouse);
+ free(_textParser);
+ free(_textSchedule);
+ free(_textUtil);
+
+ warning("Missing: free _arrayNouns");
+ warning("Missing: free _arrayVerbs");
+
+ free(_arrayReqs);
+ free(_hotspots);
+ free(_invent);
+ free(_uses);
+ free(_catchallList);
+
+ warning("Missing: free _background_objects");
+
+ free(_points);
+
+ warning("Missing: free _cmdList");
+ warning("Missing: free _screenActs");
+ warning("Missing: free _objects");
+
+ free(_defltTunes);
+ free(_screenStates);
+}
+
+GameType HugoEngine::getGameType() const {
+ return _gameType;
+}
+
+Common::Platform HugoEngine::getPlatform() const {
+ return _platform;
+}
+
+bool HugoEngine::isPacked() const {
+ return _packedFl;
+}
+
+Common::Error HugoEngine::run() {
+ s_Engine = this;
+ initGraphics(320, 200, false);
+
+ _fileManager = new FileManager(*this);
+ _screen = new Screen(*this);
+ _mouseHandler = new MouseHandler(*this);
+ _inventoryHandler = new InventoryHandler(*this);
+ _parser = new Parser(*this);
+ _route = new Route(*this);
+ _soundHandler = new SoundHandler(*this);
+
+ switch (_gameVariant) {
+ case 0:
+ _scheduler = new Scheduler_v2(*this);
+ _introHandler = new intro_1w(*this);
+ break;
+ case 1:
+ _scheduler = new Scheduler_v2(*this);
+ _introHandler = new intro_2w(*this);
+ break;
+ case 2:
+ _scheduler = new Scheduler_v2(*this);
+ _introHandler = new intro_3w(*this);
+ break;
+ case 3:
+ _scheduler = new Scheduler_v1(*this);
+ _introHandler = new intro_1d(*this);
+ break;
+ case 4:
+ _scheduler = new Scheduler_v1(*this);
+ _introHandler = new intro_2d(*this);
+ break;
+ case 5:
+ _scheduler = new Scheduler_v2(*this);
+ _introHandler = new intro_3d(*this);
+ break;
+ }
+
+ if (!loadHugoDat())
+ return Common::kUnknownError;
+
+ // Interesting situation: We have no cursor to show, since
+ // the DOS version had none, and the Windows version just used
+ // the windows default one. Meaning this call will just use whatever
+ // was used last, i.e. the launcher GUI cursor. What to do?
+ g_system->showMouse(true);
+
+ initStatus(); // Initialize game status
+ initConfig(INSTALL); // Initialize user's config
+ initialize();
+ initConfig(RESET); // Reset user's config
+
+ file().restoreGame(-1);
+
+ initMachine();
+
+ // Start the state machine
+ _status.viewState = V_INTROINIT;
+
+ bool doQuitFl = false;
+
+ while (!doQuitFl) {
+ g_system->updateScreen();
+
+ // WORKAROUND: Force the mouse cursor to be displayed. This fixes the disappearing mouse cursor issue.
+ g_system->showMouse(true);
+ runMachine();
+ // Handle input
+ Common::Event event;
+ while (_eventMan->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_KEYDOWN:
+ parser().keyHandler(event.kbd.keycode, 0);
+ break;
+ case Common::EVENT_MOUSEMOVE:
+ _mouseX = event.mouse.x;
+ _mouseY = event.mouse.y;
+ break;
+ case Common::EVENT_LBUTTONDOWN:
+ _status.leftButtonFl = true;
+ break;
+ case Common::EVENT_LBUTTONUP:
+ _status.leftButtonFl = false;
+ break;
+ case Common::EVENT_RBUTTONDOWN:
+ _status.rightButtonFl = true;
+ break;
+ case Common::EVENT_RBUTTONUP:
+ _status.rightButtonFl = false;
+ break;
+ case Common::EVENT_QUIT:
+ doQuitFl = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return Common::kNoError;
+}
+
+void HugoEngine::initMachine() {
+ file().readBackground(_numScreens - 1); // Splash screen
+ readObjectImages(); // Read all object images
+ if (_platform == Common::kPlatformWindows)
+ readUIFImages(); // Read all uif images (only in Win versions)
+}
+
+void HugoEngine::runMachine() {
+// Hugo game state machine - called during onIdle
+ static uint32 lastTime;
+
+ status_t &gameStatus = getGameStatus();
+
+ // Don't process if we're in a textbox
+ if (gameStatus.textBoxFl)
+ return;
+
+ // Don't process if gameover
+ if (gameStatus.gameOverFl)
+ return;
+
+ // Process machine once every tick
+ if (g_system->getMillis() - lastTime < (uint32)(1000 / TPS))
+ return;
+ lastTime = g_system->getMillis();
+
+ switch (gameStatus.viewState) {
+ case V_IDLE: // Not processing state machine
+ intro().preNewGame(); // Any processing before New Game selected
+ break;
+ case V_INTROINIT: // Initialization before intro begins
+ intro().introInit();
+ gameStatus.viewState = V_INTRO;
+ break;
+ case V_INTRO: // Do any game-dependant preamble
+ if (intro().introPlay()) { // Process intro screen
+ scheduler().newScreen(0); // Initialize first screen
+ gameStatus.viewState = V_PLAY;
+ }
+ break;
+ case V_PLAY: // Playing game
+ parser().charHandler(); // Process user cmd input
+ moveObjects(); // Process object movement
+ scheduler().runScheduler(); // Process any actions
+ screen().displayList(D_RESTORE); // Restore previous background
+ updateImages(); // Draw into _frontBuffer, compile display list
+ mouse().mouseHandler(); // Mouse activity - adds to display list
+ parser().drawStatusText();
+ screen().displayList(D_DISPLAY); // Blit the display list to screen
+ break;
+ case V_INVENT: // Accessing inventory
+ inventory().runInventory(); // Process Inventory state machine
+ break;
+ case V_EXIT: // Game over or user exited
+ gameStatus.viewState = V_IDLE;
+ break;
+ }
+}
+
+bool HugoEngine::loadHugoDat() {
+ Common::File in;
+ int numElem, numSubElem, numSubAct;
+ char buf[256];
+ int majVer, minVer;
+
+ in.open("hugo.dat");
+
+ if (!in.isOpen()) {
+ Common::String errorMessage = "You're missing the 'hugo.dat' file. Get it from the ScummVM website";
+ GUIErrorMessage(errorMessage);
+ warning("%s", errorMessage.c_str());
+ return false;
+ }
+
+ // Read header
+ in.read(buf, 4);
+ buf[4] = '\0';
+
+ if (strcmp(buf, "HUGO")) {
+ Common::String errorMessage = "File 'hugo.dat' is corrupt. Get it from the ScummVM website";
+ GUIErrorMessage(errorMessage);
+ warning("%s", errorMessage.c_str());
+ return false;
+ }
+
+ majVer = in.readByte();
+ minVer = in.readByte();
+
+ if ((majVer != HUGO_DAT_VER_MAJ) || (minVer != HUGO_DAT_VER_MIN)) {
+ snprintf(buf, 256, "File 'hugo.dat' is wrong version. Expected %d.%d but got %d.%d. Get it from the ScummVM website", HUGO_DAT_VER_MAJ, HUGO_DAT_VER_MIN, majVer, minVer);
+ GUIErrorMessage(buf);
+ warning("%s", buf);
+
+ return false;
+ }
+
+ _numVariant = in.readUint16BE();
+
+ // Read textData
+ _textData = loadTextsVariante(in, 0);
+
+ // Read stringtData
+ // Only Hugo 1 DOS should use this array
+ _stringtData = loadTextsVariante(in, 0);
+
+ // Read arrayNouns
+ _arrayNouns = loadTextsArray(in);
+
+ // Read arrayVerbs
+ _arrayVerbs = loadTextsArray(in);
+
+ // Read screenNames
+ _screenNames = loadTextsVariante(in, &_numScreens);
+
+ // Read palette
+ _paletteSize = in.readUint16BE();
+ _palette = (byte *)malloc(sizeof(byte) * _paletteSize);
+ for (int i = 0; i < _paletteSize; i++) {
+ _palette[i] = in.readByte();
+ }
+
+ // Read textEngine
+ _textEngine = loadTexts(in);
+
+ // Read textIntro
+ _textIntro = loadTexts(in);
+
+ // Read x_intro and y_intro
+ _introXSize = in.readUint16BE();
+ _introX = (byte *)malloc(sizeof(byte) * _introXSize);
+ _introY = (byte *)malloc(sizeof(byte) * _introXSize);
+ for (int i = 0; i < _introXSize; i++) {
+ _introX[i] = in.readByte();
+ _introY[i] = in.readByte();
+ }
+
+ // Read textMouse
+ _textMouse = loadTexts(in);
+
+ // Read textParser
+ _textParser = loadTexts(in);
+
+ // Read textSchedule
+ _textSchedule = loadTexts(in);
+
+ // Read textUtil
+ _textUtil = loadTexts(in);
+
+ // Read _arrayReqs
+ _arrayReqs = loadLongArray(in);
+
+ // Read _hotspots
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ int numRows = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _hotspots = (hotspot_t *)malloc(sizeof(hotspot_t) * numRows);
+ for (int i = 0; i < numRows; i++) {
+ _hotspots[i].screenIndex = in.readSint16BE();
+ _hotspots[i].x1 = in.readSint16BE();
+ _hotspots[i].y1 = in.readSint16BE();
+ _hotspots[i].x2 = in.readSint16BE();
+ _hotspots[i].y2 = in.readSint16BE();
+ _hotspots[i].actIndex = in.readUint16BE();
+ _hotspots[i].viewx = in.readSint16BE();
+ _hotspots[i].viewy = in.readSint16BE();
+ _hotspots[i].direction = in.readSint16BE();
+ }
+ } else {
+ for (int i = 0; i < numRows; i++) {
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ }
+ }
+ }
+
+ //Read _invent
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _maxInvent = numElem;
+ _invent = (int16 *)malloc(sizeof(int16) * numElem);
+ for (int i = 0; i < numElem; i++)
+ _invent[i] = in.readSint16BE();
+ } else {
+ for (int i = 0; i < numElem; i++)
+ in.readSint16BE();
+ }
+ }
+
+ //Read _uses
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _uses = (uses_t *)malloc(sizeof(uses_t) * numElem);
+ for (int i = 0; i < numElem; i++) {
+ _uses[i].objId = in.readSint16BE();
+ _uses[i].dataIndex = in.readUint16BE();
+ numSubElem = in.readUint16BE();
+ _uses[i].targets = (target_t *)malloc(sizeof(target_t) * numSubElem);
+ for (int j = 0; j < numSubElem; j++) {
+ _uses[i].targets[j].nounIndex = in.readUint16BE();
+ _uses[i].targets[j].verbIndex = in.readUint16BE();
+ }
+ }
+ } else {
+ for (int i = 0; i < numElem; i++) {
+ in.readSint16BE();
+ in.readUint16BE();
+ numSubElem = in.readUint16BE();
+ for (int j = 0; j < numSubElem; j++) {
+ in.readUint16BE();
+ in.readUint16BE();
+ }
+ }
+ }
+ }
+
+ //Read _catchallList
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _catchallList = (background_t *)malloc(sizeof(background_t) * numElem);
+ for (int i = 0; i < numElem; i++) {
+ _catchallList[i].verbIndex = in.readUint16BE();
+ _catchallList[i].nounIndex = in.readUint16BE();
+ _catchallList[i].commentIndex = in.readSint16BE();
+ _catchallList[i].matchFl = (in.readByte() != 0);
+ _catchallList[i].roomState = in.readByte();
+ _catchallList[i].bonusIndex = in.readByte();
+ }
+ } else {
+ for (int i = 0; i < numElem; i++) {
+ in.readUint16BE();
+ in.readUint16BE();
+ in.readSint16BE();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ }
+ }
+ }
+
+// Read _background_objects
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _backgroundObjects = (background_t **)malloc(sizeof(background_t *) * numElem);
+ for (int i = 0; i < numElem; i++) {
+ numSubElem = in.readUint16BE();
+ _backgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem);
+ for (int j = 0; j < numSubElem; j++) {
+ _backgroundObjects[i][j].verbIndex = in.readUint16BE();
+ _backgroundObjects[i][j].nounIndex = in.readUint16BE();
+ _backgroundObjects[i][j].commentIndex = in.readSint16BE();
+ _backgroundObjects[i][j].matchFl = (in.readByte() != 0);
+ _backgroundObjects[i][j].roomState = in.readByte();
+ _backgroundObjects[i][j].bonusIndex = in.readByte();
+ }
+ }
+ } else {
+ for (int i = 0; i < numElem; i++) {
+ numSubElem = in.readUint16BE();
+ for (int j = 0; j < numSubElem; j++) {
+ in.readUint16BE();;
+ in.readUint16BE();;
+ in.readSint16BE();;
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ }
+ }
+ }
+ }
+
+ // Read _points
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _numBonuses = numElem;
+ _points = (point_t *)malloc(sizeof(point_t) * _numBonuses);
+ for (int i = 0; i < _numBonuses; i++) {
+ _points[i].score = in.readByte();
+ _points[i].scoredFl = false;
+ }
+ } else {
+ for (int i = 0; i < numElem; i++)
+ in.readByte();
+ }
+ }
+
+ // Read _cmdList
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _cmdList = (cmd **)malloc(sizeof(cmd *) * numElem);
+ for (int i = 0; i < numElem; i++) {
+ numSubElem = in.readUint16BE();
+ _cmdList[i] = (cmd *)malloc(sizeof(cmd) * numSubElem);
+ for (int j = 0; j < numSubElem; j++) {
+ _cmdList[i][j].verbIndex = in.readUint16BE();
+ _cmdList[i][j].reqIndex = in.readUint16BE();
+ _cmdList[i][j].textDataNoCarryIndex = in.readUint16BE();
+ _cmdList[i][j].reqState = in.readByte();
+ _cmdList[i][j].newState = in.readByte();
+ _cmdList[i][j].textDataWrongIndex = in.readUint16BE();
+ _cmdList[i][j].textDataDoneIndex = in.readUint16BE();
+ _cmdList[i][j].actIndex = in.readUint16BE();
+ }
+ }
+ } else {
+ for (int i = 0; i < numElem; i++) {
+ numSubElem = in.readUint16BE();
+ for (int j = 0; j < numSubElem; j++) {
+ in.readUint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ in.readByte();
+ in.readByte();
+ in.readUint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ }
+ }
+ }
+ }
+
+// TODO: For Hugo2 and Hugo3, if not in story mode, increment _screenActs[0][0] (ex: kALcrashStory + 1 == kALcrashNoStory)
+ // Read _screenActs
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _screenActs = (uint16 **)malloc(sizeof(uint16 *) * numElem);
+ for (int i = 0; i < numElem; i++) {
+ numSubElem = in.readUint16BE();
+ if (numSubElem == 0)
+ _screenActs[i] = 0;
+ else {
+ _screenActs[i] = (uint16 *)malloc(sizeof(uint16) * numSubElem);
+ for (int j = 0; j < numSubElem; j++)
+ _screenActs[i][j] = in.readUint16BE();
+ }
+ }
+ } else {
+ for (int i = 0; i < numElem; i++) {
+ numSubElem = in.readUint16BE();
+ for (int j = 0; j < numSubElem; j++)
+ in.readUint16BE();
+ }
+ }
+
+ }
+
+// TODO: For Hugo3, if not in story mode, set _objects[2].state to 3
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _objects = (object_t *)malloc(sizeof(object_t) * numElem);
+ for (int i = 0; i < numElem; i++) {
+ _objects[i].nounIndex = in.readUint16BE();
+ _objects[i].dataIndex = in.readUint16BE();
+ numSubElem = in.readUint16BE();
+ if (numSubElem == 0)
+ _objects[i].stateDataIndex = 0;
+ else
+ _objects[i].stateDataIndex = (uint16 *)malloc(sizeof(uint16) * numSubElem);
+ for (int j = 0; j < numSubElem; j++)
+ _objects[i].stateDataIndex[j] = in.readUint16BE();
+ _objects[i].pathType = (path_t) in.readSint16BE();
+ _objects[i].vxPath = in.readSint16BE();
+ _objects[i].vyPath = in.readSint16BE();
+ _objects[i].actIndex = in.readUint16BE();
+ _objects[i].seqNumb = in.readByte();
+ _objects[i].currImagePtr = 0;
+ if (_objects[i].seqNumb == 0) {
+ _objects[i].seqList[0].imageNbr = 0;
+ _objects[i].seqList[0].seqPtr = 0;
+ }
+ for (int j = 0; j < _objects[i].seqNumb; j++) {
+ _objects[i].seqList[j].imageNbr = in.readUint16BE();
+ _objects[i].seqList[j].seqPtr = 0;
+ }
+ _objects[i].cycling = (cycle_t)in.readByte();
+ _objects[i].cycleNumb = in.readByte();
+ _objects[i].frameInterval = in.readByte();
+ _objects[i].frameTimer = in.readByte();
+ _objects[i].radius = in.readByte();
+ _objects[i].screenIndex = in.readByte();
+ _objects[i].x = in.readSint16BE();
+ _objects[i].y = in.readSint16BE();
+ _objects[i].oldx = in.readSint16BE();
+ _objects[i].oldy = in.readSint16BE();
+ _objects[i].vx = in.readByte();
+ _objects[i].vy = in.readByte();
+ _objects[i].objValue = in.readByte();
+ _objects[i].genericCmd = in.readSint16BE();
+ _objects[i].cmdIndex = in.readUint16BE();
+ _objects[i].carriedFl = (in.readByte() != 0);
+ _objects[i].state = in.readByte();
+ _objects[i].verbOnlyFl = (in.readByte() != 0);
+ _objects[i].priority = in.readByte();
+ _objects[i].viewx = in.readSint16BE();
+ _objects[i].viewy = in.readSint16BE();
+ _objects[i].direction = in.readSint16BE();
+ _objects[i].curSeqNum = in.readByte();
+ _objects[i].curImageNum = in.readByte();
+ _objects[i].oldvx = in.readByte();
+ _objects[i].oldvy = in.readByte();
+ }
+ } else {
+ for (int i = 0; i < numElem; i++) {
+ in.readUint16BE();
+ in.readUint16BE();
+ numSubElem = in.readUint16BE();
+ for (int j = 0; j < numSubElem; j++)
+ in.readUint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ numSubElem = in.readByte();
+ for (int j = 0; j < numSubElem; j++)
+ in.readUint16BE();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ }
+ }
+ }
+//#define HERO 0
+ _hero = &_objects[HERO]; // This always points to hero
+ _screen_p = &(_objects[HERO].screenIndex); // Current screen is hero's
+ _heroImage = HERO; // Current in use hero image
+
+//read _actListArr
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _actListArr = (act **)malloc(sizeof(act *) * numElem);
+ for (int i = 0; i < numElem; i++) {
+ numSubElem = in.readUint16BE();
+ _actListArr[i] = (act *) malloc(sizeof(act) * (numSubElem + 1));
+ for (int j = 0; j < numSubElem; j++) {
+ _actListArr[i][j].a0.actType = (action_t) in.readByte();
+ switch (_actListArr[i][j].a0.actType) {
+ case ANULL: // -1
+ break;
+ case ASCHEDULE: // 0
+ _actListArr[i][j].a0.timer = in.readSint16BE();
+ _actListArr[i][j].a0.actIndex = in.readUint16BE();
+ break;
+ case START_OBJ: // 1
+ _actListArr[i][j].a1.timer = in.readSint16BE();
+ _actListArr[i][j].a1.objNumb = in.readSint16BE();
+ _actListArr[i][j].a1.cycleNumb = in.readSint16BE();
+ _actListArr[i][j].a1.cycle = (cycle_t) in.readByte();
+ break;
+ case INIT_OBJXY: // 2
+ _actListArr[i][j].a2.timer = in.readSint16BE();
+ _actListArr[i][j].a2.objNumb = in.readSint16BE();
+ _actListArr[i][j].a2.x = in.readSint16BE();
+ _actListArr[i][j].a2.y = in.readSint16BE();
+ break;
+ case PROMPT: // 3
+ _actListArr[i][j].a3.timer = in.readSint16BE();
+ _actListArr[i][j].a3.promptIndex = in.readSint16BE();
+ numSubAct = in.readUint16BE();
+ _actListArr[i][j].a3.responsePtr = (int *) malloc(sizeof(int) * numSubAct);
+ for (int k = 0; k < numSubAct; k++)
+ _actListArr[i][j].a3.responsePtr[k] = in.readSint16BE();
+ _actListArr[i][j].a3.actPassIndex = in.readUint16BE();
+ _actListArr[i][j].a3.actFailIndex = in.readUint16BE();
+ _actListArr[i][j].a3.encodedFl = (in.readByte() == 1) ? true : false;
+ break;
+ case BKGD_COLOR: // 4
+ _actListArr[i][j].a4.timer = in.readSint16BE();
+ _actListArr[i][j].a4.newBackgroundColor = in.readUint32BE();
+ break;
+ case INIT_OBJVXY: // 5
+ _actListArr[i][j].a5.timer = in.readSint16BE();
+ _actListArr[i][j].a5.objNumb = in.readSint16BE();
+ _actListArr[i][j].a5.vx = in.readSint16BE();
+ _actListArr[i][j].a5.vy = in.readSint16BE();
+ break;
+ case INIT_CARRY: // 6
+ _actListArr[i][j].a6.timer = in.readSint16BE();
+ _actListArr[i][j].a6.objNumb = in.readSint16BE();
+ _actListArr[i][j].a6.carriedFl = (in.readByte() == 1) ? true : false;
+ break;
+ case INIT_HF_COORD: // 7
+ _actListArr[i][j].a7.timer = in.readSint16BE();
+ _actListArr[i][j].a7.objNumb = in.readSint16BE();
+ break;
+ case NEW_SCREEN: // 8
+ _actListArr[i][j].a8.timer = in.readSint16BE();
+ _actListArr[i][j].a8.screenIndex = in.readSint16BE();
+ break;
+ case INIT_OBJSTATE: // 9
+ _actListArr[i][j].a9.timer = in.readSint16BE();
+ _actListArr[i][j].a9.objNumb = in.readSint16BE();
+ _actListArr[i][j].a9.newState = in.readByte();
+ break;
+ case INIT_PATH: // 10
+ _actListArr[i][j].a10.timer = in.readSint16BE();
+ _actListArr[i][j].a10.objNumb = in.readSint16BE();
+ _actListArr[i][j].a10.newPathType = in.readSint16BE();
+ _actListArr[i][j].a10.vxPath = in.readByte();
+ _actListArr[i][j].a10.vyPath = in.readByte();
+ break;
+ case COND_R: // 11
+ _actListArr[i][j].a11.timer = in.readSint16BE();
+ _actListArr[i][j].a11.objNumb = in.readSint16BE();
+ _actListArr[i][j].a11.stateReq = in.readByte();
+ _actListArr[i][j].a11.actPassIndex = in.readUint16BE();
+ _actListArr[i][j].a11.actFailIndex = in.readUint16BE();
+ break;
+ case TEXT: // 12
+ _actListArr[i][j].a12.timer = in.readSint16BE();
+ _actListArr[i][j].a12.stringIndex = in.readSint16BE();
+ break;
+ case SWAP_IMAGES: // 13
+ _actListArr[i][j].a13.timer = in.readSint16BE();
+ _actListArr[i][j].a13.obj1 = in.readSint16BE();
+ _actListArr[i][j].a13.obj2 = in.readSint16BE();
+ break;
+ case COND_SCR: // 14
+ _actListArr[i][j].a14.timer = in.readSint16BE();
+ _actListArr[i][j].a14.objNumb = in.readSint16BE();
+ _actListArr[i][j].a14.screenReq = in.readSint16BE();
+ _actListArr[i][j].a14.actPassIndex = in.readUint16BE();
+ _actListArr[i][j].a14.actFailIndex = in.readUint16BE();
+ break;
+ case AUTOPILOT: // 15
+ _actListArr[i][j].a15.timer = in.readSint16BE();
+ _actListArr[i][j].a15.obj1 = in.readSint16BE();
+ _actListArr[i][j].a15.obj2 = in.readSint16BE();
+ _actListArr[i][j].a15.dx = in.readByte();
+ _actListArr[i][j].a15.dy = in.readByte();
+ break;
+ case INIT_OBJ_SEQ: // 16
+ _actListArr[i][j].a16.timer = in.readSint16BE();
+ _actListArr[i][j].a16.objNumb = in.readSint16BE();
+ _actListArr[i][j].a16.seqIndex = in.readSint16BE();
+ break;
+ case SET_STATE_BITS: // 17
+ _actListArr[i][j].a17.timer = in.readSint16BE();
+ _actListArr[i][j].a17.objNumb = in.readSint16BE();
+ _actListArr[i][j].a17.stateMask = in.readSint16BE();
+ break;
+ case CLEAR_STATE_BITS: // 18
+ _actListArr[i][j].a18.timer = in.readSint16BE();
+ _actListArr[i][j].a18.objNumb = in.readSint16BE();
+ _actListArr[i][j].a18.stateMask = in.readSint16BE();
+ break;
+ case TEST_STATE_BITS: // 19
+ _actListArr[i][j].a19.timer = in.readSint16BE();
+ _actListArr[i][j].a19.objNumb = in.readSint16BE();
+ _actListArr[i][j].a19.stateMask = in.readSint16BE();
+ _actListArr[i][j].a19.actPassIndex = in.readUint16BE();
+ _actListArr[i][j].a19.actFailIndex = in.readUint16BE();
+ break;
+ case DEL_EVENTS: // 20
+ _actListArr[i][j].a20.timer = in.readSint16BE();
+ _actListArr[i][j].a20.actTypeDel = (action_t) in.readByte();
+ break;
+ case GAMEOVER: // 21
+ _actListArr[i][j].a21.timer = in.readSint16BE();
+ break;
+ case INIT_HH_COORD: // 22
+ _actListArr[i][j].a22.timer = in.readSint16BE();
+ _actListArr[i][j].a22.objNumb = in.readSint16BE();
+ break;
+ case EXIT: // 23
+ _actListArr[i][j].a23.timer = in.readSint16BE();
+ break;
+ case BONUS: // 24
+ _actListArr[i][j].a24.timer = in.readSint16BE();
+ _actListArr[i][j].a24.pointIndex = in.readSint16BE();
+ break;
+ case COND_BOX: // 25
+ _actListArr[i][j].a25.timer = in.readSint16BE();
+ _actListArr[i][j].a25.objNumb = in.readSint16BE();
+ _actListArr[i][j].a25.x1 = in.readSint16BE();
+ _actListArr[i][j].a25.y1 = in.readSint16BE();
+ _actListArr[i][j].a25.x2 = in.readSint16BE();
+ _actListArr[i][j].a25.y2 = in.readSint16BE();
+ _actListArr[i][j].a25.actPassIndex = in.readUint16BE();
+ _actListArr[i][j].a25.actFailIndex = in.readUint16BE();
+ break;
+ case SOUND: // 26
+ _actListArr[i][j].a26.timer = in.readSint16BE();
+ _actListArr[i][j].a26.soundIndex = in.readSint16BE();
+ break;
+ case ADD_SCORE: // 27
+ _actListArr[i][j].a27.timer = in.readSint16BE();
+ _actListArr[i][j].a27.objNumb = in.readSint16BE();
+ break;
+ case SUB_SCORE: // 28
+ _actListArr[i][j].a28.timer = in.readSint16BE();
+ _actListArr[i][j].a28.objNumb = in.readSint16BE();
+ break;
+ case COND_CARRY: // 29
+ _actListArr[i][j].a29.timer = in.readSint16BE();
+ _actListArr[i][j].a29.objNumb = in.readSint16BE();
+ _actListArr[i][j].a29.actPassIndex = in.readUint16BE();
+ _actListArr[i][j].a29.actFailIndex = in.readUint16BE();
+ break;
+ case INIT_MAZE: // 30
+ _actListArr[i][j].a30.timer = in.readSint16BE();
+ _actListArr[i][j].a30.mazeSize = in.readByte();
+ _actListArr[i][j].a30.x1 = in.readSint16BE();
+ _actListArr[i][j].a30.y1 = in.readSint16BE();
+ _actListArr[i][j].a30.x2 = in.readSint16BE();
+ _actListArr[i][j].a30.y2 = in.readSint16BE();
+ _actListArr[i][j].a30.x3 = in.readSint16BE();
+ _actListArr[i][j].a30.x4 = in.readSint16BE();
+ _actListArr[i][j].a30.firstScreenIndex = in.readByte();
+ break;
+ case EXIT_MAZE: // 31
+ _actListArr[i][j].a31.timer = in.readSint16BE();
+ break;
+ case INIT_PRIORITY: // 32
+ _actListArr[i][j].a32.timer = in.readSint16BE();
+ _actListArr[i][j].a32.objNumb = in.readSint16BE();
+ _actListArr[i][j].a32.priority = in.readByte();
+ break;
+ case INIT_SCREEN: // 33
+ _actListArr[i][j].a33.timer = in.readSint16BE();
+ _actListArr[i][j].a33.objNumb = in.readSint16BE();
+ _actListArr[i][j].a33.screenIndex = in.readSint16BE();
+ break;
+ case AGSCHEDULE: // 34
+ _actListArr[i][j].a34.timer = in.readSint16BE();
+ _actListArr[i][j].a34.actIndex = in.readUint16BE();
+ break;
+ case REMAPPAL: // 35
+ _actListArr[i][j].a35.timer = in.readSint16BE();
+ _actListArr[i][j].a35.oldColorIndex = in.readSint16BE();
+ _actListArr[i][j].a35.newColorIndex = in.readSint16BE();
+ break;
+ case COND_NOUN: // 36
+ _actListArr[i][j].a36.timer = in.readSint16BE();
+ _actListArr[i][j].a36.nounIndex = in.readUint16BE();
+ _actListArr[i][j].a36.actPassIndex = in.readUint16BE();
+ _actListArr[i][j].a36.actFailIndex = in.readUint16BE();
+ break;
+ case SCREEN_STATE: // 37
+ _actListArr[i][j].a37.timer = in.readSint16BE();
+ _actListArr[i][j].a37.screenIndex = in.readSint16BE();
+ _actListArr[i][j].a37.newState = in.readByte();
+ break;
+ case INIT_LIPS: // 38
+ _actListArr[i][j].a38.timer = in.readSint16BE();
+ _actListArr[i][j].a38.lipsObjNumb = in.readSint16BE();
+ _actListArr[i][j].a38.objNumb = in.readSint16BE();
+ _actListArr[i][j].a38.dxLips = in.readByte();
+ _actListArr[i][j].a38.dyLips = in.readByte();
+ break;
+ case INIT_STORY_MODE: // 39
+ _actListArr[i][j].a39.timer = in.readSint16BE();
+ _actListArr[i][j].a39.storyModeFl = (in.readByte() == 1);
+ break;
+ case WARN: // 40
+ _actListArr[i][j].a40.timer = in.readSint16BE();
+ _actListArr[i][j].a40.stringIndex = in.readSint16BE();
+ break;
+ case COND_BONUS: // 41
+ _actListArr[i][j].a41.timer = in.readSint16BE();
+ _actListArr[i][j].a41.BonusIndex = in.readSint16BE();
+ _actListArr[i][j].a41.actPassIndex = in.readUint16BE();
+ _actListArr[i][j].a41.actFailIndex = in.readUint16BE();
+ break;
+ case TEXT_TAKE: // 42
+ _actListArr[i][j].a42.timer = in.readSint16BE();
+ _actListArr[i][j].a42.objNumb = in.readSint16BE();
+ break;
+ case YESNO: // 43
+ _actListArr[i][j].a43.timer = in.readSint16BE();
+ _actListArr[i][j].a43.promptIndex = in.readSint16BE();
+ _actListArr[i][j].a43.actYesIndex = in.readUint16BE();
+ _actListArr[i][j].a43.actNoIndex = in.readUint16BE();
+ break;
+ case STOP_ROUTE: // 44
+ _actListArr[i][j].a44.timer = in.readSint16BE();
+ break;
+ case COND_ROUTE: // 45
+ _actListArr[i][j].a45.timer = in.readSint16BE();
+ _actListArr[i][j].a45.routeIndex = in.readSint16BE();
+ _actListArr[i][j].a45.actPassIndex = in.readUint16BE();
+ _actListArr[i][j].a45.actFailIndex = in.readUint16BE();
+ break;
+ case INIT_JUMPEXIT: // 46
+ _actListArr[i][j].a46.timer = in.readSint16BE();
+ _actListArr[i][j].a46.jumpExitFl = (in.readByte() == 1);
+ break;
+ case INIT_VIEW: // 47
+ _actListArr[i][j].a47.timer = in.readSint16BE();
+ _actListArr[i][j].a47.objNumb = in.readSint16BE();
+ _actListArr[i][j].a47.viewx = in.readSint16BE();
+ _actListArr[i][j].a47.viewy = in.readSint16BE();
+ _actListArr[i][j].a47.direction = in.readSint16BE();
+ break;
+ case INIT_OBJ_FRAME: // 48
+ _actListArr[i][j].a48.timer = in.readSint16BE();
+ _actListArr[i][j].a48.objNumb = in.readSint16BE();
+ _actListArr[i][j].a48.seqIndex = in.readSint16BE();
+ _actListArr[i][j].a48.frameIndex = in.readSint16BE();
+ break;
+ case OLD_SONG: //49
+ _actListArr[i][j].a49.timer = in.readSint16BE();
+ _actListArr[i][j].a49.soundIndex = in.readUint16BE();
+ break;
+ default:
+ error("Engine - Unknown action type encountered: %d", _actListArr[i][j].a0.actType);
+ }
+ }
+ _actListArr[i][numSubElem].a0.actType = ANULL;
+ }
+ } else {
+ for (int i = 0; i < numElem; i++) {
+ numSubElem = in.readUint16BE();
+ for (int j = 0; j < numSubElem; j++) {
+ numSubAct = in.readByte();
+ switch (numSubAct) {
+ case ANULL: // -1
+ break;
+ case ASCHEDULE: // 0
+ in.readSint16BE();
+ in.readUint16BE();
+ break;
+ case START_OBJ: // 1
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ break;
+ case INIT_OBJXY: // 2
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case PROMPT: // 3
+ in.readSint16BE();
+ in.readSint16BE();
+ numSubAct = in.readUint16BE();
+ for (int k = 0; k < numSubAct; k++)
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ in.readByte();
+ break;
+ case BKGD_COLOR: // 4
+ in.readSint16BE();
+ in.readUint32BE();
+ break;
+ case INIT_OBJVXY: // 5
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case INIT_CARRY: // 6
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ break;
+ case INIT_HF_COORD: // 7
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case NEW_SCREEN: // 8
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case INIT_OBJSTATE: // 9
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ break;
+ case INIT_PATH: // 10
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ in.readByte();
+ break;
+ case COND_R: // 11
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ in.readUint16BE();
+ in.readUint16BE();
+ break;
+ case TEXT: // 12
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case SWAP_IMAGES: // 13
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case COND_SCR: // 14
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ break;
+ case AUTOPILOT: // 15
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ in.readByte();
+ break;
+ case INIT_OBJ_SEQ: // 16
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case SET_STATE_BITS: // 17
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case CLEAR_STATE_BITS: // 18
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case TEST_STATE_BITS: // 19
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ break;
+ case DEL_EVENTS: // 20
+ in.readSint16BE();
+ in.readByte();
+ break;
+ case GAMEOVER: // 21
+ in.readSint16BE();
+ break;
+ case INIT_HH_COORD: // 22
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case EXIT: // 23
+ in.readSint16BE();
+ break;
+ case BONUS: // 24
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case COND_BOX: // 25
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ break;
+ case SOUND: // 26
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case ADD_SCORE: // 27
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case SUB_SCORE: // 28
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case COND_CARRY: // 29
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ break;
+ case INIT_MAZE: // 30
+ in.readSint16BE();
+ in.readByte();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ break;
+ case EXIT_MAZE: // 31
+ in.readSint16BE();
+ break;
+ case INIT_PRIORITY: // 32
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ break;
+ case INIT_SCREEN: // 33
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case AGSCHEDULE: // 34
+ in.readSint16BE();
+ in.readUint16BE();
+ break;
+ case REMAPPAL: // 35
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case COND_NOUN: // 36
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ break;
+ case SCREEN_STATE: // 37
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ break;
+ case INIT_LIPS: // 38
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readByte();
+ in.readByte();
+ break;
+ case INIT_STORY_MODE: // 39
+ in.readSint16BE();
+ in.readByte();
+ break;
+ case WARN: // 40
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case COND_BONUS: // 41
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ break;
+ case TEXT_TAKE: // 42
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case YESNO: // 43
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ break;
+ case STOP_ROUTE: // 44
+ in.readSint16BE();
+ break;
+ case COND_ROUTE: // 45
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ break;
+ case INIT_JUMPEXIT: // 46
+ in.readSint16BE();
+ in.readByte();
+ break;
+ case INIT_VIEW: // 47
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case INIT_OBJ_FRAME: // 48
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ in.readSint16BE();
+ break;
+ case OLD_SONG: //49
+ in.readSint16BE();
+ in.readUint16BE();
+ break;
+ default:
+ error("Engine - Unknown action type encountered %d - variante %d pos %d.%d", numSubAct, varnt, i, j);
+ }
+ }
+ }
+ }
+ }
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ if (varnt == _gameVariant) {
+ _tunesNbr = in.readByte();
+ _soundSilence = in.readByte();
+ _soundTest = in.readByte();
+ } else {
+ in.readByte();
+ in.readByte();
+ in.readByte();
+ }
+ }
+
+ //Read _defltTunes
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _maxInvent = numElem;
+ _defltTunes = (int16 *)malloc(sizeof(int16) * numElem);
+ for (int i = 0; i < numElem; i++)
+ _defltTunes[i] = in.readSint16BE();
+ } else {
+ for (int i = 0; i < numElem; i++)
+ in.readSint16BE();
+ }
+ }
+
+ //Read _screenStates size
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ _screenStates = (byte *)malloc(sizeof(byte) * numElem);
+ for (int i = 0; i < numElem; i++)
+ _screenStates[i] = 0;
+ }
+ }
+
+ //Read look, take and drop special verbs indexes
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ if (varnt == _gameVariant) {
+ _look = in.readUint16BE();
+ _take = in.readUint16BE();
+ _drop = in.readUint16BE();
+ } else {
+ in.readUint16BE();
+ in.readUint16BE();
+ in.readUint16BE();
+ }
+ }
+
+ //Read LASTOBJ
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant)
+ _numObj = numElem;
+ }
+
+ //Read kALnewscr used by maze (Hugo 2)
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numElem = in.readUint16BE();
+ if (varnt == _gameVariant)
+ _alNewscrIndex = numElem;
+ }
+
+ return true;
+}
+
+char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) {
+ int numTexts;
+ int entryLen;
+ int len;
+ char **res = 0;
+ char *pos = 0;
+
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numTexts = in.readUint16BE();
+ entryLen = in.readUint16BE();
+ pos = (char *)malloc(entryLen);
+ if (varnt == _gameVariant) {
+ if (arraySize)
+ *arraySize = numTexts;
+ res = (char **)malloc(sizeof(char *) * numTexts);
+ res[0] = pos;
+ in.read(res[0], entryLen);
+ } else {
+ in.read(pos, entryLen);
+ }
+
+ pos += DATAALIGNMENT;
+
+ for (int i = 1; i < numTexts; i++) {
+ pos -= 2;
+
+ len = READ_BE_UINT16(pos);
+ pos += 2 + len;
+
+ if (varnt == _gameVariant)
+ res[i] = pos;
+ }
+ }
+
+ return res;
+}
+
+uint16 **HugoEngine::loadLongArray(Common::File &in) {
+ uint16 **resArray = 0;
+ uint16 *resRow = 0;
+ uint16 dummy, numRows, numElems;
+
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numRows = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ resArray = (uint16 **)malloc(sizeof(uint16 *) * (numRows + 1));
+ resArray[numRows] = 0;
+ }
+ for (int i = 0; i < numRows; i++) {
+ numElems = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ resRow = (uint16 *)malloc(sizeof(uint16) * numElems);
+ for (int j = 0; j < numElems; j++)
+ resRow[j] = in.readUint16BE();
+ resArray[i] = resRow;
+ } else {
+ for (int j = 0; j < numElems; j++)
+ dummy = in.readUint16BE();
+ }
+ }
+ }
+ return resArray;
+}
+
+char ***HugoEngine::loadTextsArray(Common::File &in) {
+ int numNouns;
+ int numTexts;
+ int entryLen;
+ int len;
+ char ***resArray = 0;
+ char **res = 0;
+ char *pos = 0;
+
+ for (int varnt = 0; varnt < _numVariant; varnt++) {
+ numNouns = in.readUint16BE();
+ if (varnt == _gameVariant) {
+ resArray = (char ** *)malloc(sizeof(char **) * (numNouns + 1));
+ resArray[numNouns] = 0;
+ }
+ for (int i = 0; i < numNouns; i++) {
+ numTexts = in.readUint16BE();
+ entryLen = in.readUint16BE();
+ pos = (char *)malloc(entryLen);
+ if (varnt == _gameVariant) {
+ res = (char **)malloc(sizeof(char *) * numTexts);
+ res[0] = pos;
+ in.read(res[0], entryLen);
+ } else {
+ in.read(pos, entryLen);
+ }
+
+ pos += DATAALIGNMENT;
+
+ for (int j = 0; j < numTexts; j++) {
+ if (varnt == _gameVariant)
+ res[j] = pos;
+
+ pos -= 2;
+ len = READ_BE_UINT16(pos);
+ pos += 2 + len;
+ }
+
+ if (varnt == _gameVariant)
+ resArray[i] = res;
+ }
+ }
+
+ return resArray;
+}
+
+char **HugoEngine::loadTexts(Common::File &in) {
+ int numTexts = in.readUint16BE();
+ char **res = (char **)malloc(sizeof(char *) * numTexts);
+ int entryLen;
+ char *pos = 0;
+ int len;
+
+ entryLen = in.readUint16BE();
+ pos = (char *)malloc(entryLen);
+
+ in.read(pos, entryLen);
+
+ pos += DATAALIGNMENT;
+ res[0] = pos;
+
+ for (int i = 1; i < numTexts; i++) {
+ pos -= 2;
+ len = READ_BE_UINT16(pos);
+ pos += 2 + len;
+ res[i] = pos;
+ }
+
+ return res;
+}
+
+void HugoEngine::freeTexts(char **ptr) {
+ if (!ptr)
+ return;
+
+ free(*ptr);
+ free(ptr);
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h
new file mode 100644
index 0000000000..532f18d2eb
--- /dev/null
+++ b/engines/hugo/hugo.h
@@ -0,0 +1,312 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef HUGO_H
+#define HUGO_H
+
+#include "engines/engine.h"
+#include "common/file.h"
+
+// This include is here temporarily while the engine is being refactored.
+#include "hugo/game.h"
+
+#define HUGO_DAT_VER_MAJ 0 // 1 byte
+#define HUGO_DAT_VER_MIN 19 // 1 byte
+#define DATAALIGNMENT 4
+
+namespace Common {
+class RandomSource;
+}
+
+namespace Hugo {
+enum GameType {
+ kGameTypeNone = 0,
+ kGameTypeHugo1,
+ kGameTypeHugo2,
+ kGameTypeHugo3
+};
+
+enum HugoebugChannels {
+ kDebugSchedule = 1 << 0,
+ kDebugEngine = 1 << 1,
+ kDebugDisplay = 1 << 2,
+ kDebugMouse = 1 << 3,
+ kDebugParser = 1 << 4,
+ kDebugFile = 1 << 5,
+ kDebugRoute = 1 << 6,
+ kDebugInventory = 1 << 7
+};
+
+enum HugoGameFeatures {
+ GF_PACKED = (1 << 0) // Database
+};
+
+struct HugoGameDescription;
+
+class FileManager;
+class Scheduler;
+class Screen;
+class MouseHandler;
+class InventoryHandler;
+class Parser;
+class Route;
+class SoundHandler;
+class IntroHandler;
+
+class HugoEngine : public Engine {
+public:
+ HugoEngine(OSystem *syst, const HugoGameDescription *gd);
+ ~HugoEngine();
+
+ byte _numVariant;
+ byte _gameVariant;
+ byte _maxInvent;
+ byte _numBonuses;
+ byte _soundSilence;
+ byte _soundTest;
+ byte _tunesNbr;
+ uint16 _numScreens;
+
+ object_t *_hero;
+ byte *_screen_p;
+ byte _heroImage;
+
+ byte *_palette;
+ byte *_introX;
+ byte *_introY;
+ byte *_screenStates;
+ char **_textData;
+ char **_stringtData;
+ char **_screenNames;
+ char **_textEngine;
+ char **_textIntro;
+ char **_textMouse;
+ char **_textParser;
+ char **_textSchedule;
+ char **_textUtil;
+ char ***_arrayNouns;
+ char ***_arrayVerbs;
+ uint16 **_arrayReqs;
+ hotspot_t *_hotspots;
+ int16 *_invent;
+ uses_t *_uses;
+ background_t *_catchallList;
+ background_t **_backgroundObjects;
+ point_t *_points;
+ cmd **_cmdList;
+ uint16 **_screenActs;
+ object_t *_objects;
+ act **_actListArr;
+ int16 *_defltTunes;
+ uint16 _look;
+ uint16 _take;
+ uint16 _drop;
+ uint16 _numObj;
+ uint16 _alNewscrIndex;
+
+ Common::RandomSource *_rnd;
+
+ const char *_episode;
+ const char *_picDir;
+
+ char _initFilename[20];
+ char _saveFilename[20];
+
+ const HugoGameDescription *_gameDescription;
+ uint32 getFeatures() const;
+
+ GameType getGameType() const;
+ Common::Platform getPlatform() const;
+ bool isPacked() const;
+
+ // Temporary, until the engine is fully objectified.
+ static HugoEngine &get() {
+ assert(s_Engine != NULL);
+ return *s_Engine;
+ }
+
+ FileManager &file() {
+ return *_fileManager;
+ }
+ Scheduler &scheduler() {
+ return *_scheduler;
+ }
+ Screen &screen() {
+ return *_screen;
+ }
+ MouseHandler &mouse() {
+ return *_mouseHandler;
+ }
+ InventoryHandler &inventory() {
+ return *_inventoryHandler;
+ }
+ Parser &parser() {
+ return *_parser;
+ }
+ Route &route() {
+ return *_route;
+ }
+ SoundHandler &sound() {
+ return *_soundHandler;
+ }
+ IntroHandler &intro() {
+ return *_introHandler;
+ }
+
+ void initGame(const HugoGameDescription *gd);
+ void initGamePart(const HugoGameDescription *gd);
+ bool loadHugoDat();
+
+ int getMouseX() const {
+ return _mouseX;
+ }
+ int getMouseY() const {
+ return _mouseY;
+ }
+
+ void initStatus();
+ void readObjectImages();
+ void readUIFImages();
+ void updateImages();
+ void moveObjects();
+ void useObject(int16 objId);
+ bool findObjectSpace(object_t *obj, int16 *destx, int16 *desty);
+ int16 findObject(uint16 x, uint16 y);
+ void lookObject(object_t *obj);
+ void storeBoundary(int x1, int x2, int y);
+ void clearBoundary(int x1, int x2, int y);
+ void endGame();
+ void readScreenFiles(int screen);
+ void setNewScreen(int screen);
+ void initNewScreenDisplay();
+ void screenActions(int screen);
+ void shutdown();
+
+ overlay_t &getBoundaryOverlay() {
+ return _boundary;
+ }
+ overlay_t &getObjectBoundaryOverlay() {
+ return _objBound;
+ }
+ overlay_t &getBaseBoundaryOverlay() {
+ return _ovlBase;
+ }
+ overlay_t &getFirstOverlay() {
+ return _overlay;
+ }
+
+ status_t &getGameStatus() {
+ return _status;
+ }
+
+ int getScore() const {
+ return _score;
+ }
+ void setScore(int newScore) {
+ _score = newScore;
+ }
+ void adjustScore(int adjustment) {
+ _score += adjustment;
+ }
+ int getMaxScore() const {
+ return _maxscore;
+ }
+ void setMaxScore(int newScore) {
+ _maxscore = newScore;
+ }
+ byte getIntroSize() {
+ return _introXSize;
+ }
+
+protected:
+
+ // Engine APIs
+ Common::Error run();
+
+private:
+ int _mouseX;
+ int _mouseY;
+ byte _paletteSize;
+ byte _introXSize;
+ status_t _status; // Game status structure
+
+ static HugoEngine *s_Engine;
+
+// The following are bit plane display overlays which mark travel boundaries,
+// foreground stationary objects and baselines for those objects (used to
+// determine foreground/background wrt moving objects)
+
+// Vinterstum: These shouldn't be static, but we get weird pathfinding issues (and Valgrind warnings) without.
+// Needs more investigation. Alignment issues?
+
+ static overlay_t _boundary; // Boundary overlay file
+ static overlay_t _overlay; // First overlay file
+ static overlay_t _ovlBase; // First overlay base file
+ static overlay_t _objBound; // Boundary file marks object baselines
+
+ GameType _gameType;
+ Common::Platform _platform;
+ bool _packedFl;
+
+ FileManager *_fileManager;
+ Scheduler *_scheduler;
+ Screen *_screen;
+ MouseHandler *_mouseHandler;
+ InventoryHandler *_inventoryHandler;
+ Parser *_parser;
+ Route *_route;
+ SoundHandler *_soundHandler;
+ IntroHandler *_introHandler;
+
+ int _score; // Holds current score
+ int _maxscore; // Holds maximum score
+
+ char **loadTextsVariante(Common::File &in, uint16 *arraySize);
+ char ***loadTextsArray(Common::File &in);
+ uint16 **loadLongArray(Common::File &in);
+ char **loadTexts(Common::File &in);
+ void freeTexts(char **ptr);
+
+ void initPlaylist(bool playlist[MAX_TUNES]);
+ void initConfig(inst_t action);
+ void initialize();
+ int deltaX(int x1, int x2, int vx, int y);
+ int deltaY(int x1, int x2, int vy, int y);
+ void processMaze();
+ //int y2comp (const void *a, const void *b);
+ char *useBG(char *name);
+ void freeObjects();
+ void boundaryCollision(object_t *obj);
+ void calcMaxScore();
+ void initMachine();
+ void runMachine();
+
+ static int y2comp(const void *a, const void *b);
+
+};
+
+} // End of namespace Hugo
+
+#endif // Hugo_H
diff --git a/engines/hugo/intro.cpp b/engines/hugo/intro.cpp
new file mode 100644
index 0000000000..c2198d87bc
--- /dev/null
+++ b/engines/hugo/intro.cpp
@@ -0,0 +1,186 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#include "common/system.h"
+
+#include "hugo/game.h"
+#include "hugo/hugo.h"
+#include "hugo/intro.h"
+#include "hugo/file.h"
+#include "hugo/display.h"
+#include "hugo/util.h"
+
+
+namespace Hugo {
+
+IntroHandler::IntroHandler(HugoEngine &vm) : _vm(vm) {
+}
+
+IntroHandler::~IntroHandler() {
+}
+
+intro_1w::intro_1w(HugoEngine &vm) : IntroHandler(vm) {
+}
+
+intro_1w::~intro_1w() {
+}
+
+void intro_1w::preNewGame() {
+ // Auto-start a new game
+ _vm.file().restoreGame(-1);
+ _vm.getGameStatus().viewState = V_INTROINIT;
+}
+
+void intro_1w::introInit() {
+}
+
+bool intro_1w::introPlay() {
+ return true;
+}
+
+intro_2w::intro_2w(HugoEngine &vm) : IntroHandler(vm) {
+}
+
+intro_2w::~intro_2w() {
+}
+
+void intro_2w::preNewGame() {
+}
+
+void intro_2w::introInit() {
+}
+
+bool intro_2w::introPlay() {
+ return true;
+}
+
+intro_3w::intro_3w(HugoEngine &vm) : IntroHandler(vm) {
+}
+
+intro_3w::~intro_3w() {
+}
+
+void intro_3w::preNewGame() {
+}
+
+void intro_3w::introInit() {
+// Hugo 3 - show map and set up for introPlay()
+//#if STORY
+ _vm.file().readBackground(22); // display screen MAP_3w
+ _vm.screen().displayBackground();
+ introTicks = 0;
+//#endif
+}
+
+bool intro_3w::introPlay() {
+ byte introSize = _vm.getIntroSize();
+
+// Hugo 3 - Preamble screen before going into game. Draws path of Hugo's plane.
+// Called every tick. Returns TRUE when complete
+//TODO : Add proper check of story mode
+//#if STORY
+// SetBkMode(TRANSPARENT);
+ if (introTicks < introSize) {
+ // Scale viewport x_intro,y_intro to screen (offsetting y)
+ _vm.screen().writeChar(_vm._introX[introTicks], _vm._introY[introTicks] - DIBOFF_Y, 'x', _TBRIGHTWHITE);
+
+ // Text boxes at various times
+ switch (introTicks) {
+ case 4:
+ Utils::Box(BOX_OK, "%s", _vm._textIntro[kIntro1]);
+ break;
+ case 9:
+ Utils::Box(BOX_OK, "%s", _vm._textIntro[kIntro2]);
+ break;
+ case 35:
+ Utils::Box(BOX_OK, "%s", _vm._textIntro[kIntro3]);
+ break;
+ }
+ }
+
+ return (++introTicks >= introSize);
+//#else //STORY
+// return true;
+//#endif //STORY
+}
+
+intro_1d::intro_1d(HugoEngine &vm) : IntroHandler(_vm) {
+}
+
+intro_1d::~intro_1d() {
+}
+
+void intro_1d::preNewGame() {
+}
+
+void intro_1d::introInit() {
+}
+
+bool intro_1d::introPlay() {
+ warning("STUB: intro_1d::introPlay()");
+ return true;
+}
+//TODO : Add code for intro H2 DOS
+intro_2d::intro_2d(HugoEngine &vm) : IntroHandler(_vm) {
+}
+
+intro_2d::~intro_2d() {
+}
+
+void intro_2d::preNewGame() {
+}
+
+void intro_2d::introInit() {
+}
+
+bool intro_2d::introPlay() {
+ return true;
+}
+
+//TODO : Add code for intro H3 DOS
+intro_3d::intro_3d(HugoEngine &vm) : IntroHandler(_vm) {
+}
+
+intro_3d::~intro_3d() {
+}
+
+void intro_3d::preNewGame() {
+}
+
+void intro_3d::introInit() {
+}
+
+bool intro_3d::introPlay() {
+ return true;
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/intro.h b/engines/hugo/intro.h
new file mode 100644
index 0000000000..555ae4326a
--- /dev/null
+++ b/engines/hugo/intro.h
@@ -0,0 +1,120 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef INTRO_H
+#define INTRO_H
+
+namespace Hugo {
+
+enum seqTextIntro {
+ kIntro1 = 0,
+ kIntro2 = 1,
+ kIntro3 = 2
+};
+
+class IntroHandler {
+public:
+ IntroHandler(HugoEngine &vm);
+ virtual ~IntroHandler();
+
+ virtual void preNewGame() = 0;
+ virtual void introInit() = 0;
+ virtual bool introPlay() = 0;
+
+protected:
+ HugoEngine &_vm;
+ int16 introTicks; // Count calls to introPlay()
+};
+
+class intro_1w : public IntroHandler {
+public:
+ intro_1w(HugoEngine &vm);
+ ~intro_1w();
+
+ void preNewGame();
+ void introInit();
+ bool introPlay();
+};
+
+class intro_1d : public IntroHandler {
+public:
+ intro_1d(HugoEngine &vm);
+ ~intro_1d();
+
+ void preNewGame();
+ void introInit();
+ bool introPlay();
+};
+
+class intro_2w : public IntroHandler {
+public:
+ intro_2w(HugoEngine &vm);
+ ~intro_2w();
+
+ void preNewGame();
+ void introInit();
+ bool introPlay();
+};
+
+class intro_2d : public IntroHandler {
+public:
+ intro_2d(HugoEngine &vm);
+ ~intro_2d();
+
+ void preNewGame();
+ void introInit();
+ bool introPlay();
+};
+
+class intro_3w : public IntroHandler {
+public:
+ intro_3w(HugoEngine &vm);
+ ~intro_3w();
+
+ void preNewGame();
+ void introInit();
+ bool introPlay();
+};
+
+class intro_3d : public IntroHandler {
+public:
+ intro_3d(HugoEngine &vm);
+ ~intro_3d();
+
+ void preNewGame();
+ void introInit();
+ bool introPlay();
+};
+
+} // End of namespace Hugo
+
+#endif
diff --git a/engines/hugo/inventory.cpp b/engines/hugo/inventory.cpp
new file mode 100644
index 0000000000..c5f09ad653
--- /dev/null
+++ b/engines/hugo/inventory.cpp
@@ -0,0 +1,230 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#include "common/system.h"
+
+#include "hugo/hugo.h"
+#include "hugo/game.h"
+#include "hugo/file.h"
+#include "hugo/schedule.h"
+#include "hugo/display.h"
+#include "hugo/mouse.h"
+#include "hugo/inventory.h"
+#include "hugo/parser.h"
+
+namespace Hugo {
+
+#define MAX_DISP (XPIX / INV_DX) // Max icons displayable
+
+InventoryHandler::InventoryHandler(HugoEngine &vm) : _vm(vm) {
+}
+
+// Construct the inventory scrollbar in dib_i
+// imageTotNumb is total number of inventory icons
+// displayNumb is number requested for display
+// scrollFl is TRUE if scroll arrows required
+// firstObjId is index of first (scrolled) inventory object to display
+void InventoryHandler::constructInventory(int16 imageTotNumb, int displayNumb, bool scrollFl, int16 firstObjId) {
+ int16 ux, uy, ix; // Coordinates of icons
+
+ debugC(1, kDebugInventory, "constructInventory(%d, %d, %d, %d)", imageTotNumb, displayNumb, (scrollFl) ? 0 : 1, firstObjId);
+
+ // Clear out icon buffer
+ memset(_vm.screen().getIconBuffer(), 0, sizeof(_vm.screen().getIconBuffer()));
+
+ // If needed, copy arrows - reduce number of icons displayable
+ if (scrollFl) { // Display at first and last icon positions
+ _vm.screen().moveImage(_vm.screen().getGUIBuffer(), 0, 0, INV_DX, INV_DY, XPIX, _vm.screen().getIconBuffer(), 0, 0, XPIX);
+ _vm.screen().moveImage(_vm.screen().getGUIBuffer(), INV_DX, 0, INV_DX, INV_DY, XPIX, _vm.screen().getIconBuffer(), INV_DX *(MAX_DISP - 1), 0, XPIX);
+ displayNumb = MIN(displayNumb, MAX_DISP - NUM_ARROWS);
+ } else // No, override first index - we can show 'em all!
+ firstObjId = 0;
+
+ // Copy inventory icons to remaining positions
+ int16 displayed = 0;
+ int16 carried = 0;
+ for (int16 i = 0; i < imageTotNumb; i++) {
+ if (_vm._objects[_vm._invent[i]].carriedFl) {
+ // Check still room to display and past first scroll index
+ if (displayed < displayNumb && carried >= firstObjId) {
+ // Compute source coordinates in dib_u
+ ux = (i + NUM_ARROWS) * INV_DX % XPIX;
+ uy = (i + NUM_ARROWS) * INV_DX / XPIX * INV_DY;
+
+ // Compute dest coordinates in dib_i
+ ix = ((scrollFl) ? displayed + 1 : displayed) * INV_DX;
+ displayed++; // Count number displayed
+
+ // Copy the icon
+ _vm.screen().moveImage(_vm.screen().getGUIBuffer(), ux, uy, INV_DX, INV_DY, XPIX, _vm.screen().getIconBuffer(), ix, 0, XPIX);
+ }
+ carried++; // Count number carried
+ }
+ }
+}
+
+// Process required action for inventory
+// Returns objId under cursor (or -1) for INV_GET
+int16 InventoryHandler::processInventory(invact_t action, ...) {
+ static int16 firstIconId = 0; // Index of first icon to display
+ int16 i, j;
+ int16 objId = -1; // Return objid under cursor
+ int16 imageNumb; // Total number of inventory items
+ int displayNumb; // Total number displayed/carried
+ int16 cursorx, cursory; // Current cursor position
+ bool scrollFl; // TRUE if scroll arrows needed
+ va_list marker; // Args used for D_ADD operation
+
+ debugC(1, kDebugInventory, "processInventory(invact_t action, ...)");
+
+ // Compute total number and number displayed, i.e. number carried
+ for (imageNumb = 0, displayNumb = 0; imageNumb < _vm._maxInvent && _vm._invent[imageNumb] != -1; imageNumb++)
+ if (_vm._objects[_vm._invent[imageNumb]].carriedFl)
+ displayNumb++;
+
+ // Will we need the scroll arrows?
+ scrollFl = displayNumb > MAX_DISP;
+
+ switch (action) {
+ case INV_INIT: // Initialize inventory display
+ constructInventory(imageNumb, displayNumb, scrollFl, firstIconId);
+ break;
+ case INV_LEFT: // Scroll left by one icon
+ firstIconId = MAX(0, firstIconId - 1);
+ constructInventory(imageNumb, displayNumb, scrollFl, firstIconId);
+ break;
+ case INV_RIGHT: // Scroll right by one icon
+ firstIconId = MIN(displayNumb, firstIconId + 1);
+ constructInventory(imageNumb, displayNumb, scrollFl, firstIconId);
+ break;
+ case INV_GET: // Return object id under cursor
+ // Get cursor position from variable argument list
+ va_start(marker, action); // Initialize variable arguments
+ cursorx = va_arg(marker, int); // Cursor x
+ cursory = va_arg(marker, int); // Cursor y
+ va_end(marker); // Reset variable arguments
+
+ cursory -= DIBOFF_Y; // Icon bar is at true zero
+ if (cursory > 0 && cursory < INV_DY) { // Within icon bar?
+ i = cursorx / INV_DX; // Compute icon index
+ if (scrollFl) { // Scroll buttons displayed
+ if (i == 0) // Left scroll button
+ objId = LEFT_ARROW;
+ else {
+ if (i == MAX_DISP - 1) // Right scroll button
+ objId = RIGHT_ARROW;
+ else // Adjust for scroll
+ i += firstIconId - 1; // i is icon index
+ }
+ }
+
+ // If not an arrow, find object id - limit to valid range
+ if (objId == -1 && i < displayNumb)
+ // Find objid by counting # carried objects == i+1
+ for (j = 0, i++; i > 0 && j < _vm._numObj; j++)
+ if (_vm._objects[j].carriedFl)
+ if (--i == 0)
+ objId = j;
+ }
+ break;
+ }
+ return objId; // For the INV_GET action
+}
+
+void InventoryHandler::runInventory() {
+ status_t &gameStatus = _vm.getGameStatus();
+
+ debugC(1, kDebugInventory, "runInventory");
+
+// Process inventory state machine
+ switch (gameStatus.inventoryState) {
+ case I_OFF: // Icon bar off screen
+ break;
+ case I_UP: // Icon bar moving up
+ gameStatus.inventoryHeight -= STEP_DY; // Move the icon bar up
+ if (gameStatus.inventoryHeight <= 0) // Limit travel
+ gameStatus.inventoryHeight = 0;
+
+ // Move visible portion to _frontBuffer, restore uncovered portion, display results
+ _vm.screen().moveImage(_vm.screen().getIconBuffer(), 0, 0, XPIX, gameStatus.inventoryHeight, XPIX, _vm.screen().getFrontBuffer(), 0, DIBOFF_Y, XPIX);
+ _vm.screen().moveImage(_vm.screen().getBackBufferBackup(), 0, gameStatus.inventoryHeight + DIBOFF_Y, XPIX, STEP_DY, XPIX, _vm.screen().getFrontBuffer(), 0, gameStatus.inventoryHeight + DIBOFF_Y, XPIX);
+ _vm.screen().displayRect(0, DIBOFF_Y, XPIX, gameStatus.inventoryHeight + STEP_DY);
+
+ if (gameStatus.inventoryHeight == 0) { // Finished moving up?
+ // Yes, restore dibs and exit back to game state machine
+ _vm.screen().moveImage(_vm.screen().getBackBufferBackup(), 0, 0, XPIX, YPIX, XPIX, _vm.screen().getBackBuffer(), 0, 0, XPIX);
+ _vm.screen().moveImage(_vm.screen().getBackBuffer(), 0, 0, XPIX, YPIX, XPIX, _vm.screen().getFrontBuffer(), 0, 0, XPIX);
+ _vm.updateImages(); // Add objects back into display list for restore
+ gameStatus.inventoryState = I_OFF;
+ gameStatus.viewState = V_PLAY;
+ }
+ break;
+ case I_DOWN: // Icon bar moving down
+ // If this is the first step, initialize dib_i
+ // and get any icon/text out of _frontBuffer
+ if (gameStatus.inventoryHeight == 0) {
+ processInventory(INV_INIT); // Initialize dib_i
+ _vm.screen().displayList(D_RESTORE); // Restore _frontBuffer
+ _vm.updateImages(); // Rebuild _frontBuffer without icons/text
+ _vm.screen().displayList(D_DISPLAY); // Blit display list to screen
+ }
+
+ gameStatus.inventoryHeight += STEP_DY; // Move the icon bar down
+ if (gameStatus.inventoryHeight >= INV_DY) // Limit travel
+ gameStatus.inventoryHeight = INV_DY;
+
+ // Move visible portion to _frontBuffer, display results
+ _vm.screen().moveImage(_vm.screen().getIconBuffer(), 0, 0, XPIX, gameStatus.inventoryHeight, XPIX, _vm.screen().getFrontBuffer(), 0, DIBOFF_Y, XPIX);
+ _vm.screen().displayRect(0, DIBOFF_Y, XPIX, gameStatus.inventoryHeight);
+
+ if (gameStatus.inventoryHeight == INV_DY) { // Finished moving down?
+ // Yes, prepare view dibs for special inventory display since
+ // we can't refresh objects while icon bar overlayed...
+ // 1. Save backing store _backBuffer in temporary dib_c
+ // 2. Make snapshot of _frontBuffer the new _backBuffer backing store
+ // 3. Reset the display list
+ _vm.screen().moveImage(_vm.screen().getBackBuffer(), 0, 0, XPIX, YPIX, XPIX, _vm.screen().getBackBufferBackup(), 0, 0, XPIX);
+ _vm.screen().moveImage(_vm.screen().getFrontBuffer(), 0, 0, XPIX, YPIX, XPIX, _vm.screen().getBackBuffer(), 0, 0, XPIX);
+ _vm.screen().displayList(D_INIT);
+ gameStatus.inventoryState = I_ACTIVE;
+ }
+ break;
+ case I_ACTIVE: // Inventory active
+ _vm.parser().charHandler(); // Still allow commands
+ _vm.screen().displayList(D_RESTORE); // Restore previous background
+ _vm.mouse().mouseHandler(); // Mouse activity - adds to display list
+ _vm.screen().displayList(D_DISPLAY); // Blit the display list to screen
+ break;
+ }
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/inventory.h b/engines/hugo/inventory.h
new file mode 100644
index 0000000000..5cc1af28c2
--- /dev/null
+++ b/engines/hugo/inventory.h
@@ -0,0 +1,56 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_INVENTORY_H
+#define HUGO_INVENTORY_H
+namespace Hugo {
+
+#define NUM_ARROWS 2 // Number of arrows (left/right)
+#define LEFT_ARROW -2 // Cursor over Left arrow in inventory icon bar
+#define RIGHT_ARROW -3 // Cursor over Right arrow in inventory icon bar
+
+class InventoryHandler {
+public:
+ InventoryHandler(HugoEngine &vm);
+
+ int16 processInventory(invact_t action, ...);
+ void runInventory();
+
+private:
+ HugoEngine &_vm;
+
+ void constructInventory(int16 imageTotNumb, int displayNumb, bool scrollFl, int16 firstObjId);
+};
+
+} // End of namespace Hugo
+
+#endif // HUGO_INVENTORY_H
diff --git a/engines/hugo/module.mk b/engines/hugo/module.mk
new file mode 100644
index 0000000000..f7aa45a2c2
--- /dev/null
+++ b/engines/hugo/module.mk
@@ -0,0 +1,24 @@
+MODULE := engines/hugo
+
+MODULE_OBJS := \
+ detection.o \
+ display.o \
+ engine.o \
+ file.o \
+ hugo.o \
+ intro.o \
+ inventory.o \
+ mouse.o \
+ parser.o \
+ route.o \
+ schedule.o \
+ sound.o \
+ util.o
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_HUGO), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/engines/hugo/mouse.cpp b/engines/hugo/mouse.cpp
new file mode 100644
index 0000000000..a3f695b92a
--- /dev/null
+++ b/engines/hugo/mouse.cpp
@@ -0,0 +1,311 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+// mouse.cpp : Handle all mouse activity
+
+#include "common/system.h"
+
+#include "hugo/game.h"
+#include "hugo/hugo.h"
+#include "hugo/mouse.h"
+#include "hugo/global.h"
+#include "hugo/schedule.h"
+#include "hugo/display.h"
+#include "hugo/inventory.h"
+#include "hugo/route.h"
+#include "hugo/util.h"
+
+namespace Hugo {
+
+#define EXIT_HOTSPOT -4 // Cursor over Exit hotspot
+#define CURSOR_NAME 2 // Index of name used under cursor
+#define CURSOR_NOCHAR '~' // Don't show name of object under cursor
+#define SX_OFF 10 // Cursor offset to name string
+#define SY_OFF -2 // Cursor offset to name string
+#define IX_OFF 8 // Cursor to icon image (dib coords)
+#define IY_OFF 10 // Cursor to icon image (dib coords)
+
+enum seqTextMouse {
+ kMsNoWayText = 0,
+ kMsExit = 1
+};
+
+MouseHandler::MouseHandler(HugoEngine &vm) : _vm(vm) {
+}
+
+// Shadow-blit supplied string into dib_a at cx,cy and add to display list
+void MouseHandler::cursorText(char *buffer, int16 cx, int16 cy, uif_t fontId, int16 color) {
+
+ debugC(1, kDebugMouse, "cursorText(%s, %d, %d, %d, %d)", buffer, cx, cy, fontId, color);
+
+ if (_vm.getPlatform() == Common::kPlatformWindows)
+ _vm.screen().loadFont(fontId);
+
+ // Find bounding rect for string
+ int16 sdx = _vm.screen().stringLength(buffer);
+ int16 sdy = _vm.screen().fontHeight() + 1; // + 1 for shadow
+ int16 sx = (cx < XPIX / 2) ? cx + SX_OFF : cx - sdx - SX_OFF / 2;
+ int16 sy = cy + SY_OFF;
+
+ // Display the string and add rect to display list
+ _vm.screen().shadowStr(sx, sy, buffer, _TBRIGHTWHITE);
+ _vm.screen().displayList(D_ADD, sx, sy, sdx, sdy);
+}
+
+
+// Find the exit hotspot containing cx, cy.
+// Return hotspot index or -1 if not found.
+int16 MouseHandler::findExit(int16 cx, int16 cy) {
+ int i;
+ hotspot_t *hotspot;
+
+ debugC(2, kDebugMouse, "findExit(%d, %d)", cx, cy);
+
+ for (i = 0, hotspot = _vm._hotspots; hotspot->screenIndex >= 0; i++, hotspot++)
+ if (hotspot->screenIndex == *_vm._screen_p)
+ if (cx >= hotspot->x1 && cx <= hotspot->x2 && cy >= hotspot->y1 && cy <= hotspot->y2)
+ return(i);
+ return(-1);
+}
+
+// Process a mouse right click at coord cx, cy over object objid
+void MouseHandler::processRightClick(int16 objId, int16 cx, int16 cy) {
+ object_t *obj;
+ int16 x, y;
+ bool foundFl = false; // TRUE if route found to object
+
+ debugC(1, kDebugMouse, "Process_rclick(%d, %d, %d)", objId, cx, cy);
+
+ status_t &gameStatus = _vm.getGameStatus();
+
+ if (gameStatus.storyModeFl || _vm._hero->pathType == QUIET) // Make sure user has control
+ return;
+
+ // Check if this was over iconbar
+ if (gameStatus.inventoryState == I_ACTIVE && cy < INV_DY + DIBOFF_Y) { // Clicked over iconbar object
+ if (gameStatus.inventoryObjId == -1)
+ gameStatus.inventoryObjId = objId; // Not using so select new object
+ else if (gameStatus.inventoryObjId == objId)
+ gameStatus.inventoryObjId = -1; // Same icon - deselect it
+ else
+ _vm.useObject(objId); // Use status.objid on object
+ } else { // Clicked over viewport object
+ obj = &_vm._objects[objId];
+ switch (obj->viewx) { // Where to walk to
+ case -1: // Walk to object position
+ if (_vm.findObjectSpace(obj, &x, &y))
+ foundFl = _vm.route().startRoute(GO_GET, objId, x, y);
+ if (!foundFl) // Can't get there, try to use from here
+ _vm.useObject(objId);
+ break;
+ case 0: // Immediate use
+ _vm.useObject(objId); // Pick up or use object
+ break;
+ default: // Walk to view point if possible
+ if (!_vm.route().startRoute(GO_GET, objId, obj->viewx, obj->viewy)) {
+ if (_vm._hero->cycling == INVISIBLE) // If invisible do
+ _vm.useObject(objId); // immediate use
+ else
+ Utils::Box(BOX_ANY, "%s", _vm._textMouse[kMsNoWayText]); // Can't get there
+ }
+ break;
+ }
+ }
+}
+
+// Process a left mouse click over:
+// 1. An icon - show description
+// 2. An object - walk to and show description
+// 3. An icon scroll arrow - scroll the iconbar
+// 4. Nothing - attempt to walk there
+// 5. Exit - walk to exit hotspot
+void MouseHandler::processLeftClick(int16 objId, int16 cx, int16 cy) {
+ int16 i, x, y;
+ object_t *obj;
+ bool foundFl = false; // TRUE if route found to object
+
+ debugC(1, kDebugMouse, "Process_lclick(%d, %d, %d)", objId, cx, cy);
+
+ status_t &gameStatus = _vm.getGameStatus();
+
+ if (gameStatus.storyModeFl || _vm._hero->pathType == QUIET) // Make sure user has control
+ return;
+
+ switch (objId) {
+ case -1: // Empty space - attempt to walk there
+ _vm.route().startRoute(GO_SPACE, 0, cx, cy);
+ break;
+ case LEFT_ARROW: // A scroll arrow - scroll the iconbar
+ case RIGHT_ARROW:
+ // Scroll the iconbar and display results
+ _vm.inventory().processInventory((objId == LEFT_ARROW) ? INV_LEFT : INV_RIGHT);
+ _vm.screen().moveImage(_vm.screen().getIconBuffer(), 0, 0, XPIX, INV_DY, XPIX, _vm.screen().getFrontBuffer(), 0, DIBOFF_Y, XPIX);
+ _vm.screen().moveImage(_vm.screen().getIconBuffer(), 0, 0, XPIX, INV_DY, XPIX, _vm.screen().getBackBuffer(), 0, DIBOFF_Y, XPIX);
+ _vm.screen().displayList(D_ADD, 0, DIBOFF_Y, XPIX, INV_DY);
+ break;
+ case EXIT_HOTSPOT: // Walk to exit hotspot
+ i = findExit(cx, cy);
+ x = _vm._hotspots[i].viewx;
+ y = _vm._hotspots[i].viewy;
+ if (x >= 0) { // Hotspot refers to an exit
+ // Special case of immediate exit
+ if (gameStatus.jumpExitFl) {
+ // Get rid of iconbar if necessary
+ if (gameStatus.inventoryState != I_OFF)
+ gameStatus.inventoryState = I_UP;
+ _vm.scheduler().insertActionList(_vm._hotspots[i].actIndex);
+ } else { // Set up route to exit spot
+ if (_vm._hotspots[i].direction == Common::KEYCODE_RIGHT)
+ x -= HERO_MAX_WIDTH;
+ else if (_vm._hotspots[i].direction == Common::KEYCODE_LEFT)
+ x += HERO_MAX_WIDTH;
+ if (!_vm.route().startRoute(GO_EXIT, i, x, y))
+ Utils::Box(BOX_ANY, "%s", _vm._textMouse[kMsNoWayText]); // Can't get there
+ }
+
+ // Get rid of any attached icon
+ gameStatus.inventoryObjId = -1;
+ }
+ break;
+ default: // Look at an icon or object
+ obj = &_vm._objects[objId];
+
+ // Over iconbar - immediate description
+ if (gameStatus.inventoryState == I_ACTIVE && cy < INV_DY + DIBOFF_Y)
+ _vm.lookObject(obj);
+ else {
+ switch (obj->viewx) { // Clicked over viewport object
+ case -1: // Walk to object position
+ if (_vm.findObjectSpace(obj, &x, &y))
+ foundFl = _vm.route().startRoute(GO_LOOK, objId, x, y);
+ if (!foundFl) // Can't get there, immediate description
+ _vm.lookObject(obj);
+ break;
+ case 0: // Immediate description
+ _vm.lookObject(obj);
+ break;
+ default: // Walk to view point if possible
+ if (!_vm.route().startRoute(GO_LOOK, objId, obj->viewx, obj->viewy)) {
+ if (_vm._hero->cycling == INVISIBLE) // If invisible do
+ _vm.lookObject(obj); // immediate decription
+ else
+ Utils::Box(BOX_ANY, "%s", _vm._textMouse[kMsNoWayText]); // Can't get there
+ }
+ break;
+ }
+ }
+ break;
+ }
+}
+
+// Process mouse activity
+void MouseHandler::mouseHandler() {
+ int16 iconId; // Find index of dragged icon
+ int iconx, icony; // Icon position (in dib_a)
+ int16 ux, uy; // Icon position (in dib_u)
+ int16 objId = -1; // Current source object
+ char *name; // Name of object to display
+
+ debugC(2, kDebugMouse, "mouseHandler");
+
+ int16 cx = _vm.getMouseX();
+ int16 cy = _vm.getMouseY();
+
+ status_t &gameStatus = _vm.getGameStatus();
+
+ gameStatus.cx = cx; // Save cursor coords
+ gameStatus.cy = cy;
+
+ // Don't process if outside client area
+ if (cx < 0 || cx > XPIX || cy < DIBOFF_Y || cy > VIEW_DY + DIBOFF_Y)
+ return;
+
+ // Display dragged inventory icon if one currently selected
+ if (gameStatus.inventoryObjId != -1) {
+ // Find index of icon
+ for (iconId = 0; iconId < _vm._maxInvent; iconId++)
+ if (gameStatus.inventoryObjId == _vm._invent[iconId])
+ break;
+
+ // Compute source coordinates in dib_u
+ ux = (iconId + NUM_ARROWS) * INV_DX % XPIX;
+ uy = (iconId + NUM_ARROWS) * INV_DX / XPIX * INV_DY;
+
+ // Compute destination coordinates in dib_a
+ iconx = cx + IX_OFF;
+ icony = cy + IY_OFF;
+ iconx = MAX(iconx, 0); // Keep within dib_a bounds
+ iconx = MIN(iconx, XPIX - INV_DX);
+ icony = MAX(icony, 0);
+ icony = MIN(icony, YPIX - INV_DY);
+
+ // Copy the icon and add to display list
+ _vm.screen().moveImage(_vm.screen().getGUIBuffer(), ux, uy, INV_DX, INV_DY, XPIX, _vm.screen().getFrontBuffer(), iconx, icony, XPIX);
+ _vm.screen().displayList(D_ADD, iconx, icony, INV_DX, INV_DY);
+ }
+
+ // Process cursor over an object or icon
+ if (gameStatus.inventoryState == I_ACTIVE) // Check inventory icon bar first
+ objId = _vm.inventory().processInventory(INV_GET, cx, cy);
+ if (objId == -1) // No match, check rest of view
+ objId = _vm.findObject(cx, cy);
+ if (objId >= 0) { // Got a match
+ // Display object name next to cursor (unless CURSOR_NOCHAR)
+ // Note test for swapped hero name
+ name = _vm._arrayNouns[_vm._objects[(objId == HERO) ? _vm._heroImage : objId].nounIndex][CURSOR_NAME];
+ if (name[0] != CURSOR_NOCHAR)
+ cursorText(name, cx, cy, U_FONT8, _TBRIGHTWHITE);
+
+ // Process right click over object in view or iconbar
+ if (gameStatus.rightButtonFl)
+ processRightClick(objId, cx, cy);
+ }
+
+ // Process cursor over an exit hotspot
+ if (objId == -1) {
+ int i = findExit(cx, cy);
+ if (i != -1 && _vm._hotspots[i].viewx >= 0) {
+ objId = EXIT_HOTSPOT;
+ cursorText(_vm._textMouse[kMsExit], cx, cy, U_FONT8, _TBRIGHTWHITE);
+ }
+ }
+
+ // Left click over icon, object or to move somewhere
+ if (gameStatus.leftButtonFl)
+ processLeftClick(objId, cx, cy);
+
+ // Clear mouse click states
+ gameStatus.leftButtonFl = false;
+ gameStatus.rightButtonFl = false;
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/mouse.h b/engines/hugo/mouse.h
new file mode 100644
index 0000000000..3ac5f19f32
--- /dev/null
+++ b/engines/hugo/mouse.h
@@ -0,0 +1,54 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_MOUSE_H
+#define HUGO_MOUSE_H
+namespace Hugo {
+
+class MouseHandler {
+public:
+ MouseHandler(HugoEngine &vm);
+
+ void mouseHandler();
+
+private:
+ HugoEngine &_vm;
+
+ void cursorText(char *buffer, int16 cx, int16 cy, uif_t fontId, int16 color);
+ int16 findExit(int16 cx, int16 cy);
+ void processRightClick(int16 objId, int16 cx, int16 cy);
+ void processLeftClick(int16 objId, int16 cx, int16 cy);
+};
+
+} // End of namespace Hugo
+
+#endif //HUGO_MOUSE_H
diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp
new file mode 100644
index 0000000000..33fd0ddfef
--- /dev/null
+++ b/engines/hugo/parser.cpp
@@ -0,0 +1,720 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+// parser.c - handles all keyboard/command input
+
+#include "common/system.h"
+#include "common/keyboard.h"
+
+#include "hugo/game.h"
+#include "hugo/hugo.h"
+#include "hugo/parser.h"
+#include "hugo/global.h"
+#include "hugo/file.h"
+#include "hugo/schedule.h"
+#include "hugo/display.h"
+#include "hugo/route.h"
+#include "hugo/util.h"
+#include "hugo/sound.h"
+
+namespace Hugo {
+
+#define BLINKS 2 // Cursor blinks per second
+#define CX(X) LOWORD(X)
+#define CY(Y) HIWORD(Y)
+
+Parser::Parser(HugoEngine &vm) :
+ _vm(vm), _putIndex(0), _getIndex(0), _checkDoubleF1Fl(false) {
+}
+
+void Parser::keyHandler(uint16 nChar, uint16 nFlags) {
+ status_t &gameStatus = _vm.getGameStatus();
+ bool repeatedFl = (nFlags & 0x4000); // TRUE if key is a repeat
+
+ debugC(1, kDebugParser, "keyHandler(%d, %d)", nChar, nFlags);
+
+// Process key down event - called from OnKeyDown()
+ switch (nChar) { // Set various toggle states
+ case Common::KEYCODE_ESCAPE: // Escape key, may want to QUIT
+ if (gameStatus.inventoryState == I_ACTIVE) // Remove inventory, if displayed
+ gameStatus.inventoryState = I_UP;
+ gameStatus.inventoryObjId = -1; // Deselect any dragged icon
+ break;
+ case Common::KEYCODE_END:
+ case Common::KEYCODE_HOME:
+ case Common::KEYCODE_LEFT:
+ case Common::KEYCODE_RIGHT:
+ case Common::KEYCODE_UP:
+ case Common::KEYCODE_DOWN:
+ if (!repeatedFl) {
+ gameStatus.routeIndex = -1; // Stop any automatic route
+ _vm.route().setWalk(nChar); // Direction of hero travel
+ }
+ break;
+ case Common::KEYCODE_F1: // User Help (DOS)
+ if (_checkDoubleF1Fl)
+ _vm.file().instructions();
+ else
+ _vm.screen().userHelp();
+ _checkDoubleF1Fl = !_checkDoubleF1Fl;
+ break;
+ case Common::KEYCODE_F6: // Inventory
+ showDosInventory();
+ break;
+ case Common::KEYCODE_F8: // Turbo mode
+ _config.turboFl = !_config.turboFl;
+ break;
+ case Common::KEYCODE_F2: // Toggle sound
+ _vm.sound().toggleSound();
+ _vm.sound().toggleMusic();
+ break;
+ case Common::KEYCODE_F3: // Repeat last line
+ case Common::KEYCODE_F4: // Save game
+ case Common::KEYCODE_F5: // Restore game
+ case Common::KEYCODE_F9: // Boss button
+ warning("STUB: KeyHandler() - F3-F9 (DOS)");
+ break;
+ default: // Any other key
+ if (!gameStatus.storyModeFl) { // Keyboard disabled
+ // Add printable keys to ring buffer
+
+ uint16 bnext = _putIndex + 1;
+ if (bnext >= sizeof(_ringBuffer))
+ bnext = 0;
+ if (bnext != _getIndex) {
+ _ringBuffer[_putIndex] = nChar;
+ _putIndex = bnext;
+ }
+ }
+ break;
+ }
+ if (_checkDoubleF1Fl && (nChar != Common::KEYCODE_F1))
+ _checkDoubleF1Fl = false;
+}
+
+// Add any new chars to line buffer and display them.
+// If CR pressed, pass line to Line_handler()
+void Parser::charHandler() {
+ static int16 lineIndex = 0; // Index into line
+ static uint32 tick = 0; // For flashing cursor
+ static char cursor = '_';
+ char c;
+ static command_t cmdLine; // Build command line
+ status_t &gameStatus = _vm.getGameStatus();
+// Strangerke : Useless ?
+// bool updateFl = (_getIndex != _putIndex); // TRUE if any chars processed
+// command_t status_line; // Includes prompt, cursor
+
+ debugC(4, kDebugParser, "charHandler");
+
+ // Check for one or more characters in ring buffer
+ while (_getIndex != _putIndex) {
+ c = _ringBuffer[_getIndex++];
+ if (_getIndex >= sizeof(_ringBuffer))
+ _getIndex = 0;
+
+ switch (c) {
+ case Common::KEYCODE_BACKSPACE: // Rubout key
+ if (lineIndex)
+ cmdLine[--lineIndex] = '\0';
+ break;
+ case Common::KEYCODE_RETURN: // EOL, pass line to line handler
+ if (lineIndex && (_vm._hero->pathType != QUIET)) {
+ // Remove inventory bar if active
+ if (gameStatus.inventoryState == I_ACTIVE)
+ gameStatus.inventoryState = I_UP;
+ // Call Line handler and reset line
+ command(cmdLine);
+ cmdLine[lineIndex = 0] = '\0';
+ }
+ break;
+ default: // Normal text key, add to line
+ if (lineIndex >= MAX_CHARS) {
+ //MessageBeep(MB_ICONASTERISK);
+ warning("STUB: MessageBeep(MB_ICONASTERISK);");
+ } else if (isprint(c)) {
+ cmdLine[lineIndex++] = c;
+ cmdLine[lineIndex] = '\0';
+ }
+ break;
+ }
+ }
+
+ // See if time to blink cursor, set cursor character
+ if ((tick++ % (TPS / BLINKS)) == 0) {
+// Strangerke : Useless ?
+// updateFl = true; // Force an update
+ cursor = (cursor == '_') ? ' ' : '_';
+ }
+
+ // See if recall button pressed
+ if (gameStatus.recallFl) {
+ // Copy previous line to current cmdline
+ gameStatus.recallFl = false;
+ strcpy(cmdLine, _line);
+ lineIndex = strlen(cmdLine);
+ }
+
+ sprintf(_statusLine, ">%s%c", cmdLine, cursor);
+ sprintf(_scoreLine, "F1-Help %s Score: %d of %d Sound %s", (_config.turboFl) ? "T" : " ", _vm.getScore(), _vm.getMaxScore(), (_config.soundFl) ? "On" : "Off");
+
+ // See if "look" button pressed
+ if (gameStatus.lookFl) {
+ command("look around");
+ gameStatus.lookFl = false;
+ }
+}
+
+void Parser::drawStatusText() {
+ debugC(4, kDebugParser, "drawStatusText");
+
+ if (_vm.getPlatform() == Common::kPlatformWindows)
+ _vm.screen().loadFont(U_FONT8);
+ uint16 sdx = _vm.screen().stringLength(_statusLine);
+ uint16 sdy = _vm.screen().fontHeight() + 1; // + 1 for shadow
+ uint16 posX = 0;
+ uint16 posY = YPIX - sdy;
+ // Display the string and add rect to display list
+ _vm.screen().writeStr(posX, posY, _statusLine, _TLIGHTYELLOW);
+ _vm.screen().displayList(D_ADD, posX, posY, sdx, sdy);
+
+ sdx = _vm.screen().stringLength(_scoreLine);
+ posY = 0;
+ _vm.screen().writeStr(posX, posY, _scoreLine, _TCYAN);
+ _vm.screen().displayList(D_ADD, posX, posY, sdx, sdy);
+}
+
+// Perform an immediate command. Takes parameters a la sprintf
+// Assumes final string will not overrun line[] length
+void Parser::command(const char *format, ...) {
+ va_list marker;
+
+ debugC(1, kDebugParser, "Command(%s, ...)", format);
+
+ va_start(marker, format);
+ vsprintf(_line, format, marker);
+ va_end(marker);
+
+ lineHandler();
+}
+
+char *Parser::strlwr(char *buffer) {
+ char *result = buffer;
+
+ debugC(1, kDebugParser, "strlwr(%s)", buffer);
+
+ while (*buffer != '\0') {
+ if (isupper(*buffer))
+ *buffer = tolower(*buffer);
+ buffer++;
+ }
+
+ return result;
+}
+
+// Parse the user's line of text input. Generate events as necessary
+void Parser::lineHandler() {
+ char *noun, *verb; // ptrs to noun and verb strings
+// int i;
+ object_t *obj;
+ char farComment[XBYTES * 5] = ""; // hold 5 line comment if object not nearby
+ char contextComment[XBYTES * 5] = ""; // Unused comment for context objects
+ status_t &gameStatus = _vm.getGameStatus();
+
+
+ debugC(1, kDebugParser, "lineHandler");
+
+ // Toggle God Mode
+ if (!strncmp(_line, "PPG", 3)) {
+ _vm.sound().playSound(!_vm._soundTest, BOTH_CHANNELS, HIGH_PRI);
+ gameStatus.godModeFl ^= 1;
+ return;
+ }
+
+ strlwr(_line); // Convert to lower case
+
+ // God Mode cheat commands:
+ // goto <screen> Takes hero to named screen
+ // fetch <object name> Hero carries named object
+ // fetch all Hero carries all possible objects
+ // find <object name> Takes hero to screen containing named object
+ if (DEBUG || gameStatus.godModeFl) {
+ // Special code to allow me to go straight to any screen
+ if (strstr(_line, "goto"))
+ for (int i = 0; i < _vm._numScreens; i++)
+ if (!strcmp(&_line[strlen("goto") + 1], _vm._screenNames[i])) {
+ _vm.scheduler().newScreen(i);
+ return;
+ }
+
+ // Special code to allow me to get objects from anywhere
+ if (strstr(_line, "fetch all")) {
+ for (int i = 0; i < _vm._numObj; i++)
+ if (_vm._objects[i].genericCmd & TAKE)
+ takeObject(&_vm._objects[i]);
+ return;
+ }
+
+ if (strstr(_line, "fetch")) {
+ for (int i = 0; i < _vm._numObj; i++)
+ if (!strcmp(&_line[strlen("fetch") + 1], _vm._arrayNouns[_vm._objects[i].nounIndex][0])) {
+ takeObject(&_vm._objects[i]);
+ return;
+ }
+ }
+
+ // Special code to allow me to goto objects
+ if (strstr(_line, "find"))
+ for (int i = 0; i < _vm._numObj; i++)
+ if (!strcmp(&_line[strlen("find") + 1], _vm._arrayNouns[_vm._objects[i].nounIndex][0])) {
+ _vm.scheduler().newScreen(_vm._objects[i].screenIndex);
+ return;
+ }
+ }
+
+ // Special meta commands
+ // EXIT/QUIT
+ if (!strcmp("exit", _line) || strstr(_line, "quit")) {
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBExit]);
+ return;
+ }
+
+ // SAVE/RESTORE
+ if (!strcmp("save", _line) && gameStatus.viewState == V_PLAY) {
+ _vm.file().saveGame(gameStatus.saveSlot, "Current game");
+ return;
+ }
+
+ if (!strcmp("restore", _line) && (gameStatus.viewState == V_PLAY || gameStatus.viewState == V_IDLE)) {
+ _vm.file().restoreGame(gameStatus.saveSlot);
+ _vm.scheduler().restoreScreen(*_vm._screen_p);
+ gameStatus.viewState = V_PLAY;
+ return;
+ }
+
+ // Empty line
+ if (*_line == '\0') // Empty line
+ return;
+ if (strspn(_line, " ") == strlen(_line)) // Nothing but spaces!
+ return;
+
+ if (gameStatus.gameOverFl) {
+ // No commands allowed!
+ Utils::gameOverMsg();
+ return;
+ }
+
+ // Test for nearby objects referenced explicitly
+ for (int i = 0; i < _vm._numObj; i++) {
+ obj = &_vm._objects[i];
+ if (isWordPresent(_vm._arrayNouns[obj->nounIndex]))
+ if (isObjectVerb(obj, _line, farComment) || isGenericVerb(obj, _line, farComment))
+ return;
+ }
+
+ // Test for nearby objects that only require a verb
+ // Note comment is unused if not near.
+ for (int i = 0; i < _vm._numObj; i++) {
+ obj = &_vm._objects[i];
+ if (obj->verbOnlyFl)
+ if (isObjectVerb(obj, _line, contextComment) || isGenericVerb(obj, _line, contextComment))
+ return;
+ }
+
+ // No objects match command line, try background and catchall commands
+ if (isBackgroundWord(_vm._backgroundObjects[*_vm._screen_p], _line))
+ return;
+ if (isCatchallVerb(_vm._backgroundObjects[*_vm._screen_p], _line))
+ return;
+ if (isBackgroundWord(_vm._catchallList, _line))
+ return;
+ if (isCatchallVerb(_vm._catchallList, _line))
+ return;
+
+ // If a not-near comment was generated, print it
+ if (*farComment != '\0') {
+ Utils::Box(BOX_ANY, "%s", farComment);
+ return;
+ }
+
+ // Nothing matches. Report recognition success to user.
+ verb = findVerb(_line);
+ noun = findNoun(_line);
+ if (verb == _vm._arrayVerbs[_vm._look][0] && _maze.enabledFl) {
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBMaze]);
+ showTakeables();
+ } else if (verb && noun) // A combination I didn't think of
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBNoPoint]);
+ else if (noun)
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBNoun]);
+ else if (verb)
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBVerb]);
+ else
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBEh]);
+}
+
+// Search for matching verb/noun pairs in background command list
+// Print text for possible background object. Return TRUE if match found
+bool Parser::isBackgroundWord(objectList_t obj, char *line) {
+ debugC(1, kDebugParser, "isBackgroundWord(object_list_t obj, %s)", line);
+
+ for (int i = 0; obj[i].verbIndex != 0; i++)
+ if (isWordPresent(_vm._arrayVerbs[obj[i].verbIndex]) &&
+ isWordPresent(_vm._arrayNouns[obj[i].nounIndex]) &&
+ ((obj[i].roomState == DONT_CARE) ||
+ (obj[i].roomState == _vm._screenStates[*_vm._screen_p]))) {
+ Utils::Box(BOX_ANY, "%s", _vm.file().fetchString(obj[i].commentIndex));
+ _vm.scheduler().processBonus(obj[i].bonusIndex);
+ return true;
+ }
+ return false;
+}
+
+// Search for matching verbs in background command list.
+// Noun is not required. Return TRUE if match found
+// Note that if the background command list has match set TRUE then do not
+// print text if there are any recognizable nouns in the command line
+bool Parser::isCatchallVerb(objectList_t obj, char *line) {
+ debugC(1, kDebugParser, "isCatchallVerb(object_list_t obj, %s)", line);
+
+ for (int i = 0; obj[i].verbIndex != 0; i++)
+ if (isWordPresent(_vm._arrayVerbs[obj[i].verbIndex]) && obj[i].nounIndex == 0 &&
+ (!obj[i].matchFl || !findNoun(line)) &&
+ ((obj[i].roomState == DONT_CARE) ||
+ (obj[i].roomState == _vm._screenStates[*_vm._screen_p]))) {
+ Utils::Box(BOX_ANY, "%s", _vm.file().fetchString(obj[i].commentIndex));
+ _vm.scheduler().processBonus(obj[i].bonusIndex);
+
+ // If this is LOOK (without a noun), show any takeable objects
+ if (*(_vm._arrayVerbs[obj[i].verbIndex]) == _vm._arrayVerbs[_vm._look][0])
+ showTakeables();
+
+ return(true);
+ }
+ return false;
+}
+
+// Test whether hero is close to object. Return TRUE or FALSE
+// If object not near, return suitable comment; may be another object close
+// If radius is -1, treat radius as infinity
+// Verb is included to determine correct comment if not near
+bool Parser::isNear(object_t *obj, char *verb, char *comment) {
+ debugC(1, kDebugParser, "isNear(object_t *obj, %s, %s)", verb, comment);
+
+ if (obj->carriedFl) // Object is being carried
+ return(true);
+
+ if (obj->screenIndex != *_vm._screen_p) {
+ // Not in same screen
+ if (obj->objValue)
+ strcpy(comment, _vm._textParser[kCmtAny1]);
+ else
+ strcpy(comment, _vm._textParser[kCmtAny2]);
+ return(false);
+ }
+
+ if (obj->cycling == INVISIBLE) {
+ if (obj->seqNumb) {
+ // There is an image
+ strcpy(comment, _vm._textParser[kCmtAny3]);
+ return(false);
+ } else
+ // No image, assume visible
+ if ((obj->radius < 0) ||
+ ((abs(obj->x - _vm._hero->x) <= obj->radius) &&
+ (abs(obj->y - _vm._hero->y - _vm._hero->currImagePtr->y2) <= obj->radius)))
+ return(true);
+ else {
+ // User is not close enough
+ if (obj->objValue && (verb != _vm._arrayVerbs[_vm._take][0]))
+ strcpy(comment, _vm._textParser[kCmtAny1]);
+ else
+ strcpy(comment, _vm._textParser[kCmtClose]);
+ return(false);
+ }
+ }
+
+ if ((obj->radius < 0) ||
+ ((abs(obj->x - _vm._hero->x) <= obj->radius) &&
+ (abs(obj->y + obj->currImagePtr->y2 - _vm._hero->y - _vm._hero->currImagePtr->y2) <= obj->radius)))
+ return(true);
+ else {
+ // User is not close enough
+ if (obj->objValue && (verb != _vm._arrayVerbs[_vm._take][0]))
+ strcpy(comment, _vm._textParser[kCmtAny1]);
+ else
+ strcpy(comment, _vm._textParser[kCmtClose]);
+ return(false);
+ }
+ return true;
+}
+
+// Locate any member of object name list appearing in command line
+bool Parser::isWordPresent(char **wordArr) {
+ debugC(1, kDebugParser, "isWordPresent(%s)", wordArr[0]);
+
+ if (wordArr != NULL) {
+ for (int i = 0; strlen(wordArr[i]); i++)
+ if (strstr(_line, wordArr[i]))
+ return(true);
+ }
+
+ return false;
+}
+
+// Locate word in list of nouns and return ptr to first string in noun list
+char *Parser::findNoun(char *line) {
+ debugC(1, kDebugParser, "findNoun(%s)", line);
+
+ for (int i = 0; _vm._arrayNouns[i]; i++)
+ for (int j = 0; strlen(_vm._arrayNouns[i][j]); j++)
+ if (strstr(line, _vm._arrayNouns[i][j]))
+ return(_vm._arrayNouns[i][0]);
+ return NULL;
+}
+
+// Locate word in list of verbs and return ptr to first string in verb list
+char *Parser::findVerb(char *line) {
+ debugC(1, kDebugParser, "findVerb(%s)", line);
+
+ for (int i = 0; _vm._arrayVerbs[i]; i++)
+ for (int j = 0; strlen(_vm._arrayVerbs[i][j]); j++)
+ if (strstr(line, _vm._arrayVerbs[i][j]))
+ return(_vm._arrayVerbs[i][0]);
+ return NULL;
+}
+
+// Describe any takeable objects visible in this screen
+void Parser::showTakeables() {
+ object_t *obj;
+
+ debugC(1, kDebugParser, "showTakeables");
+
+ for (int j = 0; j < _vm._numObj; j++) {
+ obj = &_vm._objects[j];
+ if ((obj->cycling != INVISIBLE) &&
+ (obj->screenIndex == *_vm._screen_p) &&
+ (((TAKE & obj->genericCmd) == TAKE) || obj->objValue)) {
+// sprintf(_textBoxBuffer, "You can also see:\n%s.", _vm._arrayNouns[obj->nounIndex][LOOK_NAME]);
+ Utils::Box(BOX_ANY, "You can also see:\n%s.", _vm._arrayNouns[obj->nounIndex][LOOK_NAME]);
+ }
+ }
+}
+
+// Do all things necessary to carry an object
+void Parser::takeObject(object_t *obj) {
+ debugC(1, kDebugParser, "takeObject(object_t *obj)");
+
+ obj->carriedFl = true;
+ if (obj->seqNumb) { // Don't change if no image to display
+ obj->cycling = INVISIBLE;
+ if (_vm.getPlatform() != Common::kPlatformWindows)
+ warning("takeObject : DOS version should use ALMOST_INVISIBLE");
+ }
+ _vm.adjustScore(obj->objValue);
+
+ if (obj->seqNumb > 0) // If object has an image, force walk to dropped
+ obj->viewx = -1; // (possibly moved) object next time taken!
+ Utils::Box(BOX_ANY, TAKE_TEXT, _vm._arrayNouns[obj->nounIndex][TAKE_NAME]);
+}
+
+// Do all necessary things to drop an object
+void Parser::dropObject(object_t *obj) {
+ debugC(1, kDebugParser, "dropObject(object_t *obj)");
+
+ obj->carriedFl = false;
+ obj->screenIndex = *_vm._screen_p;
+ if ((obj->seqNumb > 1) || (obj->seqList[0].imageNbr > 1))
+ obj->cycling = CYCLE_FORWARD;
+ else
+ obj->cycling = NOT_CYCLING;
+ obj->x = _vm._hero->x - 1;
+ obj->y = _vm._hero->y + _vm._hero->currImagePtr->y2 - 1;
+ obj->y = (obj->y + obj->currImagePtr->y2 < YPIX) ? obj->y : YPIX - obj->currImagePtr->y2 - 10;
+ _vm.adjustScore(-obj->objValue);
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBOk]);
+}
+
+// Test whether command line contains one of the generic actions
+bool Parser::isGenericVerb(object_t *obj, char *line, char *comment) {
+ debugC(1, kDebugParser, "isGenericVerb(object_t *obj, %s, %s)", line, comment);
+
+ if (!obj->genericCmd)
+ return false;
+
+ // Following is equivalent to switch, but couldn't do one
+ if (isWordPresent(_vm._arrayVerbs[_vm._look]) && isNear(obj, _vm._arrayVerbs[_vm._look][0], comment)) {
+ // Test state-dependent look before general look
+ if ((obj->genericCmd & LOOK_S) == LOOK_S) {
+ Utils::Box(BOX_ANY, "%s", _vm._textData[obj->stateDataIndex[obj->state]]);
+ warning("isGenericVerb: use of state dependant look - To be validated");
+ } else {
+ if ((LOOK & obj->genericCmd) == LOOK)
+ if (_vm._textData[obj->dataIndex])
+ Utils::Box(BOX_ANY, "%s", _vm._textData[obj->dataIndex]);
+ else
+ return(false);
+ else
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBUnusual]);
+ }
+ } else if (isWordPresent(_vm._arrayVerbs[_vm._take]) && isNear(obj, _vm._arrayVerbs[_vm._take][0], comment)) {
+ if (obj->carriedFl)
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBHave]);
+ else if ((TAKE & obj->genericCmd) == TAKE)
+ takeObject(obj);
+ else if (obj->cmdIndex != 0) // No comment if possible commands
+ return false;
+ else if (!obj->verbOnlyFl && (TAKE & obj->genericCmd) == TAKE) // Make sure not taking object in context!
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBNoUse]);
+ else
+ return false;
+ } else if (isWordPresent(_vm._arrayVerbs[_vm._drop])) {
+ if (!obj->carriedFl && ((DROP & obj->genericCmd) == DROP))
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBDontHave]);
+ else if (obj->carriedFl && ((DROP & obj->genericCmd) == DROP))
+ dropObject(obj);
+ else if (obj->cmdIndex == 0)
+ Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBNeed]);
+ else
+ return false;
+ } else // It was not a generic cmd
+ return false;
+
+ return true;
+}
+
+// Return TRUE if object being carried by hero
+bool Parser::isCarrying(uint16 wordIndex) {
+ debugC(1, kDebugParser, "isCarrying(%d)", wordIndex);
+
+ for (int i = 0; i < _vm._numObj; i++)
+ if ((wordIndex == _vm._objects[i].nounIndex) && _vm._objects[i].carriedFl)
+ return true;
+ return false;
+}
+
+// Test whether command line contains a verb allowed by this object.
+// If it does, and the object is near and passes the tests in the command
+// list then carry out the actions in the action list and return TRUE
+bool Parser::isObjectVerb(object_t *obj, char *line, char *comment) {
+ int i;
+ cmd *cmnd;
+ char *verb;
+ uint16 *reqs;
+ uint16 cmdIndex;
+
+ debugC(1, kDebugParser, "isObjectVerb(object_t *obj, %s, %s)", line, comment);
+
+ // First, find matching verb in cmd list
+ cmdIndex = obj->cmdIndex; // ptr to list of commands
+ if (cmdIndex == 0) // No commands for this obj
+ return false;
+
+ for (i = 0; _vm._cmdList[cmdIndex][i].verbIndex != 0; i++) // For each cmd
+ if (isWordPresent(_vm._arrayVerbs[_vm._cmdList[cmdIndex][i].verbIndex])) // Was this verb used?
+ break;
+ if (_vm._cmdList[cmdIndex][i].verbIndex == 0) // No verbs used.
+ return false;
+
+ // Verb match found. Check if object is Near
+ verb = *_vm._arrayVerbs[_vm._cmdList[cmdIndex][i].verbIndex];
+ if (!isNear(obj, verb, comment))
+ return(false);
+
+ // Check all required objects are being carried
+ cmnd = &_vm._cmdList[cmdIndex][i]; // ptr to struct cmd
+ if (cmnd->reqIndex) { // At least 1 thing in list
+ reqs = _vm._arrayReqs[cmnd->reqIndex]; // ptr to list of required objects
+ for (i = 0; reqs[i]; i++) // for each obj
+ if (!isCarrying(reqs[i])) {
+ Utils::Box(BOX_ANY, "%s", _vm._textData[cmnd->textDataNoCarryIndex]);
+ return true;
+ }
+ }
+
+ // Required objects are present, now check state is correct
+ if ((obj->state != cmnd->reqState) && (cmnd->reqState != DONT_CARE)) {
+ Utils::Box(BOX_ANY, "%s", _vm._textData[cmnd->textDataWrongIndex]);
+ return true;
+ }
+
+ // Everything checked. Change the state and carry out any actions
+ if (cmnd->reqState != DONT_CARE) // Don't change new state if required state didn't care
+ obj->state = cmnd->newState;
+ Utils::Box(BOX_ANY, "%s", _vm._textData[cmnd->textDataDoneIndex]);
+ _vm.scheduler().insertActionList(cmnd->actIndex);
+
+ // See if any additional generic actions
+ if ((verb == _vm._arrayVerbs[_vm._look][0]) || (verb == _vm._arrayVerbs[_vm._take][0]) || (verb == _vm._arrayVerbs[_vm._drop][0]))
+ isGenericVerb(obj, line, comment);
+ return true;
+}
+
+void Parser::showDosInventory() {
+// Show user all objects being carried in a variable width 2 column format
+ static const char *blanks = " ";
+ uint16 index, len, len1 = 0, len2 = 0;
+ char buffer[XBYTES *NUM_ROWS] = "\0";
+
+ index = 0;
+ for (int i = 0; i < _vm._numObj; i++) /* Find widths of 2 columns */
+ if (_vm._objects[i].carriedFl) {
+ len = strlen(_vm._arrayNouns[_vm._objects[i].nounIndex][1]);
+ if (index++ & 1) /* Right hand column */
+ len2 = (len > len2) ? len : len2;
+ else
+ len1 = (len > len1) ? len : len1;
+ }
+ len1 += 1; /* For gap between columns */
+
+ if (len1 + len2 < (uint16)strlen(_vm._textParser[kTBOutro]))
+ len1 = strlen(_vm._textParser[kTBOutro]);
+
+ strncat(buffer, blanks, (len1 + len2 - strlen(_vm._textParser[kTBIntro])) / 2);
+ strcat(strcat(buffer, _vm._textParser[kTBIntro]), "\n");
+ index = 0;
+ for (int i = 0; i < _vm._numObj; i++) { /* Assign strings */
+ if (_vm._objects[i].carriedFl) {
+ if (index++ & 1)
+ strcat(strcat(buffer, _vm._arrayNouns[_vm._objects[i].nounIndex][1]), "\n");
+ else
+ strncat(strcat(buffer, _vm._arrayNouns[_vm._objects[i].nounIndex][1]), blanks, len1 - strlen(_vm._arrayNouns[_vm._objects[i].nounIndex][1]));
+ }
+ }
+ if (index & 1)
+ strcat(buffer, "\n");
+ strcat(buffer, _vm._textParser[kTBOutro]);
+
+ Utils::Box(BOX_ANY, "%s", buffer);
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/parser.h b/engines/hugo/parser.h
new file mode 100644
index 0000000000..cc94ff7adc
--- /dev/null
+++ b/engines/hugo/parser.h
@@ -0,0 +1,86 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_PARSER_H
+#define HUGO_PARSER_H
+namespace Hugo {
+
+enum seqTextParser {
+ kTBExit = 0, kTBMaze, kTBNoPoint, kTBNoun, kTBVerb,
+ kTBEh, kTBUnusual, kTBHave, kTBNoUse, kTBDontHave,
+ kTBNeed, kTBOk, kCmtAny1, kCmtAny2, kCmtAny3,
+ kCmtClose, kTBIntro, kTBOutro
+};
+
+class Parser {
+public:
+ Parser(HugoEngine &vm);
+
+ bool isWordPresent(char **wordArr);
+
+ void charHandler();
+ void command(const char *format, ...);
+ void drawStatusText();
+ void keyHandler(uint16 nChar, uint16 nFlags);
+ void lineHandler();
+
+private:
+ HugoEngine &_vm;
+
+ char _ringBuffer[32]; // Ring buffer
+ uint16 _putIndex;
+ uint16 _getIndex; // Index into ring buffer
+ bool _checkDoubleF1Fl; // Flag used to display user help or instructions
+
+ command_t _statusLine;
+ command_t _scoreLine;
+
+ bool isBackgroundWord(objectList_t obj, char *line);
+ bool isCarrying(uint16 wordIndex);
+ bool isCatchallVerb(objectList_t obj, char *line);
+ bool isGenericVerb(object_t *obj, char *line, char *comment);
+ bool isNear(object_t *obj, char *verb, char *comment);
+ bool isObjectVerb(object_t *obj, char *line, char *comment);
+
+ char *findNoun(char *line);
+ char *findVerb(char *line);
+ char *strlwr(char *buffer);
+
+ void dropObject(object_t *obj);
+ void showDosInventory();
+ void showTakeables();
+ void takeObject(object_t *obj);
+};
+
+} // End of namespace Hugo
+
+#endif //HUGO_PARSER_H
diff --git a/engines/hugo/route.cpp b/engines/hugo/route.cpp
new file mode 100644
index 0000000000..deb4dc27d5
--- /dev/null
+++ b/engines/hugo/route.cpp
@@ -0,0 +1,472 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+// Find shortest route from hero to destination
+
+#include "common/system.h"
+
+#include "hugo/hugo.h"
+#include "hugo/game.h"
+#include "hugo/route.h"
+#include "hugo/global.h"
+
+namespace Hugo {
+Route::Route(HugoEngine &vm) : _vm(vm) {
+}
+
+// Face hero in new direction, based on cursor key input by user.
+void Route::setDirection(uint16 keyCode) {
+ object_t *obj = _vm._hero; // Pointer to hero object
+
+ debugC(1, kDebugRoute, "setDirection(%d)", keyCode);
+
+ // Set first image in sequence
+ switch (keyCode) {
+ case Common::KEYCODE_UP:
+ obj->currImagePtr = obj->seqList[_UP].seqPtr;
+ break;
+ case Common::KEYCODE_DOWN:
+ obj->currImagePtr = obj->seqList[DOWN].seqPtr;
+ break;
+ case Common::KEYCODE_LEFT:
+ obj->currImagePtr = obj->seqList[LEFT].seqPtr;
+ break;
+ case Common::KEYCODE_RIGHT:
+ obj->currImagePtr = obj->seqList[RIGHT].seqPtr;
+ break;
+ case Common::KEYCODE_HOME:
+ obj->currImagePtr = obj->seqList[LEFT].seqPtr;
+ break;
+ case Common::KEYCODE_END:
+ obj->currImagePtr = obj->seqList[LEFT].seqPtr;
+ break;
+// case Common::KEYCODE_PRIOR:
+// obj->currImagePtr = obj->seqList[RIGHT].seqPtr;
+// break;
+// case Common::KEYCODE_NEXT:
+// obj->currImagePtr = obj->seqList[RIGHT].seqPtr;
+// break;
+ }
+}
+
+// Set hero walking, based on cursor key input by user.
+// Hitting same key twice will stop hero.
+void Route::setWalk(uint16 direction) {
+ object_t *obj = _vm._hero; // Pointer to hero object
+ static uint16 oldDirection = 0; // Last direction char
+
+ debugC(1, kDebugRoute, "setWalk(%d)", direction);
+
+ if (_vm.getGameStatus().storyModeFl || obj->pathType != USER) // Make sure user has control
+ return;
+
+ if (!obj->vx && !obj->vy)
+ oldDirection = 0; // Fix for consistant restarts
+
+ if (direction != oldDirection) {
+ // Direction has changed
+ setDirection(direction); // Face new direction
+ obj->vx = obj->vy = 0;
+ switch (direction) { // And set correct velocity
+ case Common::KEYCODE_UP:
+ obj->vy = -DY;
+ break;
+ case Common::KEYCODE_DOWN:
+ obj->vy = DY;
+ break;
+ case Common::KEYCODE_LEFT:
+ obj->vx = -DX;
+ break;
+ case Common::KEYCODE_RIGHT:
+ obj->vx = DX;
+ break;
+ case Common::KEYCODE_HOME:
+ obj->vx = -DX;
+ obj->vy = -DY / 2;
+ break;
+ case Common::KEYCODE_END:
+ obj->vx = -DX;
+ obj->vy = DY / 2;
+ break;
+// case Common::KEYCODE_PRIOR:
+// obj->vx = DX;
+// obj->vy = -DY / 2;
+// break;
+// case Common::KEYCODE_NEXT:
+// obj->vx = DX;
+// obj->vy = DY / 2;
+// break;
+ }
+ oldDirection = direction;
+ obj->cycling = CYCLE_FORWARD;
+ } else {
+ // Same key twice - halt hero
+ obj->vy = 0;
+ obj->vx = 0;
+ oldDirection = 0;
+ obj->cycling = NOT_CYCLING;
+ }
+}
+
+// Recursive algorithm! Searches from hero to dest_x, dest_y
+// Find horizontal line segment about supplied point and recursively
+// find line segments for each point above and below that segment.
+// When destination point found in segment, start surfacing and leave
+// a trail in segment[] from destination back to hero.
+//
+// Note: there is a bug which allows a route through a 1-pixel high
+// narrow gap if between 2 segments wide enough for hero. To work
+// around this, make sure any narrow gaps are 2 or more pixels high.
+// An example of this was the blocking guard in Hugo1/Dead-End.
+void Route::segment(int16 x, int16 y) {
+ int16 x1, x2; // Range of segment
+// Note use of static - can't waste stack
+ static image_pt p; // Ptr to _boundaryMap[y]
+ static segment_t *seg_p; // Ptr to segment
+
+ debugC(1, kDebugRoute, "segment(%d, %d)", x, y);
+
+ // Bomb out if stack exhausted
+ // Vinterstum: Is this just a safeguard, or actually used?
+ //_fullStackFl = _stackavail () < 256;
+ _fullStackFl = false;
+
+ // Find and fill on either side of point
+ p = _boundaryMap[y];
+ for (x1 = x; x1 > 0; x1--)
+ if (p[x1] == 0) {
+ p[x1] = kMapFill;
+ } else
+ break;
+ for (x2 = x + 1; x2 < XPIX; x2++)
+ if (p[x2] == 0) {
+ p[x2] = kMapFill;
+ } else
+ break;
+ x1++;
+ x2--;
+
+ // Discard path if not wide enough for hero - dead end
+ if (_heroWidth > x2 - x1 + 1)
+ return;
+
+ // Have we found the destination yet?
+ if (y == _destY && x1 <= _destX && x2 >= _destX)
+ _routeFoundFl = true;
+
+ // Bounds check y in case no boundary around screen
+ if (y <= 0 || y >= YPIX - 1)
+ return;
+
+ if (_vm._hero->x < x1) {
+ // Hero x not in segment, search x1..x2
+ // Find all segments above current
+ for (x = x1; !(_routeFoundFl | _fullStackFl | _fullSegmentFl) && x <= x2; x++)
+ if (_boundaryMap[y - 1][x] == 0)
+ segment(x, y - 1);
+
+ // Find all segments below current
+ for (x = x1; !(_routeFoundFl | _fullStackFl | _fullSegmentFl) && x <= x2; x++)
+ if (_boundaryMap[y + 1][x] == 0)
+ segment(x, y + 1);
+ } else if (_vm._hero->x + HERO_MAX_WIDTH > x2) {
+ // Hero x not in segment, search x1..x2
+ // Find all segments above current
+ for (x = x2; !(_routeFoundFl | _fullStackFl | _fullSegmentFl) && x >= x1; x--)
+ if (_boundaryMap[y - 1][x] == 0)
+ segment(x, y - 1);
+
+ // Find all segments below current
+ for (x = x2; !(_routeFoundFl | _fullStackFl | _fullSegmentFl) && x >= x1; x--)
+ if (_boundaryMap[y + 1][x] == 0)
+ segment(x, y + 1);
+ } else {
+ // Organize search around hero x position - this gives
+ // better chance for more direct route.
+ for (x = _vm._hero->x; !(_routeFoundFl | _fullStackFl | _fullSegmentFl) && x <= x2; x++)
+ if (_boundaryMap[y - 1][x] == 0)
+ segment(x, y - 1);
+ for (x = x1; !(_routeFoundFl | _fullStackFl | _fullSegmentFl) && x < _vm._hero->x; x++)
+ if (_boundaryMap[y - 1][x] == 0)
+ segment(x, y - 1);
+ for (x = _vm._hero->x; !(_routeFoundFl | _fullStackFl | _fullSegmentFl) && x <= x2; x++)
+ if (_boundaryMap[y + 1][x] == 0)
+ segment(x, y + 1);
+ for (x = x1; !(_routeFoundFl | _fullStackFl | _fullSegmentFl) && x < _vm._hero->x; x++)
+ if (_boundaryMap[y + 1][x] == 0)
+ segment(x, y + 1);
+ }
+
+ // If found, surface, leaving trail back to hero
+ if (_routeFoundFl) {
+ // Bomb out if too many segments (leave one spare)
+ if (_segmentNumb >= kMaxSeg - 1)
+ _fullSegmentFl = true;
+ else {
+ // Create segment
+ seg_p = &_segment[_segmentNumb];
+ seg_p->y = y;
+ seg_p->x1 = x1;
+ seg_p->x2 = x2;
+ _segmentNumb++;
+ }
+ }
+}
+
+// Create and return ptr to new node. Initialize with previous node.
+// Returns NULL if MAX_NODES exceeded
+Point *Route::newNode() {
+ debugC(1, kDebugRoute, "newNode");
+
+ if (_routeListIndex >= kMaxNodes) // Too many nodes
+ return(NULL); // Incomplete route - failure
+ _routeListIndex++;
+ _route[_routeListIndex] = _route[_routeListIndex - 1]; // Initialize with previous node
+ return(&_route[_routeListIndex]);
+}
+
+// Construct route to cx, cy. Return TRUE if successful.
+// 1. Copy boundary bitmap to local byte map (include object bases)
+// 2. Construct list of segments segment[] from hero to destination
+// 3. Compress to shortest route in route[]
+bool Route::findRoute(int16 cx, int16 cy) {
+ int16 i, j, x, y; // Loop on coordinates
+ int16 x1, x2, dx; // Overlap between segments
+ int16 herox1, herox2, heroy; // Current hero baseline
+ object_t *obj; // Ptr to object
+ segment_t *seg_p; // Ptr to segment
+ Point *routeNode; // Ptr to route node
+
+ debugC(1, kDebugRoute, "findRoute(%d, %d)", cx, cy);
+
+ // Initialize for search
+ _routeFoundFl = false; // Path not found yet
+ _fullStackFl = false; // Stack not exhausted
+ _fullSegmentFl = false; // Segments not exhausted
+ _segmentNumb = 0; // Segment index
+ _heroWidth = HERO_MIN_WIDTH; // Minimum width of hero
+ _destY = cy; // Destination coords
+ _destX = cx; // Destination coords
+ herox1 = _vm._hero->x + _vm._hero->currImagePtr->x1; // Hero baseline
+ herox2 = _vm._hero->x + _vm._hero->currImagePtr->x2; // Hero baseline
+ heroy = _vm._hero->y + _vm._hero->currImagePtr->y2; // Hero baseline
+
+ // Store all object baselines into objbound (except hero's = [0])
+ for (i = 1, obj = &_vm._objects[i]; i < _vm._numObj; i++, obj++)
+ if ((obj->screenIndex == *_vm._screen_p) && (obj->cycling != INVISIBLE) && (obj->priority == FLOATING))
+ _vm.storeBoundary(obj->oldx + obj->currImagePtr->x1, obj->oldx + obj->currImagePtr->x2, obj->oldy + obj->currImagePtr->y2);
+
+ // Combine objbound and boundary bitmaps to local byte map
+ for (y = 0; y < YPIX; y++)
+ for (x = 0; x < XBYTES; x++)
+ for (i = 0; i < 8; i++)
+ _boundaryMap[y][x * 8 + i] = ((_vm.getObjectBoundaryOverlay()[y * XBYTES + x] | _vm.getBoundaryOverlay()[y * XBYTES + x]) & (0x80 >> i)) ? kMapBound : 0;
+
+ // Clear all object baselines from objbound
+ for (i = 0, obj = _vm._objects; i < _vm._numObj; i++, obj++)
+ if ((obj->screenIndex == *_vm._screen_p) && (obj->cycling != INVISIBLE) && (obj->priority == FLOATING))
+ _vm.clearBoundary(obj->oldx + obj->currImagePtr->x1, obj->oldx + obj->currImagePtr->x2, obj->oldy + obj->currImagePtr->y2);
+
+ // Search from hero to destination
+ segment(herox1, heroy);
+
+ // Not found or not enough stack or MAX_SEG exceeded
+ if (!_routeFoundFl || _fullStackFl || _fullSegmentFl) {
+ return(false);
+ }
+
+ // Now find the route of nodes from destination back to hero
+ // Assign first node as destination
+ _route[0].x = _destX;
+ _route[0].y = _destY;
+
+ // Make a final segment for hero's base (we left a spare)
+ _segment[_segmentNumb].y = heroy;
+ _segment[_segmentNumb].x1 = herox1;
+ _segment[_segmentNumb].x2 = herox2;
+ _segmentNumb++;
+
+ // Look in segments[] for straight lines from destination to hero
+ for (i = 0, _routeListIndex = 0; i < _segmentNumb - 1; i++) {
+ if ((routeNode = newNode()) == NULL) // New node for new segment
+ return(false); // Too many nodes
+ routeNode->y = _segment[i].y;
+
+ // Look ahead for furthest straight line
+ for (j = i + 1; j < _segmentNumb; j++) {
+ seg_p = &_segment[j];
+ // Can we get to this segment from previous node?
+ if (seg_p->x1 <= routeNode->x && seg_p->x2 >= routeNode->x + _heroWidth - 1)
+ routeNode->y = seg_p->y; // Yes, keep updating node
+ else {
+ // No, create another node on previous segment to reach it
+ if ((routeNode = newNode()) == NULL) // Add new route node
+ return (false); // Too many nodes
+
+ // Find overlap between old and new segments
+ x1 = MAX(_segment[j - 1].x1, seg_p->x1);
+ x2 = MIN(_segment[j - 1].x2, seg_p->x2);
+
+ // If room, add a little offset to reduce staircase effect
+ dx = HERO_MAX_WIDTH >> 1;
+ if (x2 - x1 < _heroWidth + dx)
+ dx = 0;
+
+ // Bear toward final hero position
+ if (j == _segmentNumb - 1)
+ routeNode->x = herox1;
+ else if (herox1 < x1)
+ routeNode->x = x1 + dx;
+ else if (herox1 > x2 - _heroWidth + 1)
+ routeNode->x = x2 - _heroWidth - dx;
+ else
+ routeNode->x = herox1;
+ i = j - 2; // Restart segment (-1 to offset auto increment)
+ break;
+ }
+ }
+
+ // Terminate loop if we've reached hero
+ if (routeNode->x == herox1 && routeNode->y == heroy)
+ break;
+ }
+ return true;
+}
+
+// Process hero in route mode - called from Move_objects()
+void Route::processRoute() {
+ int16 herox, heroy; // Hero position
+ Point *routeNode; // Ptr to current route node
+ static bool turnedFl = false; // Used to get extra cylce for turning
+
+ status_t &gameStatus = _vm.getGameStatus();
+
+ debugC(1, kDebugRoute, "processRoute");
+
+ // Current hero position
+ herox = _vm._hero->x + _vm._hero->currImagePtr->x1;
+ heroy = _vm._hero->y + _vm._hero->currImagePtr->y2;
+ routeNode = &_route[gameStatus.routeIndex];
+
+ // Arrived at node?
+ if (abs(herox - routeNode->x) < DX + 1 && abs(heroy - routeNode->y) < DY) {
+ // DX too low
+ // Close enough - position hero exactly
+ _vm._hero->x = _vm._hero->oldx = routeNode->x - _vm._hero->currImagePtr->x1;
+ _vm._hero->y = _vm._hero->oldy = routeNode->y - _vm._hero->currImagePtr->y2;
+ _vm._hero->vx = _vm._hero->vy = 0;
+ _vm._hero->cycling = NOT_CYCLING;
+
+ // Arrived at final node?
+ if (--gameStatus.routeIndex < 0) {
+ // See why we walked here
+ switch (gameStatus.go_for) {
+ case GO_EXIT: // Walked to an exit, proceed into it
+ setWalk(_vm._hotspots[gameStatus.go_id].direction);
+ break;
+ case GO_LOOK: // Look at an object
+ if (turnedFl) {
+ _vm.lookObject(&_vm._objects[gameStatus.go_id]);
+ turnedFl = false;
+ } else {
+ setDirection(_vm._objects[gameStatus.go_id].direction);
+ gameStatus.routeIndex++; // Come round again
+ turnedFl = true;
+ }
+ break;
+ case GO_GET: // Get (or use) an object
+ if (turnedFl) {
+ _vm.useObject(gameStatus.go_id);
+ turnedFl = false;
+ } else {
+ setDirection(_vm._objects[gameStatus.go_id].direction);
+ gameStatus.routeIndex++; // Come round again
+ turnedFl = true;
+ }
+ break;
+ case GO_SPACE:
+ warning("Unhandled gameStatus.go_for GO_STATUS");
+ break;
+ }
+ }
+ } else if (_vm._hero->vx == 0 && _vm._hero->vy == 0) {
+ // Set direction of travel if at a node
+ // Note realignment when changing to (thinner) up/down sprite,
+ // otherwise hero could bump into boundaries along route.
+ if (herox < routeNode->x)
+ setWalk(Common::KEYCODE_RIGHT);
+ else if (herox > routeNode->x)
+ setWalk(Common::KEYCODE_LEFT);
+ else if (heroy < routeNode->y) {
+ setWalk(Common::KEYCODE_DOWN);
+ _vm._hero->x = _vm._hero->oldx = routeNode->x - _vm._hero->currImagePtr->x1;
+ } else if (heroy > routeNode->y) {
+ setWalk(Common::KEYCODE_UP);
+ _vm._hero->x = _vm._hero->oldx = routeNode->x - _vm._hero->currImagePtr->x1;
+ }
+ }
+}
+
+// Start a new route from hero to cx, cy
+// go_for is the purpose, id indexes the exit or object to walk to
+// Returns FALSE if route not found
+bool Route::startRoute(go_t go_for, int16 id, int16 cx, int16 cy) {
+ bool foundFl = false; // TRUE if route found ok
+
+ status_t &gameStatus = _vm.getGameStatus();
+
+ debugC(1, kDebugRoute, "startRoute(%d, %d, %d, %d)", go_for, id, cx, cy);
+
+ // Don't attempt to walk if user does not have control
+ if (_vm._hero->pathType != USER)
+ return false;
+
+ // if inventory showing, make it go away
+ if (gameStatus.inventoryState != I_OFF)
+ gameStatus.inventoryState = I_UP;
+
+ gameStatus.go_for = go_for; // Purpose of trip
+ gameStatus.go_id = id; // Index of exit/object
+
+ // Adjust destination to center hero if walking to cursor
+ if (gameStatus.go_for == GO_SPACE)
+ cx -= HERO_MIN_WIDTH / 2;
+
+ if ((foundFl = findRoute(cx, cy))) { // Found a route?
+ gameStatus.routeIndex = _routeListIndex; // Node index
+ _vm._hero->vx = _vm._hero->vy = 0; // Stop manual motion
+ }
+
+ return foundFl;
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/route.h b/engines/hugo/route.h
new file mode 100644
index 0000000000..09b4575fcd
--- /dev/null
+++ b/engines/hugo/route.h
@@ -0,0 +1,85 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_ROUTE_H
+#define HUGO_ROUTE_H
+
+namespace Hugo {
+
+#define kMapBound 1 // Mark a boundary outline
+#define kMapFill 2 // Mark a boundary filled
+#define kMaxSeg 256 // Maximum number of segments
+#define kMaxNodes 256 // Maximum nodes in route
+#define DEBUG_ROUTE FALSE
+
+struct Point {
+ int x;
+ int y;
+};
+
+struct segment_t { // Search segment
+ int16 y; // y position
+ int16 x1, x2; // Range of segment
+};
+
+class Route {
+public:
+ Route(HugoEngine &vm);
+
+ void processRoute();
+ bool startRoute(go_t go_for, short id, short cx, short cy);
+ void setDirection(uint16 keyCode);
+ void setWalk(uint16 direction);
+
+private:
+ HugoEngine &_vm;
+
+ byte _boundaryMap[YPIX][XPIX]; // Boundary byte map
+ segment_t _segment[kMaxSeg]; // List of points in fill-path
+ Point _route[kMaxNodes]; // List of nodes in route (global)
+ int16 _segmentNumb; // Count number of segments
+ int16 _routeListIndex; // Index into route list
+ int16 _destX;
+ int16 _destY;
+ int16 _heroWidth; // Hero width
+ bool _routeFoundFl; // TRUE when path found
+ bool _fullStackFl; // TRUE if stack exhausted
+ bool _fullSegmentFl; // Segments exhausted
+
+ void segment(int16 x, int16 y);
+ bool findRoute(int16 cx, int16 cy);
+ Point *newNode();
+};
+
+} // End of namespace Hugo
+
+#endif //HUGO_ROUTE_H
diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp
new file mode 100644
index 0000000000..41d194120f
--- /dev/null
+++ b/engines/hugo/schedule.cpp
@@ -0,0 +1,700 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+// This module contains all the scheduling and timing stuff
+
+#include "common/system.h"
+#include "common/stream.h"
+
+#include "hugo/game.h"
+#include "hugo/hugo.h"
+#include "hugo/schedule.h"
+#include "hugo/global.h"
+#include "hugo/file.h"
+#include "hugo/display.h"
+#include "hugo/parser.h"
+#include "hugo/util.h"
+#include "hugo/sound.h"
+
+namespace Hugo {
+
+#define SIGN(X) ((X < 0) ? -1 : 1)
+
+Scheduler::Scheduler(HugoEngine &vm) : _vm(vm) {
+}
+
+Scheduler::~Scheduler() {
+}
+
+// Initialise the timer event queue
+void Scheduler::initEventQueue() {
+ debugC(1, kDebugSchedule, "initEventQueue");
+
+ // Chain next_p from first to last
+ for (int i = kMaxEvents; --i;)
+ _events[i - 1].nextEvent = &_events[i];
+ _events[kMaxEvents - 1].nextEvent = 0;
+
+ // Chain prev_p from last to first
+ for (int i = 1; i < kMaxEvents; i++)
+ _events[i].prevEvent = &_events[i - 1];
+ _events[0].prevEvent = 0;
+
+ _headEvent = _tailEvent = 0; // Event list is empty
+ _freeEvent = _events; // Free list is full
+}
+
+// Return a ptr to an event structure from the free list
+event_t *Scheduler::getQueue() {
+ debugC(4, kDebugSchedule, "getQueue");
+ event_t *resEvent;
+
+ if (!_freeEvent) // Error: no more events available
+ Utils::Error(EVNT_ERR, "%s", "getQueue");
+ resEvent = _freeEvent;
+ _freeEvent = _freeEvent->nextEvent;
+ resEvent->nextEvent = 0;
+ return resEvent;
+}
+
+// Delete an event structure (i.e. return it to the free list)
+// Historical note: Originally event p was assumed to be at head of queue
+// (i.e. earliest) since all events were deleted in order when proceeding to
+// a new screen. To delete an event from the middle of the queue, the action
+// was overwritten to be ANULL. With the advent of GLOBAL events, Del_queue
+// was modified to allow deletes anywhere in the list, and the DEL_EVENT
+// action was modified to perform the actual delete.
+void Scheduler::delQueue(event_t *curEvent) {
+ debugC(4, kDebugSchedule, "delQueue");
+ if (curEvent == _headEvent) // If p was the head ptr
+ _headEvent = curEvent->nextEvent; // then make new head_p
+ else { // Unlink p
+ curEvent->prevEvent->nextEvent = curEvent->nextEvent;
+ if (curEvent->nextEvent)
+ curEvent->nextEvent->prevEvent = curEvent->prevEvent;
+ else
+ _tailEvent = curEvent->prevEvent;
+ }
+
+ if (_headEvent)
+ _headEvent->prevEvent = 0; // Mark end of list
+ else
+ _tailEvent = 0; // Empty queue
+
+ curEvent->nextEvent = _freeEvent; // Return p to free list
+ if (_freeEvent) // Special case, if free list was empty
+ _freeEvent->prevEvent = curEvent;
+ _freeEvent = curEvent;
+}
+
+// Insert the action pointed to by p into the timer event queue
+// The queue goes from head (earliest) to tail (latest) timewise
+void Scheduler::insertAction(act *action) {
+ debugC(1, kDebugSchedule, "insertAction - Action type A%d", action->a0.actType);
+
+ // First, get and initialise the event structure
+ event_t *curEvent = getQueue();
+ curEvent->action = action;
+ switch (action->a0.actType) { // Assign whether local or global
+ case AGSCHEDULE:
+ curEvent->localActionFl = false; // Lasts over a new screen
+ break;
+ default:
+ curEvent->localActionFl = true; // Rest are for current screen only
+ break;
+ }
+
+ curEvent->time = action->a0.timer + getTicks(); // Convert rel to abs time
+
+ // Now find the place to insert the event
+ if (!_tailEvent) { // Empty queue
+ _tailEvent = _headEvent = curEvent;
+ curEvent->nextEvent = curEvent->prevEvent = NULL;
+ } else {
+ event_t *wrkEvent = _tailEvent; // Search from latest time back
+ bool found = false;
+
+ while (wrkEvent && !found) {
+ if (wrkEvent->time <= curEvent->time) { // Found if new event later
+ found = true;
+ if (wrkEvent == _tailEvent) // New latest in list
+ _tailEvent = curEvent;
+ else
+ wrkEvent->nextEvent->prevEvent = curEvent;
+ curEvent->nextEvent = wrkEvent->nextEvent;
+ wrkEvent->nextEvent = curEvent;
+ curEvent->prevEvent = wrkEvent;
+ }
+ wrkEvent = wrkEvent->prevEvent;
+ }
+
+ if (!found) { // Must be earliest in list
+ _headEvent->prevEvent = curEvent; // So insert as new head
+ curEvent->nextEvent = _headEvent;
+ curEvent->prevEvent = NULL;
+ _headEvent = curEvent;
+ }
+ }
+}
+
+void Scheduler::insertActionList(uint16 actIndex) {
+// Call Insert_action for each action in the list supplied
+ debugC(1, kDebugSchedule, "insertActionList(%d)", actIndex);
+
+ if (_vm._actListArr[actIndex])
+ for (int i = 0; _vm._actListArr[actIndex][i].a0.actType != ANULL; i++)
+ insertAction(&_vm._actListArr[actIndex][i]);
+}
+
+void Scheduler::decodeString(char *line) {
+// Decode a string
+ debugC(1, kDebugSchedule, "decodeString(%s)", line);
+
+ const char *cypher = getCypher();
+
+ for (uint16 i = 0; i < strlen(line); i++)
+ line[i] -= cypher[i % strlen(cypher)];
+ debugC(1, kDebugSchedule, "result : %s", line);
+}
+
+event_t *Scheduler::doAction(event_t *curEvent) {
+// This function performs the action in the event structure pointed to by p
+// It dequeues the event and returns it to the free list. It returns a ptr
+// to the next action in the list, except special case of NEW_SCREEN
+ event_t *wrkEvent; // Save ev_p->next_p for return
+ event_t *saveEvent; // Used in DEL_EVENTS
+ char *response; // User's response string
+ object_t *obj1;
+ object_t *obj2;
+ int dx, dy;
+ act *action; // Ptr to action structure
+
+ status_t &gameStatus = _vm.getGameStatus();
+
+ action = curEvent->action;
+ debugC(1, kDebugSchedule, "doAction - Event action type : %d", action->a0.actType);
+
+ switch (action->a0.actType) {
+ case ANULL: // Big NOP from DEL_EVENTS
+ break;
+ case ASCHEDULE: // act0: Schedule an action list
+ insertActionList(action->a0.actIndex);
+ break;
+ case START_OBJ: // act1: Start an object cycling
+ _vm._objects[action->a1.objNumb].cycleNumb = action->a1.cycleNumb;
+ _vm._objects[action->a1.objNumb].cycling = action->a1.cycle;
+ break;
+ case INIT_OBJXY: // act2: Initialise an object
+ _vm._objects[action->a2.objNumb].x = action->a2.x; // Coordinates
+ _vm._objects[action->a2.objNumb].y = action->a2.y;
+ break;
+ case PROMPT: // act3: Prompt user for key phrase
+// TODO : Add specific code for Hugo 1 DOS, which is handled differently,
+ response = Utils::Box(BOX_PROMPT, "%s", _vm.file().fetchString(action->a3.promptIndex));
+
+ warning("STUB: doAction(act3), expecting answer %s", response);
+
+// TODO : The answer of the player is not handled currently! Once it'll be read in the messageBox, uncomment this block
+#if 0
+ bool found;
+ char *tmpStr; // General purpose string ptr
+
+ for (found = false, dx = 0; !found && (action->a3.responsePtr[dx] != -1); dx++) {
+ tmpStr = _vm.file().Fetch_string(action->a3.responsePtr[dx]);
+ if (strstr(_vm.parser().strlwr(response) , tmpStr))
+ found = true;
+ }
+
+ if (found)
+ insertActionList(action->a3.actPassIndex);
+ else
+ insertActionList(action->a3.actFailIndex);
+#endif
+
+//HACK: As the answer is not read, currently it's always considered correct
+ insertActionList(action->a3.actPassIndex);
+ break;
+ case BKGD_COLOR: // act4: Set new background color
+ _vm.screen().setBackgroundColor(action->a4.newBackgroundColor);
+ break;
+ case INIT_OBJVXY: // act5: Initialise an object
+ _vm._objects[action->a5.objNumb].vx = action->a5.vx; // velocities
+ _vm._objects[action->a5.objNumb].vy = action->a5.vy;
+ break;
+ case INIT_CARRY: // act6: Initialise an object
+ _vm._objects[action->a6.objNumb].carriedFl = action->a6.carriedFl; // carried status
+ break;
+ case INIT_HF_COORD: // act7: Initialise an object to hero's "feet" coords
+ _vm._objects[action->a7.objNumb].x = _vm._hero->x - 1;
+ _vm._objects[action->a7.objNumb].y = _vm._hero->y + _vm._hero->currImagePtr->y2 - 1;
+ _vm._objects[action->a7.objNumb].screenIndex = *_vm._screen_p; // Don't forget screen!
+ break;
+ case NEW_SCREEN: // act8: Start new screen
+ newScreen(action->a8.screenIndex);
+ break;
+ case INIT_OBJSTATE: // act9: Initialise an object state
+ _vm._objects[action->a9.objNumb].state = action->a9.newState;
+ break;
+ case INIT_PATH: // act10: Initialise an object path and velocity
+ _vm._objects[action->a10.objNumb].pathType = (path_t) action->a10.newPathType;
+ _vm._objects[action->a10.objNumb].vxPath = action->a10.vxPath;
+ _vm._objects[action->a10.objNumb].vyPath = action->a10.vyPath;
+ break;
+ case COND_R: // act11: action lists conditional on object state
+ if (_vm._objects[action->a11.objNumb].state == action->a11.stateReq)
+ insertActionList(action->a11.actPassIndex);
+ else
+ insertActionList(action->a11.actFailIndex);
+ break;
+ case TEXT: // act12: Text box (CF WARN)
+ Utils::Box(BOX_ANY, "%s", _vm.file().fetchString(action->a12.stringIndex)); // Fetch string from file
+ break;
+ case SWAP_IMAGES: // act13: Swap 2 object images
+ swapImages(action->a13.obj1, action->a13.obj2);
+ break;
+ case COND_SCR: // act14: Conditional on current screen
+ if (_vm._objects[action->a14.objNumb].screenIndex == action->a14.screenReq)
+ insertActionList(action->a14.actPassIndex);
+ else
+ insertActionList(action->a14.actFailIndex);
+ break;
+ case AUTOPILOT: // act15: Home in on a (stationary) object
+ // object p1 will home in on object p2
+ obj1 = &_vm._objects[action->a15.obj1];
+ obj2 = &_vm._objects[action->a15.obj2];
+ obj1->pathType = AUTO;
+ dx = obj1->x + obj1->currImagePtr->x1 - obj2->x - obj2->currImagePtr->x1;
+ dy = obj1->y + obj1->currImagePtr->y1 - obj2->y - obj2->currImagePtr->y1;
+
+ if (dx == 0) // Don't EVER divide by zero!
+ dx = 1;
+ if (dy == 0)
+ dy = 1;
+
+ if (abs(dx) > abs(dy)) {
+ obj1->vx = action->a15.dx * -SIGN(dx);
+ obj1->vy = abs((action->a15.dy * dy) / dx) * -SIGN(dy);
+ } else {
+ obj1->vy = action->a15.dy * -SIGN(dy);
+ obj1->vx = abs((action->a15.dx * dx) / dy) * -SIGN(dx);
+ }
+ break;
+ case INIT_OBJ_SEQ: // act16: Set sequence number to use
+ // Note: Don't set a sequence at time 0 of a new screen, it causes
+ // problems clearing the boundary bits of the object! t>0 is safe
+ _vm._objects[action->a16.objNumb].currImagePtr = _vm._objects[action->a16.objNumb].seqList[action->a16.seqIndex].seqPtr;
+ break;
+ case SET_STATE_BITS: // act17: OR mask with curr obj state
+ _vm._objects[action->a17.objNumb].state |= action->a17.stateMask;
+ break;
+ case CLEAR_STATE_BITS: // act18: AND ~mask with curr obj state
+ _vm._objects[action->a18.objNumb].state &= ~action->a18.stateMask;
+ break;
+ case TEST_STATE_BITS: // act19: If all bits set, do apass else afail
+ if ((_vm._objects[action->a19.objNumb].state & action->a19.stateMask) == action->a19.stateMask)
+ insertActionList(action->a19.actPassIndex);
+ else
+ insertActionList(action->a19.actFailIndex);
+ break;
+ case DEL_EVENTS: // act20: Remove all events of this action type
+ // Note: actions are not deleted here, simply turned into NOPs!
+ wrkEvent = _headEvent; // The earliest event
+ while (wrkEvent) { // While events found in list
+ saveEvent = wrkEvent->nextEvent;
+ if (wrkEvent->action->a20.actType == action->a20.actTypeDel)
+ delQueue(wrkEvent);
+ wrkEvent = saveEvent;
+ }
+ break;
+ case GAMEOVER: // act21: Game over!
+ // NOTE: Must wait at least 1 tick before issuing this action if
+ // any objects are to be made invisible!
+ gameStatus.gameOverFl = true;
+ break;
+ case INIT_HH_COORD: // act22: Initialise an object to hero's actual coords
+ _vm._objects[action->a22.objNumb].x = _vm._hero->x;
+ _vm._objects[action->a22.objNumb].y = _vm._hero->y;
+ _vm._objects[action->a22.objNumb].screenIndex = *_vm._screen_p;// Don't forget screen!
+ break;
+ case EXIT: // act23: Exit game back to DOS
+ _vm.endGame();
+ break;
+ case BONUS: // act24: Get bonus score for action
+ processBonus(action->a24.pointIndex);
+ break;
+ case COND_BOX: // act25: Conditional on bounding box
+ obj1 = &_vm._objects[action->a25.objNumb];
+ dx = obj1->x + obj1->currImagePtr->x1;
+ dy = obj1->y + obj1->currImagePtr->y2;
+ if ((dx >= action->a25.x1) && (dx <= action->a25.x2) &&
+ (dy >= action->a25.y1) && (dy <= action->a25.y2))
+ insertActionList(action->a25.actPassIndex);
+ else
+ insertActionList(action->a25.actFailIndex);
+ break;
+ case SOUND: // act26: Play a sound (or tune)
+ if (action->a26.soundIndex < _vm._tunesNbr)
+ _vm.sound().playMusic(action->a26.soundIndex);
+ else
+ _vm.sound().playSound(action->a26.soundIndex, BOTH_CHANNELS, MED_PRI);
+ break;
+ case ADD_SCORE: // act27: Add object's value to score
+ _vm.adjustScore(_vm._objects[action->a27.objNumb].objValue);
+ break;
+ case SUB_SCORE: // act28: Subtract object's value from score
+ _vm.adjustScore(-_vm._objects[action->a28.objNumb].objValue);
+ break;
+ case COND_CARRY: // act29: Conditional on object being carried
+ if (_vm._objects[action->a29.objNumb].carriedFl)
+ insertActionList(action->a29.actPassIndex);
+ else
+ insertActionList(action->a29.actFailIndex);
+ break;
+ case INIT_MAZE: // act30: Enable and init maze structure
+ _maze.enabledFl = true;
+ _maze.size = action->a30.mazeSize;
+ _maze.x1 = action->a30.x1;
+ _maze.y1 = action->a30.y1;
+ _maze.x2 = action->a30.x2;
+ _maze.y2 = action->a30.y2;
+ _maze.x3 = action->a30.x3;
+ _maze.x4 = action->a30.x4;
+ _maze.firstScreenIndex = action->a30.firstScreenIndex;
+ break;
+ case EXIT_MAZE: // act31: Disable maze mode
+ _maze.enabledFl = false;
+ break;
+ case INIT_PRIORITY:
+ _vm._objects[action->a32.objNumb].priority = action->a32.priority;
+ break;
+ case INIT_SCREEN:
+ _vm._objects[action->a33.objNumb].screenIndex = action->a33.screenIndex;
+ break;
+ case AGSCHEDULE: // act34: Schedule a (global) action list
+ insertActionList(action->a34.actIndex);
+ break;
+ case REMAPPAL: // act35: Remap a palette color
+ _vm.screen().remapPal(action->a35.oldColorIndex, action->a35.newColorIndex);
+ break;
+ case COND_NOUN: // act36: Conditional on noun mentioned
+ if (_vm.parser().isWordPresent(_vm._arrayNouns[action->a36.nounIndex]))
+ insertActionList(action->a36.actPassIndex);
+ else
+ insertActionList(action->a36.actFailIndex);
+ break;
+ case SCREEN_STATE: // act37: Set new screen state
+ _vm._screenStates[action->a37.screenIndex] = action->a37.newState;
+ break;
+ case INIT_LIPS: // act38: Position lips on object
+ _vm._objects[action->a38.lipsObjNumb].x = _vm._objects[action->a38.objNumb].x + action->a38.dxLips;
+ _vm._objects[action->a38.lipsObjNumb].y = _vm._objects[action->a38.objNumb].y + action->a38.dyLips;
+ _vm._objects[action->a38.lipsObjNumb].screenIndex = *_vm._screen_p; // Don't forget screen!
+ _vm._objects[action->a38.lipsObjNumb].cycling = CYCLE_FORWARD;
+ break;
+ case INIT_STORY_MODE: // act39: Init story_mode flag
+ // This is similar to the QUIET path mode, except that it is
+ // independant of it and it additionally disables the ">" prompt
+ gameStatus.storyModeFl = action->a39.storyModeFl;
+
+ // End the game after story if this is special vendor demo mode
+ if (gameStatus.demoFl && action->a39.storyModeFl == false)
+ _vm.endGame();
+ break;
+ case WARN: // act40: Text box (CF TEXT)
+ Utils::Box(BOX_OK, "%s", _vm.file().fetchString(action->a40.stringIndex));
+ break;
+ case COND_BONUS: // act41: Perform action if got bonus
+ if (_vm._points[action->a41.BonusIndex].scoredFl)
+ insertActionList(action->a41.actPassIndex);
+ else
+ insertActionList(action->a41.actFailIndex);
+ break;
+ case TEXT_TAKE: // act42: Text box with "take" message
+ Utils::Box(BOX_ANY, TAKE_TEXT, _vm._arrayNouns[_vm._objects[action->a42.objNumb].nounIndex][TAKE_NAME]);
+ break;
+ case YESNO: // act43: Prompt user for Yes or No
+ warning("doAction(act43) - Yes/No Box");
+ if (Utils::Box(BOX_YESNO, "%s", _vm.file().fetchString(action->a43.promptIndex)) != NULL)
+ insertActionList(action->a43.actYesIndex);
+ else
+ insertActionList(action->a43.actNoIndex);
+ break;
+ case STOP_ROUTE: // act44: Stop any route in progress
+ gameStatus.routeIndex = -1;
+ break;
+ case COND_ROUTE: // act45: Conditional on route in progress
+ if (gameStatus.routeIndex >= action->a45.routeIndex)
+ insertActionList(action->a45.actPassIndex);
+ else
+ insertActionList(action->a45.actFailIndex);
+ break;
+ case INIT_JUMPEXIT: // act46: Init status.jumpexit flag
+ // This is to allow left click on exit to get there immediately
+ // For example the plane crash in Hugo2 where hero is invisible
+ // Couldn't use INVISIBLE flag since conflicts with boat in Hugo1
+ gameStatus.jumpExitFl = action->a46.jumpExitFl;
+ break;
+ case INIT_VIEW: // act47: Init object.viewx, viewy, dir
+ _vm._objects[action->a47.objNumb].viewx = action->a47.viewx;
+ _vm._objects[action->a47.objNumb].viewy = action->a47.viewy;
+ _vm._objects[action->a47.objNumb].direction = action->a47.direction;
+ break;
+ case INIT_OBJ_FRAME: // act48: Set seq,frame number to use
+ // Note: Don't set a sequence at time 0 of a new screen, it causes
+ // problems clearing the boundary bits of the object! t>0 is safe
+ _vm._objects[action->a48.objNumb].currImagePtr = _vm._objects[action->a48.objNumb].seqList[action->a48.seqIndex].seqPtr;
+ for (dx = 0; dx < action->a48.frameIndex; dx++)
+ _vm._objects[action->a48.objNumb].currImagePtr = _vm._objects[action->a48.objNumb].currImagePtr->nextSeqPtr;
+ break;
+ case OLD_SONG:
+ //TODO For Hugo 1 and Hugo2 DOS: The songs were not stored in a DAT file, but directly as
+ //strings. the current play_music should be modified to use a strings instead of reading
+ //the file, in those cases. This replaces, for those DOS versions, act26.
+ warning("STUB: doAction(act49)");
+ break;
+ default:
+ Utils::Error(EVNT_ERR, "%s", "doAction");
+ break;
+ }
+
+ if (action->a0.actType == NEW_SCREEN) // New_screen() deletes entire list
+ return (NULL); // next_p = NULL since list now empty
+ else {
+ wrkEvent = curEvent->nextEvent;
+ delQueue(curEvent); // Return event to free list
+ return(wrkEvent); // Return next event ptr
+ }
+}
+
+// This is the scheduler which runs every tick. It examines the event queue
+// for any events whose time has come. It dequeues these events and performs
+// the action associated with the event, returning it to the free queue
+void Scheduler::runScheduler() {
+ debugC(6, kDebugSchedule, "runScheduler");
+
+ status_t &gameStatus = _vm.getGameStatus();
+
+ event_t *curEvent = _headEvent; // The earliest event
+ while (curEvent && curEvent->time <= gameStatus.tick) // While mature events found
+ curEvent = doAction(curEvent); // Perform the action (returns next_p)
+ gameStatus.tick++; // Accessed elsewhere via getTicks()
+}
+
+uint32 Scheduler::getTicks() {
+// Return system time in ticks. A tick is 1/TICKS_PER_SEC mS
+ debugC(3, kDebugSchedule, "getTicks");
+
+ return _vm.getGameStatus().tick;
+}
+
+void Scheduler::processBonus(int bonusIndex) {
+// Add indecated bonus to score if not added already
+ debugC(1, kDebugSchedule, "processBonus(%d)", bonusIndex);
+
+ if (!_vm._points[bonusIndex].scoredFl) {
+ _vm.adjustScore(_vm._points[bonusIndex].score);
+ _vm._points[bonusIndex].scoredFl = true;
+ }
+}
+
+// Transition to a new screen as follows:
+// 1. Clear out all non-global events from event list.
+// 2. Set the new screen (in the hero object and any carried objects)
+// 3. Read in the screen files for the new screen
+// 4. Schedule action list for new screen
+// 5. Initialise prompt line and status line
+void Scheduler::newScreen(int screenIndex) {
+ debugC(1, kDebugSchedule, "newScreen(%d)", screenIndex);
+
+ // Make sure the background file exists!
+ if (!_vm.isPacked()) {
+ char line[32];
+ if (!_vm.file().fileExists(strcat(strncat(strcpy(line, _vm._picDir), _vm._screenNames[screenIndex], NAME_LEN), BKGEXT)) &&
+ !_vm.file().fileExists(strcat(strcpy(line, _vm._screenNames[screenIndex]), ".ART"))) {
+ Utils::Box(BOX_ANY, "%s", _vm._textSchedule[kSsNoBackground]);
+ return;
+ }
+ }
+
+ // 1. Clear out all local events
+ event_t *curEvent = _headEvent; // The earliest event
+ event_t *wrkEvent; // Event ptr
+ while (curEvent) { // While mature events found
+ wrkEvent = curEvent->nextEvent; // Save p (becomes undefined after Del)
+ if (curEvent->localActionFl)
+ delQueue(curEvent); // Return event to free list
+ curEvent = wrkEvent;
+ }
+
+ // 2. Set the new screen in the hero object and any being carried
+ _vm.setNewScreen(screenIndex);
+
+ // 3. Read in new screen files
+ _vm.readScreenFiles(screenIndex);
+
+ // 4. Schedule action list for this screen
+ _vm.screenActions(screenIndex);
+
+ // 5. Initialise prompt line and status line
+ _vm.initNewScreenDisplay();
+}
+
+// Write the event queue to the file with handle f
+// Note that we convert all the event structure ptrs to indexes
+// using -1 for NULL. We can't convert the action ptrs to indexes
+// so we save address of first dummy action ptr to compare on restore.
+void Scheduler::saveEvents(Common::WriteStream *f) {
+ uint32 curTime;
+ event_t saveEvents_[kMaxEvents]; // Convert event ptrs to indexes
+ event_t *wrkEvent; // Event ptr
+ int16 freeIndex; // Free list index
+ int16 headIndex; // Head of list index
+ int16 tailIndex; // Tail of list index
+
+ debugC(1, kDebugSchedule, "saveEvents");
+
+ curTime = getTicks();
+
+ // Convert event ptrs to indexes
+ for (int16 i = 0; i < kMaxEvents; i++) {
+ wrkEvent = &_events[i];
+ saveEvents_[i] = *wrkEvent;
+ saveEvents_[i].prevEvent = (wrkEvent->prevEvent == NULL) ? (event_t *) - 1 : (event_t *)(wrkEvent->prevEvent - _events);
+ saveEvents_[i].nextEvent = (wrkEvent->nextEvent == NULL) ? (event_t *) - 1 : (event_t *)(wrkEvent->nextEvent - _events);
+ }
+ freeIndex = (_freeEvent == 0) ? -1 : _freeEvent - _events;
+ headIndex = (_headEvent == 0) ? -1 : _headEvent - _events;
+ tailIndex = (_tailEvent == 0) ? -1 : _tailEvent - _events;
+
+ f->write(&curTime, sizeof(curTime));
+ f->write(&freeIndex, sizeof(freeIndex));
+ f->write(&headIndex, sizeof(headIndex));
+ f->write(&tailIndex, sizeof(tailIndex));
+ f->write(saveEvents_, sizeof(saveEvents_));
+}
+
+// Restore the event list from file with handle f
+void Scheduler::restoreEvents(Common::SeekableReadStream *f) {
+ uint32 curTime, saveTime;
+ event_t *wrkEvent; // Event ptr
+ event_t savedEvents[kMaxEvents]; // Convert event ptrs to indexes
+ int16 freeIndex; // Free list index
+ int16 headIndex; // Head of list index
+ int16 tailIndex; // Tail of list index
+
+ debugC(1, kDebugSchedule, "restoreEvents");
+
+ f->read(&saveTime, sizeof(saveTime)); // time of save
+ f->read(&freeIndex, sizeof(freeIndex));
+ f->read(&headIndex, sizeof(headIndex));
+ f->read(&tailIndex, sizeof(tailIndex));
+ f->read(savedEvents, sizeof(savedEvents));
+
+ // Restore events indexes to pointers
+ for (int i = 0; i < kMaxEvents; i++) {
+ wrkEvent = &savedEvents[i];
+ _events[i] = *wrkEvent;
+ _events[i].prevEvent = (wrkEvent->prevEvent == (event_t *) - 1) ? (event_t *)0 : &_events[(size_t)wrkEvent->prevEvent ];
+ _events[i].nextEvent = (wrkEvent->nextEvent == (event_t *) - 1) ? (event_t *)0 : &_events[(size_t)wrkEvent->nextEvent ];
+ }
+ _freeEvent = (freeIndex == -1) ? NULL : &_events[freeIndex];
+ _headEvent = (headIndex == -1) ? NULL : &_events[headIndex];
+ _tailEvent = (tailIndex == -1) ? NULL : &_events[tailIndex];
+
+ // Adjust times to fit our time
+ curTime = getTicks();
+ wrkEvent = _headEvent; // The earliest event
+ while (wrkEvent) { // While mature events found
+ wrkEvent->time = wrkEvent->time - saveTime + curTime;
+ wrkEvent = wrkEvent->nextEvent;
+ }
+}
+
+void Scheduler::restoreScreen(int screenIndex) {
+// Transition to a new screen as follows:
+// 1. Set the new screen (in the hero object and any carried objects)
+// 2. Read in the screen files for the new screen
+// 3. Initialise prompt line and status line
+
+ debugC(1, kDebugSchedule, "restoreScreen(%d)", screenIndex);
+
+ // 1. Set the new screen in the hero object and any being carried
+ _vm.setNewScreen(screenIndex);
+
+ // 2. Read in new screen files
+ _vm.readScreenFiles(screenIndex);
+
+ // 3. Initialise prompt line and status line
+ _vm.initNewScreenDisplay();
+}
+
+void Scheduler::swapImages(int objNumb1, int objNumb2) {
+// Swap all the images of one object with another. Set hero_image (we make
+// the assumption for now that the first obj is always the HERO) to the object
+// number of the swapped image
+ seqList_t tmpSeqList[MAX_SEQUENCES];
+ int seqListSize = sizeof(seqList_t) * MAX_SEQUENCES;
+
+ debugC(1, kDebugSchedule, "swapImages(%d, %d)", objNumb1, objNumb2);
+
+ _vm.file().saveSeq(&_vm._objects[objNumb1]);
+ memcpy(tmpSeqList, _vm._objects[objNumb1].seqList, seqListSize);
+ memcpy(_vm._objects[objNumb1].seqList, _vm._objects[objNumb2].seqList, seqListSize);
+ memcpy(_vm._objects[objNumb2].seqList, tmpSeqList, seqListSize);
+ _vm.file().restoreSeq(&_vm._objects[objNumb1]);
+ _vm._objects[objNumb2].currImagePtr = _vm._objects[objNumb2].seqList[0].seqPtr;
+ _vm._heroImage = (_vm._heroImage == HERO) ? objNumb2 : HERO;
+
+ // Make sure baseline stays constant
+ _vm._objects[objNumb1].y += _vm._objects[objNumb2].currImagePtr->y2 - _vm._objects[objNumb1].currImagePtr->y2;
+}
+
+Scheduler_v1::Scheduler_v1(HugoEngine &vm) : Scheduler(vm) {
+}
+
+Scheduler_v1::~Scheduler_v1() {
+}
+
+const char *Scheduler_v1::getCypher() {
+ return "Copyright 1991, Gray Design Associates";
+}
+
+Scheduler_v2::Scheduler_v2(HugoEngine &vm) : Scheduler(vm) {
+}
+
+Scheduler_v2::~Scheduler_v2() {
+}
+
+const char *Scheduler_v2::getCypher() {
+ return "Copyright 1992, Gray Design Associates";
+}
+} // End of namespace Hugo
diff --git a/engines/hugo/schedule.h b/engines/hugo/schedule.h
new file mode 100644
index 0000000000..285f7bd663
--- /dev/null
+++ b/engines/hugo/schedule.h
@@ -0,0 +1,105 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_SCHEDULE_H
+#define HUGO_SCHEDULE_H
+
+namespace Hugo {
+
+#define kMaxEvents 50 /* Max events in event queue */
+
+struct event_t {
+ act *action; /* Ptr to action to perform */
+ bool localActionFl; /* TRUE if action is only for this screen */
+ uint32 time; /* (absolute) time to perform action */
+ struct event_t *prevEvent; /* Chain to previous event */
+ struct event_t *nextEvent; /* Chain to next event */
+};
+
+class Scheduler {
+public:
+ Scheduler(HugoEngine &vm);
+ virtual ~Scheduler();
+
+ void initEventQueue();
+ void insertAction(act *action);
+ void insertActionList(uint16 actIndex);
+ void decodeString(char *line);
+ void runScheduler();
+ uint32 getTicks();
+ void processBonus(int bonusIndex);
+ void newScreen(int screenIndex);
+ void restoreEvents(Common::SeekableReadStream *f);
+ void saveEvents(Common::WriteStream *f);
+ void restoreScreen(int screenIndex);
+ void swapImages(int objNumb1, int objNumb2);
+
+private:
+ enum seqTextSchedule {
+ kSsNoBackground = 0,
+ kSsBadSaveGame = 1
+ };
+
+ HugoEngine &_vm;
+
+ event_t _events[kMaxEvents]; /* Statically declare event structures */
+
+ event_t *_freeEvent; /* Free list of event structures */
+ event_t *_headEvent; /* Head of list (earliest time) */
+ event_t *_tailEvent; /* Tail of list (latest time) */
+
+ event_t *getQueue();
+ void delQueue(event_t *curEvent);
+ event_t *doAction(event_t *curEvent);
+
+ virtual const char *getCypher() = 0;
+};
+
+class Scheduler_v1 : public Scheduler {
+public:
+ Scheduler_v1(HugoEngine &vm);
+ ~Scheduler_v1();
+
+ const char *getCypher();
+};
+
+class Scheduler_v2 : public Scheduler {
+public:
+ Scheduler_v2(HugoEngine &vm);
+ ~Scheduler_v2();
+
+ const char *getCypher();
+};
+
+} // End of namespace Hugo
+
+#endif //HUGO_SCHEDULE_H
diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp
new file mode 100644
index 0000000000..7b6ae2ec24
--- /dev/null
+++ b/engines/hugo/sound.cpp
@@ -0,0 +1,331 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+/* sound.c - sound effects and music support */
+
+#include "common/system.h"
+
+#include "sound/decoders/raw.h"
+#include "sound/audiostream.h"
+#include "sound/midiparser.h"
+#include "sound/mididrv.h"
+
+#include "hugo/hugo.h"
+#include "hugo/game.h"
+#include "hugo/file.h"
+#include "hugo/sound.h"
+
+namespace Hugo {
+
+class MidiPlayer : public MidiDriver {
+public:
+
+ enum {
+ NUM_CHANNELS = 16
+ };
+
+ MidiPlayer(MidiDriver *driver);
+ ~MidiPlayer();
+
+ void play(uint8 *stream, uint16 size);
+ void stop();
+ void pause(bool p);
+ void updateTimer();
+ void adjustVolume(int diff);
+ void setVolume(int volume);
+ int getVolume() const { return _masterVolume; }
+ void setLooping(bool loop) { _isLooping = loop; }
+
+ // MidiDriver interface
+ int open();
+ void close();
+ void send(uint32 b);
+ void metaEvent(byte type, byte *data, uint16 length);
+ void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
+ uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
+ MidiChannel *allocateChannel() { return 0; }
+ MidiChannel *getPercussionChannel() { return 0; }
+
+private:
+
+ static void timerCallback(void *p);
+
+ MidiDriver *_driver;
+ MidiParser *_parser;
+ uint8 *_midiData;
+ bool _isLooping;
+ bool _isPlaying;
+ bool _paused;
+ int _masterVolume;
+ MidiChannel *_channelsTable[NUM_CHANNELS];
+ uint8 _channelsVolume[NUM_CHANNELS];
+ Common::Mutex _mutex;
+};
+
+MidiPlayer::MidiPlayer(MidiDriver *driver)
+ : _driver(driver), _parser(0), _midiData(0), _isLooping(false), _isPlaying(false), _paused(false), _masterVolume(0) {
+ assert(_driver);
+ memset(_channelsTable, 0, sizeof(_channelsTable));
+ for (int i = 0; i < NUM_CHANNELS; i++) {
+ _channelsVolume[i] = 127;
+ }
+}
+
+MidiPlayer::~MidiPlayer() {
+ close();
+}
+
+void MidiPlayer::play(uint8 *stream, uint16 size) {
+ if (!stream) {
+ stop();
+ return;
+ }
+
+ _midiData = (uint8 *)malloc(size);
+ if (_midiData) {
+ memcpy(_midiData, stream, size);
+ _mutex.lock();
+ _parser->loadMusic(_midiData, size);
+ _parser->setTrack(0);
+ _isLooping = true;
+ _isPlaying = true;
+ _mutex.unlock();
+ }
+}
+
+void MidiPlayer::stop() {
+ _mutex.lock();
+ if (_isPlaying) {
+ _isPlaying = false;
+ _parser->unloadMusic();
+ free(_midiData);
+ _midiData = 0;
+ }
+ _mutex.unlock();
+}
+
+void MidiPlayer::pause(bool p) {
+ _paused = p;
+
+ for (int i = 0; i < NUM_CHANNELS; ++i) {
+ if (_channelsTable[i]) {
+ _channelsTable[i]->volume(_paused ? 0 : _channelsVolume[i] * _masterVolume / 255);
+ }
+ }
+}
+
+void MidiPlayer::updateTimer() {
+ if (_paused) {
+ return;
+ }
+
+ _mutex.lock();
+ if (_isPlaying) {
+ _parser->onTimer();
+ }
+ _mutex.unlock();
+}
+
+void MidiPlayer::adjustVolume(int diff) {
+ setVolume(_masterVolume + diff);
+}
+
+void MidiPlayer::setVolume(int volume) {
+ _masterVolume = CLIP(volume, 0, 255);
+ _mutex.lock();
+ for (int i = 0; i < NUM_CHANNELS; ++i) {
+ if (_channelsTable[i]) {
+ _channelsTable[i]->volume(_channelsVolume[i] * _masterVolume / 255);
+ }
+ }
+ _mutex.unlock();
+}
+
+int MidiPlayer::open() {
+ _driver->open();
+
+ _parser = MidiParser::createParser_SMF();
+ _parser->setMidiDriver(this);
+ _parser->setTimerRate(_driver->getBaseTempo());
+ _driver->setTimerCallback(this, &timerCallback);
+
+ return 0;
+}
+
+void MidiPlayer::close() {
+ stop();
+ _mutex.lock();
+ _driver->setTimerCallback(NULL, NULL);
+ _driver->close();
+ delete _driver;
+ _driver = 0;
+ _parser->setMidiDriver(NULL);
+ delete _parser;
+ _mutex.unlock();
+}
+
+void MidiPlayer::send(uint32 b) {
+ byte volume, ch = (byte)(b & 0xF);
+ switch (b & 0xFFF0) {
+ case 0x07B0: // volume change
+ volume = (byte)((b >> 16) & 0x7F);
+ _channelsVolume[ch] = volume;
+ volume = volume * _masterVolume / 255;
+ b = (b & 0xFF00FFFF) | (volume << 16);
+ break;
+ case 0x7BB0: // all notes off
+ if (!_channelsTable[ch]) {
+ // channel not yet allocated, no need to send the event
+ return;
+ }
+ break;
+ }
+
+ if (!_channelsTable[ch]) {
+ _channelsTable[ch] = (ch == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
+ }
+ if (_channelsTable[ch]) {
+ _channelsTable[ch]->send(b);
+ }
+}
+
+void MidiPlayer::metaEvent(byte type, byte *data, uint16 length) {
+ switch (type) {
+ case 0x2F: // end of Track
+ if (_isLooping) {
+ _parser->jumpToTick(0);
+ } else {
+ stop();
+ }
+ break;
+ default:
+// warning("Unhandled meta event: %02x", type);
+ break;
+ }
+}
+
+void MidiPlayer::timerCallback(void *p) {
+ MidiPlayer *player = (MidiPlayer *)p;
+
+ player->updateTimer();
+}
+
+SoundHandler::SoundHandler(HugoEngine &vm) : _vm(vm) {
+ MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
+ MidiDriver *driver = MidiDriver::createMidi(dev);
+
+ _midiPlayer = new MidiPlayer(driver);
+}
+
+void SoundHandler::setMusicVolume() {
+ /* Set the FM music volume from config.mvolume (0..100%) */
+
+ _midiPlayer->setVolume(_config.musicVolume * 255 / 100);
+}
+
+void SoundHandler::stopSound() {
+ /* Stop any sound that might be playing */
+ _vm._mixer->stopAll();
+}
+
+void SoundHandler::stopMusic() {
+ /* Stop any tune that might be playing */
+ _midiPlayer->stop();
+}
+
+void SoundHandler::toggleMusic() {
+// Turn music on and off
+ _config.musicFl = !_config.musicFl;
+
+ _midiPlayer->pause(_config.musicFl);
+}
+
+void SoundHandler::toggleSound() {
+// Turn digitized sound on and off
+ _config.soundFl = !_config.soundFl;
+}
+
+void SoundHandler::playMIDI(sound_pt seq_p, uint16 size) {
+ _midiPlayer->play(seq_p, size);
+}
+
+
+void SoundHandler::playMusic(int16 tune) {
+ /* Read a tune sequence from the sound database and start playing it */
+ sound_pt seqPtr; // Sequence data from file
+ uint16 size; // Size of sequence data
+
+ if (_config.musicFl) {
+ _vm.getGameStatus().song = tune;
+ seqPtr = _vm.file().getSound(tune, &size);
+ playMIDI(seqPtr, size);
+ }
+}
+
+
+void SoundHandler::playSound(int16 sound, stereo_t channel, byte priority) {
+ /* Produce various sound effects on supplied stereo channel(s) */
+ /* Override currently playing sound only if lower or same priority */
+
+ // uint32 dwVolume; // Left, right volume of sound
+ sound_pt sound_p; // Sound data
+ uint16 size; // Size of data
+ static byte curPriority = 0; // Priority of currently playing sound
+ //
+ /* Sound disabled */
+ if (!_config.soundFl || !_vm._mixer->isReady())
+ return;
+ //
+ // // See if last wave still playing - if so, check priority
+ // if (waveOutUnprepareHeader(hwav, lphdr, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING)
+ // if (priority < curPriority) // Don't override unless priority >= current
+ // return;
+ // else
+ // Stop_sound();
+ curPriority = priority;
+ //
+ /* Get sound data */
+ if ((sound_p = _vm.file().getSound(sound, &size)) == NULL)
+ return;
+
+ Audio::AudioStream *stream = Audio::makeRawStream(sound_p, size, 11025, Audio::FLAG_UNSIGNED);
+ _vm._mixer->playStream(Audio::Mixer::kSpeechSoundType, &_soundHandle, stream);
+
+}
+
+void SoundHandler::initSound() {
+ /* Initialize for MCI sound and midi */
+
+ _midiPlayer->open();
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/sound.h b/engines/hugo/sound.h
new file mode 100644
index 0000000000..53a5912a92
--- /dev/null
+++ b/engines/hugo/sound.h
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_SOUND_H
+#define HUGO_SOUND_H
+
+#include "sound/mixer.h"
+
+namespace Hugo {
+
+class MidiPlayer;
+
+class SoundHandler {
+public:
+ SoundHandler(HugoEngine &vm);
+
+ void toggleMusic();
+ void toggleSound();
+ void setMusicVolume();
+ void playMusic(short tune);
+ void playSound(short sound, stereo_t channel, byte priority);
+ void initSound();
+
+private:
+ HugoEngine &_vm;
+ Audio::SoundHandle _soundHandle;
+ MidiPlayer *_midiPlayer;
+
+ void stopSound();
+ void stopMusic();
+ void playMIDI(sound_pt seq_p, uint16 size);
+};
+
+} // End of namespace Hugo
+
+#endif //HUGO_SOUND_H
diff --git a/engines/hugo/util.cpp b/engines/hugo/util.cpp
new file mode 100644
index 0000000000..8c63bedc04
--- /dev/null
+++ b/engines/hugo/util.cpp
@@ -0,0 +1,178 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#include "common/system.h"
+#include "gui/message.h"
+
+#include "hugo/game.h"
+#include "hugo/hugo.h"
+#include "hugo/util.h"
+#include "hugo/sound.h"
+
+namespace Hugo {
+
+int Utils::firstBit(byte data) {
+ /* Returns index (0 to 7) of first 1 in supplied byte, or 8 if not found */
+ int i;
+
+ if (!data)
+ return(8);
+
+ for (i = 0; i < 8; i++) {
+ if ((data << i) & 0x80)
+ break;
+ }
+
+ return(i);
+}
+
+int Utils::lastBit(byte data) {
+ /* Returns index (0 to 7) of last 1 in supplied byte, or 8 if not found */
+ int i;
+ if (!data)
+ return(8);
+
+ for (i = 7; i >= 0; i--) {
+ if ((data << i) & 0x80)
+ break;
+ }
+
+ return(i);
+}
+
+void Utils::reverseByte(byte *data) {
+ /* Reverse the bit order in supplied byte */
+ byte maskIn = 0x80;
+ byte maskOut = 0x01;
+ byte result = 0;
+
+ for (byte i = 0; i < 8; i++, maskIn >>= 1, maskOut <<= 1)
+ if (*data & maskIn)
+ result |= maskOut;
+
+ *data = result;
+}
+
+char *Utils::Box(box_t dismiss, const char *s, ...) {
+ static char buffer[MAX_STRLEN + 1]; // Format text into this
+ va_list marker;
+
+ if (!s) return(NULL); // NULL strings catered for
+
+ if (s[0] == '\0')
+ return(NULL);
+
+ if (strlen(s) > MAX_STRLEN - 100) { // Test length
+ Warn(false, "String too big:\n%s", s);
+ return(NULL);
+ }
+
+ va_start(marker, s);
+ vsprintf(buffer, s, marker); // Format string into buffer
+ va_end(marker);
+
+ //Warn(false, "BOX: %s", buffer);
+ int boxTime = strlen(buffer) * 30;
+ GUI::TimedMessageDialog dialog(buffer, MAX(1500, boxTime));
+ dialog.runModal();
+
+ // TODO: Some boxes (i.e. the combination code for the shed), needs to return an input.
+ return buffer;
+}
+
+void Utils::Warn(bool technote, const char *format, ...) {
+ /* Warning handler. Print supplied message and continue */
+ /* Arguments are same as printf */
+ /* technote TRUE if we are to refer user to technote file */
+ char buffer[WARNLEN];
+ va_list marker;
+
+ va_start(marker, format);
+ vsnprintf(buffer, WARNLEN, format, marker);
+ va_end(marker);
+//// if (technote)
+//// strcat (buffer, sTech);
+ //MessageBeep(MB_ICONEXCLAMATION);
+ //MessageBox(hwnd, buffer, "HugoWin Warning", MB_OK | MB_ICONEXCLAMATION);
+ warning("Hugo warning: %s", buffer);
+}
+
+void Utils::Error(int error_type, const char *format, ...) {
+ /* Fatal error handler. Reset environment, print error and exit */
+ /* Arguments are same as printf */
+ va_list marker;
+ char buffer[ERRLEN + 1];
+ bool fatal = true; // Fatal error, else continue
+
+ switch (error_type) {
+ case FILE_ERR:
+ strcpy(buffer, HugoEngine::get()._textUtil[kErr1]);
+ break;
+ case WRITE_ERR:
+ strcpy(buffer, HugoEngine::get()._textUtil[kErr2]);
+ fatal = false; // Allow continuation
+ break;
+ case PCCH_ERR:
+ strcpy(buffer, HugoEngine::get()._textUtil[kErr3]);
+ break;
+ case HEAP_ERR:
+ strcpy(buffer, HugoEngine::get()._textUtil[kErr4]);
+ break;
+ case SOUND_ERR:
+ strcpy(buffer, HugoEngine::get()._textUtil[kErr5]);
+ break;
+ default:
+ strcpy(buffer, HugoEngine::get()._textUtil[kErr6]);
+ break;
+ }
+
+ if (fatal)
+ HugoEngine::get().shutdown(); // Restore any devices before exit
+
+ va_start(marker, format);
+ vsnprintf(&buffer[strlen(buffer)], ERRLEN - strlen(buffer), format, marker);
+ va_end(marker);
+ //MessageBeep(MB_ICONEXCLAMATION);
+ //MessageBox(hwnd, buffer, "HugoWin Error", MB_OK | MB_ICONEXCLAMATION);
+ warning("Hugo Error: %s", buffer);
+
+ if (fatal)
+ exit(1);
+}
+
+void Utils::gameOverMsg(void) {
+ // Print options for user when dead
+ //MessageBox(hwnd, gameoverstring, "Be more careful next time!", MB_OK | MB_ICONINFORMATION);
+ warning("STUB: Gameover_msg(): %s", HugoEngine::get()._textUtil[kGameOver]);
+}
+
+} // End of namespace Hugo
diff --git a/engines/hugo/util.h b/engines/hugo/util.h
new file mode 100644
index 0000000000..f944baa324
--- /dev/null
+++ b/engines/hugo/util.h
@@ -0,0 +1,63 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef HUGO_UTIL_H
+#define HUGO_UTIL_H
+
+namespace Hugo {
+
+enum seqTextUtil {
+ kTech = 0,
+ kErr1 = 1,
+ kErr2 = 2,
+ kErr3 = 3,
+ kErr4 = 4,
+ kErr5 = 5,
+ kErr6 = 6,
+ kGameOver = 7
+// kObsoleteErr1 = 8,
+// kObsoleteErr2 = 9
+};
+
+namespace Utils {
+int firstBit(byte data);
+int lastBit(byte data);
+void reverseByte(byte *data);
+void Warn(bool technote, const char *format, ...) GCC_PRINTF(2, 3);
+void Error(int code, const char *format, ...) GCC_PRINTF(2, 3);
+void gameOverMsg();
+char *Box(box_t, const char *, ...) GCC_PRINTF(2, 3);
+}
+
+} // End of namespace Hugo
+
+#endif
diff --git a/engines/kyra/debugger.cpp b/engines/kyra/debugger.cpp
index 225b44b3f4..fc509700d7 100644
--- a/engines/kyra/debugger.cpp
+++ b/engines/kyra/debugger.cpp
@@ -76,7 +76,7 @@ bool Debugger::cmd_loadPalette(int argc, const char **argv) {
return true;
}
- if (_vm->gameFlags().gameID != GI_KYRA1 && _vm->resource()->getFileSize(argv[1]) != 768) {
+ if (_vm->game() != GI_KYRA1 && _vm->resource()->getFileSize(argv[1]) != 768) {
uint8 buffer[320*200];
_vm->screen()->copyRegionToBuffer(5, 0, 0, 320, 200, buffer);
_vm->screen()->loadBitmap(argv[1], 5, 5, 0);
diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp
index 135a9ae7b2..875b49b62d 100644
--- a/engines/kyra/detection.cpp
+++ b/engines/kyra/detection.cpp
@@ -43,6 +43,13 @@ struct KYRAGameDescription {
#include "kyra/detection_tables.h"
+namespace {
+
+const char * const directoryGlobs[] = {
+ "malcolm",
+ 0
+};
+
const ADParams detectionParams = {
// Pointer to ADGameDescription or its superset structure
(const byte *)adGameDescs,
@@ -63,11 +70,13 @@ const ADParams detectionParams = {
// Additional GUI options (for every game}
Common::GUIO_NONE,
// Maximum directory depth
- 1,
+ 2,
// List of directory globs
- 0
+ directoryGlobs
};
+} // End of anonymous namespace
+
class KyraMetaEngine : public AdvancedMetaEngine {
public:
KyraMetaEngine() : AdvancedMetaEngine(detectionParams) {}
diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h
index 8eabb15264..2e1d5afc17 100644
--- a/engines/kyra/detection_tables.h
+++ b/engines/kyra/detection_tables.h
@@ -194,7 +194,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::EN_ANY,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH
+ Common::GUIO_NOSPEECH | Common::GUIO_MIDIAMIGA
},
KYRA1_AMIGA_FLAGS
},
@@ -211,7 +211,7 @@ const KYRAGameDescription adGameDescs[] = {
Common::DE_DEU,
Common::kPlatformAmiga,
ADGF_NO_FLAGS,
- Common::GUIO_NOSPEECH
+ Common::GUIO_NOSPEECH | Common::GUIO_MIDIAMIGA
},
KYRA1_AMIGA_FLAGS
},
diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp
index 9f5d29d7b9..f0eb25190b 100644
--- a/engines/kyra/gui.cpp
+++ b/engines/kyra/gui.cpp
@@ -92,7 +92,7 @@ void GUI::initMenu(Menu &menu) {
textY = menu.y + menu.titleY;
- if (_vm->gameFlags().gameID == GI_LOL) {
+ if (_vm->game() == GI_LOL) {
printMenuText(getMenuTitle(menu), textX, textY, menu.textColor, 0, 9);
} else {
if (_vm->gameFlags().platform != Common::kPlatformAmiga)
@@ -136,7 +136,7 @@ void GUI::initMenu(Menu &menu) {
textX = getMenuCenterStringX(getMenuItemTitle(menu.item[i]), x1, x2);
textY = y1 + 2;
- if (_vm->gameFlags().gameID == GI_LOL) {
+ if (_vm->game() == GI_LOL) {
textY++;
if (i == menu.highlightedItem)
printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].highlightColor, 0, 8);
@@ -162,7 +162,7 @@ void GUI::initMenu(Menu &menu) {
for (int i = 0; i < menu.numberOfItems; ++i) {
if (getMenuItemLabel(menu.item[i])) {
- if (_vm->gameFlags().gameID == GI_LOL) {
+ if (_vm->game() == GI_LOL) {
menu.item[i].labelX = menu.item[i].x - 1;
menu.item[i].labelY = menu.item[i].y + 3;
printMenuText(getMenuItemLabel(menu.item[i]), menu.x + menu.item[i].labelX, menu.y + menu.item[i].labelY, menu.item[i].textColor, 0, 10);
@@ -206,7 +206,7 @@ void GUI::processHighlights(Menu &menu) {
int mouseX = p.x;
int mouseY = p.y;
- if (_vm->_flags.gameID == GI_LOL && menu.highlightedItem != 255) {
+ if (_vm->game() == GI_LOL && menu.highlightedItem != 255) {
// LoL doesnt't have default highlighted items.
// We use a highlightedItem value of 255 for this.
@@ -230,8 +230,8 @@ void GUI::processHighlights(Menu &menu) {
if (mouseX > x1 && mouseX < x2 &&
mouseY > y1 && mouseY < y2) {
- if (menu.highlightedItem != i || _vm->_flags.gameID == GI_LOL) {
- if (_vm->_flags.gameID != GI_LOL) {
+ if (menu.highlightedItem != i || _vm->game() == GI_LOL) {
+ if (_vm->game() != GI_LOL) {
if (menu.item[menu.highlightedItem].enabled)
redrawText(menu);
}
@@ -260,7 +260,7 @@ void GUI::redrawText(const Menu &menu) {
textX = getMenuCenterStringX(getMenuItemTitle(menu.item[i]), x1, x2);
int textY = y1 + 2;
- if (_vm->gameFlags().gameID == GI_LOL) {
+ if (_vm->game() == GI_LOL) {
textY++;
printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].textColor, 0, 8);
} else {
@@ -290,7 +290,7 @@ void GUI::redrawHighlight(const Menu &menu) {
int textY = y1 + 2;
- if (_vm->gameFlags().gameID == GI_LOL) {
+ if (_vm->game() == GI_LOL) {
textY++;
printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].highlightColor, 0, 8);
} else {
@@ -399,7 +399,7 @@ void GUI::updateSaveList(bool excludeQuickSaves) {
int GUI::getNextSavegameSlot() {
Common::InSaveFile *in;
- int start = _vm->gameFlags().gameID == GI_LOL ? 0 : 1;
+ int start = _vm->game() == GI_LOL ? 0 : 1;
for (int i = start; i < 990; i++) {
if ((in = _vm->_saveFileMan->openForLoading(_vm->getSavegameFilename(i))))
diff --git a/engines/kyra/kyra_mr.cpp b/engines/kyra/kyra_mr.cpp
index 2169e5283f..c224a76385 100644
--- a/engines/kyra/kyra_mr.cpp
+++ b/engines/kyra/kyra_mr.cpp
@@ -654,8 +654,6 @@ void KyraEngine_MR::startup() {
_invWsa->open("MOODOMTR.WSA", 1, 0);
_invWsaFrame = 6;
saveGameState(0, "New Game", 0);
- _soundDigital->beginFadeOut(_musicSoundChannel, 60);
- delayWithTicks(60);
if (_gameToLoad == -1)
enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1);
else
diff --git a/engines/kyra/resource.cpp b/engines/kyra/resource.cpp
index efc1b16c9b..63b8072654 100644
--- a/engines/kyra/resource.cpp
+++ b/engines/kyra/resource.cpp
@@ -38,6 +38,11 @@ namespace Kyra {
Resource::Resource(KyraEngine_v1 *vm) : _archiveCache(), _files(), _archiveFiles(), _protectedFiles(), _loaders(), _vm(vm) {
initializeLoaders();
+ // Initialize directories for playing from CD or with original
+ // directory structure
+ if (_vm->game() == GI_KYRA3)
+ SearchMan.addSubDirectoryMatching(Common::FSNode(ConfMan.get("path")), "malcolm");
+
_files.add("global_search", &Common::SearchManager::instance(), 3, false);
// compressed installer archives are added at level '2',
// but that's done in Resource::reset not here
@@ -70,7 +75,7 @@ bool Resource::reset() {
// List of files in the talkie version, which can never be unload.
static const char * const list[] = {
"ADL.PAK", "CHAPTER1.VRM", "COL.PAK", "FINALE.PAK", "INTRO1.PAK", "INTRO2.PAK",
- "INTRO3.PAK", "INTRO4.PAK", "MISC.PAK", "SND.PAK", "STARTUP.PAK", "XMI.PAK",
+ "INTRO3.PAK", "INTRO4.PAK", "MISC.PAK", "SND.PAK", "STARTUP.PAK", "XMI.PAK",
"CAVE.APK", "DRAGON1.APK", "DRAGON2.APK", "LAGOON.APK", 0
};
@@ -148,7 +153,7 @@ bool Resource::loadPakFile(Common::String filename) {
return loadPakFile(filename, file);
}
-bool Resource::loadPakFile(Common::String name, Common::SharedPtr<Common::ArchiveMember> file) {
+bool Resource::loadPakFile(Common::String name, Common::ArchiveMemberPtr file) {
name.toUppercase();
if (_archiveFiles.hasArchive(name) || _protectedFiles.hasArchive(name))
@@ -314,7 +319,7 @@ Common::SeekableReadStream *Resource::createReadStream(const Common::String &fil
return _files.createReadStreamForMember(file);
}
-Common::Archive *Resource::loadArchive(const Common::String &name, Common::SharedPtr<Common::ArchiveMember> member) {
+Common::Archive *Resource::loadArchive(const Common::String &name, Common::ArchiveMemberPtr member) {
ArchiveMap::iterator cachedArchive = _archiveCache.find(name);
if (cachedArchive != _archiveCache.end())
return cachedArchive->_value;
diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h
index d572c1ac54..8372bf9ad1 100644
--- a/engines/kyra/resource.h
+++ b/engines/kyra/resource.h
@@ -55,7 +55,7 @@ public:
bool reset();
bool loadPakFile(Common::String filename);
- bool loadPakFile(Common::String name, Common::SharedPtr<Common::ArchiveMember> file);
+ bool loadPakFile(Common::String name, Common::ArchiveMemberPtr file);
void unloadPakFile(Common::String filename, bool remFromCache = false);
@@ -86,7 +86,7 @@ protected:
Common::SearchSet _archiveFiles;
Common::SearchSet _protectedFiles;
- Common::Archive *loadArchive(const Common::String &name, Common::SharedPtr<Common::ArchiveMember> member);
+ Common::Archive *loadArchive(const Common::String &name, Common::ArchiveMemberPtr member);
Common::Archive *loadInstallerArchive(const Common::String &file, const Common::String &ext, const uint8 offset);
bool loadProtectedFiles(const char * const * list);
diff --git a/engines/kyra/resource_intern.cpp b/engines/kyra/resource_intern.cpp
index 1021cface5..0d968de9ff 100644
--- a/engines/kyra/resource_intern.cpp
+++ b/engines/kyra/resource_intern.cpp
@@ -35,16 +35,8 @@ namespace Kyra {
// -> PlainArchive implementation
-PlainArchive::PlainArchive(Common::SharedPtr<Common::ArchiveMember> file, const FileInputList &files)
+PlainArchive::PlainArchive(Common::ArchiveMemberPtr file)
: _file(file), _files() {
- for (FileInputList::const_iterator i = files.begin(); i != files.end(); ++i) {
- Entry entry;
-
- entry.offset = i->offset;
- entry.size = i->size;
-
- _files[i->name] = entry;
- }
}
bool PlainArchive::hasFile(const Common::String &name) {
@@ -81,6 +73,99 @@ Common::SeekableReadStream *PlainArchive::createReadStreamForMember(const Common
return new Common::SeekableSubReadStream(parent, fDesc->_value.offset, fDesc->_value.offset + fDesc->_value.size, DisposeAfterUse::YES);
}
+void PlainArchive::addFileEntry(const Common::String &name, const Entry entry) {
+ _files[name] = entry;
+}
+
+PlainArchive::Entry PlainArchive::getFileEntry(const Common::String &name) const {
+ FileMap::const_iterator fDesc = _files.find(name);
+ if (fDesc == _files.end())
+ return Entry();
+ return fDesc->_value;
+}
+
+// -> TlkArchive implementation
+
+TlkArchive::TlkArchive(Common::ArchiveMemberPtr file, uint16 entryCount, const uint32 *fileEntries)
+ : _file(file), _entryCount(entryCount), _fileEntries(fileEntries) {
+}
+
+TlkArchive::~TlkArchive() {
+ delete[] _fileEntries;
+}
+
+bool TlkArchive::hasFile(const Common::String &name) {
+ return (findFile(name) != 0);
+}
+
+int TlkArchive::listMembers(Common::ArchiveMemberList &list) {
+ uint count = 0;
+
+ for (; count < _entryCount; ++count) {
+ const Common::String name = Common::String::printf("%08u.AUD", _fileEntries[count * 2 + 0]);
+ list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(name, this)));
+ }
+
+ return count;
+}
+
+Common::ArchiveMemberPtr TlkArchive::getMember(const Common::String &name) {
+ if (!hasFile(name))
+ return Common::ArchiveMemberPtr();
+
+ return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+}
+
+Common::SeekableReadStream *TlkArchive::createReadStreamForMember(const Common::String &name) const {
+ const uint32 *fileDesc = findFile(name);
+ if (!fileDesc)
+ return 0;
+
+ Common::SeekableReadStream *parent = _file->createReadStream();
+ if (!parent)
+ return 0;
+
+ parent->seek(fileDesc[1], SEEK_SET);
+ const uint32 size = parent->readUint32LE();
+ const uint32 fileStart = fileDesc[1] + 4;
+
+ return new Common::SeekableSubReadStream(parent, fileStart, fileStart + size, DisposeAfterUse::YES);
+}
+
+const uint32 *TlkArchive::findFile(const Common::String &name) const {
+ Common::String uppercaseName = name;
+ uppercaseName.toUppercase();
+
+ if (!uppercaseName.hasSuffix(".AUD"))
+ return 0;
+
+ uint32 id;
+ if (sscanf(uppercaseName.c_str(), "%08u.AUD", &id) != 1)
+ return 0;
+
+ // Binary search for the file entry
+ int leftIndex = 0;
+ int rightIndex = _entryCount - 1;
+
+ while (leftIndex <= rightIndex) {
+ int mid = (leftIndex + rightIndex) / 2;
+
+ const uint32 key = _fileEntries[mid * 2];
+ if (key == id) {
+ // Found
+ return &_fileEntries[mid * 2];
+ } else if (key > id) {
+ // Take the left sub-tree
+ rightIndex = mid - 1;
+ } else {
+ // Take the right sub-tree
+ leftIndex = mid + 1;
+ }
+ }
+
+ return 0;
+}
+
// -> CachedArchive implementation
CachedArchive::CachedArchive(const FileInputList &files)
@@ -142,6 +227,20 @@ bool ResLoaderPak::checkFilename(Common::String filename) const {
return (filename.hasSuffix(".PAK") || filename.hasSuffix(".APK") || filename.hasSuffix(".VRM") || filename.hasSuffix(".CMP") || filename.hasSuffix(".TLK") || filename.equalsIgnoreCase(StaticResource::staticDataFilename()));
}
+namespace {
+
+Common::String readString(Common::SeekableReadStream &stream) {
+ Common::String result;
+ char c = 0;
+
+ while ((c = stream.readByte()) != 0)
+ result += c;
+
+ return result;
+}
+
+} // end of anonymous namespace
+
bool ResLoaderPak::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const {
int32 filesize = stream.size();
if (filesize < 0)
@@ -163,12 +262,7 @@ bool ResLoaderPak::isLoadable(const Common::String &filename, Common::SeekableRe
if (offset < stream.pos() || offset > filesize || offset < 0)
return false;
- byte c = 0;
-
- file.clear();
-
- while (!stream.eos() && (c = stream.readByte()) != 0)
- file += c;
+ file = readString(stream);
if (stream.eos())
return false;
@@ -191,34 +285,15 @@ bool ResLoaderPak::isLoadable(const Common::String &filename, Common::SeekableRe
return true;
}
-namespace {
-
-Common::String readString(Common::SeekableReadStream &stream) {
- Common::String result;
- char c = 0;
-
- while ((c = stream.readByte()) != 0)
- result += c;
-
- return result;
-}
-
-struct PlainArchiveListSearch {
- PlainArchiveListSearch(const Common::String &search) : _search(search) {}
-
- bool operator()(const PlainArchive::InputEntry &entry) {
- return _search.equalsIgnoreCase(entry.name);
- }
- Common::String _search;
-};
-
-} // end of anonymous namespace
-
-Common::Archive *ResLoaderPak::load(Common::SharedPtr<Common::ArchiveMember> memberFile, Common::SeekableReadStream &stream) const {
+Common::Archive *ResLoaderPak::load(Common::ArchiveMemberPtr memberFile, Common::SeekableReadStream &stream) const {
int32 filesize = stream.size();
if (filesize < 0)
return 0;
+ Common::ScopedPtr<PlainArchive> result(new PlainArchive(memberFile));
+ if (!result)
+ return 0;
+
int32 startoffset = 0, endoffset = 0;
bool switchEndian = false;
bool firstFile = true;
@@ -229,8 +304,6 @@ Common::Archive *ResLoaderPak::load(Common::SharedPtr<Common::ArchiveMember> mem
startoffset = SWAP_BYTES_32(startoffset);
}
- PlainArchive::FileInputList files;
-
Common::String file;
while (!stream.eos()) {
// The start offset of a file should never be in the filelist
@@ -239,11 +312,7 @@ Common::Archive *ResLoaderPak::load(Common::SharedPtr<Common::ArchiveMember> mem
return 0;
}
- file.clear();
- byte c = 0;
-
- while (!stream.eos() && (c = stream.readByte()) != 0)
- file += c;
+ file = readString(stream);
if (stream.eos()) {
warning("PAK file '%s' is corrupted", memberFile->getDisplayName().c_str());
@@ -271,14 +340,8 @@ Common::Archive *ResLoaderPak::load(Common::SharedPtr<Common::ArchiveMember> mem
if (!endoffset)
endoffset = filesize;
- if (startoffset != endoffset) {
- PlainArchive::InputEntry entry;
- entry.size = endoffset - startoffset;
- entry.offset = startoffset;
- entry.name = file;
-
- files.push_back(entry);
- }
+ if (startoffset != endoffset)
+ result->addFileEntry(file, PlainArchive::Entry(startoffset, endoffset - startoffset));
if (endoffset == filesize)
break;
@@ -286,38 +349,32 @@ Common::Archive *ResLoaderPak::load(Common::SharedPtr<Common::ArchiveMember> mem
startoffset = endoffset;
}
- PlainArchive::FileInputList::const_iterator iter = Common::find_if(files.begin(), files.end(), PlainArchiveListSearch("LINKLIST"));
- if (iter != files.end()) {
- stream.seek(iter->offset, SEEK_SET);
+ PlainArchive::Entry linklistFile = result->getFileEntry("LINKLIST");
+ if (linklistFile.size != 0) {
+ stream.seek(linklistFile.offset, SEEK_SET);
- uint32 magic = stream.readUint32BE();
+ const uint32 magic = stream.readUint32BE();
if (magic != MKID_BE('SCVM'))
error("LINKLIST file does not contain 'SCVM' header");
- uint32 links = stream.readUint32BE();
- for (uint i = 0; i < links; ++i) {
- Common::String linksTo = readString(stream);
- uint32 sources = stream.readUint32BE();
+ const uint32 links = stream.readUint32BE();
+ for (uint32 i = 0; i < links; ++i) {
+ const Common::String linksTo = readString(stream);
+ const uint32 sources = stream.readUint32BE();
- iter = Common::find_if(files.begin(), files.end(), PlainArchiveListSearch(linksTo));
- if (iter == files.end())
+ PlainArchive::Entry destination = result->getFileEntry(linksTo);
+ if (destination.size == 0)
error("PAK file link destination '%s' not found", linksTo.c_str());
- for (uint j = 0; j < sources; ++j) {
- Common::String dest = readString(stream);
-
- PlainArchive::InputEntry link = *iter;
- link.name = dest;
- files.push_back(link);
-
- // Better safe than sorry, we update the 'iter' value, in case push_back invalidated it
- iter = Common::find_if(files.begin(), files.end(), PlainArchiveListSearch(linksTo));
+ for (uint32 j = 0; j < sources; ++j) {
+ const Common::String dest = readString(stream);
+ result->addFileEntry(dest, destination);
}
}
}
- return new PlainArchive(memberFile, files);
+ return result.release();
}
// -> ResLoaderInsMalcolm implementation
@@ -343,9 +400,11 @@ bool ResLoaderInsMalcolm::isLoadable(const Common::String &filename, Common::See
return (buffer[0] == 0x0D && buffer[1] == 0x0A);
}
-Common::Archive *ResLoaderInsMalcolm::load(Common::SharedPtr<Common::ArchiveMember> memberFile, Common::SeekableReadStream &stream) const {
+Common::Archive *ResLoaderInsMalcolm::load(Common::ArchiveMemberPtr memberFile, Common::SeekableReadStream &stream) const {
Common::List<Common::String> filenames;
- PlainArchive::FileInputList files;
+ Common::ScopedPtr<PlainArchive> result(new PlainArchive(memberFile));
+ if (!result)
+ return 0;
// thanks to eriktorbjorn for this code (a bit modified though)
stream.seek(3, SEEK_SET);
@@ -374,17 +433,14 @@ Common::Archive *ResLoaderInsMalcolm::load(Common::SharedPtr<Common::ArchiveMemb
stream.seek(3, SEEK_SET);
for (Common::List<Common::String>::iterator file = filenames.begin(); file != filenames.end(); ++file) {
- PlainArchive::InputEntry entry;
- entry.size = stream.readUint32LE();
- entry.offset = stream.pos();
- entry.name = *file;
- entry.name.toLowercase();
- stream.seek(entry.size, SEEK_CUR);
-
- files.push_back(entry);
+ const uint32 fileSize = stream.readUint32LE();
+ const uint32 fileOffset = stream.pos();
+
+ result->addFileEntry(*file, PlainArchive::Entry(fileOffset, fileSize));
+ stream.seek(fileSize, SEEK_CUR);
}
- return new PlainArchive(memberFile, files);
+ return result.release();
}
bool ResLoaderTlk::checkFilename(Common::String filename) const {
@@ -412,31 +468,20 @@ bool ResLoaderTlk::isLoadable(const Common::String &filename, Common::SeekableRe
return true;
}
-Common::Archive *ResLoaderTlk::load(Common::SharedPtr<Common::ArchiveMember> file, Common::SeekableReadStream &stream) const {
- uint16 entries = stream.readUint16LE();
- PlainArchive::FileInputList files;
-
- for (uint i = 0; i < entries; ++i) {
- PlainArchive::InputEntry entry;
-
- uint32 resFilename = stream.readUint32LE();
- uint32 resOffset = stream.readUint32LE();
+Common::Archive *ResLoaderTlk::load(Common::ArchiveMemberPtr file, Common::SeekableReadStream &stream) const {
+ const uint16 entryCount = stream.readUint16LE();
- entry.offset = resOffset+4;
+ uint32 *fileEntries = new uint32[entryCount * 2];
+ assert(fileEntries);
+ stream.read(fileEntries, sizeof(uint32) * entryCount * 2);
- char realFilename[20];
- snprintf(realFilename, 20, "%.08u.AUD", resFilename);
- entry.name = realFilename;
-
- uint32 curOffset = stream.pos();
- stream.seek(resOffset, SEEK_SET);
- entry.size = stream.readUint32LE();
- stream.seek(curOffset, SEEK_SET);
-
- files.push_back(entry);
+ for (uint i = 0; i < entryCount; ++i) {
+ fileEntries[i * 2 + 0] = READ_LE_UINT32(&fileEntries[i * 2 + 0]);
+ fileEntries[i * 2 + 1] = READ_LE_UINT32(&fileEntries[i * 2 + 1]);
}
- return new PlainArchive(file, files);
+
+ return new TlkArchive(file, entryCount, fileEntries);
}
// InstallerLoader implementation
diff --git a/engines/kyra/resource_intern.h b/engines/kyra/resource_intern.h
index bceccc34b7..16f3a1fe91 100644
--- a/engines/kyra/resource_intern.h
+++ b/engines/kyra/resource_intern.h
@@ -38,33 +38,49 @@ class Resource;
class PlainArchive : public Common::Archive {
public:
- struct InputEntry {
- Common::String name;
+ struct Entry {
+ Entry() : offset(0), size(0) {}
+ Entry(uint32 o, uint32 s) : offset(o), size(s) {}
uint32 offset;
uint32 size;
};
- typedef Common::List<InputEntry> FileInputList;
+ PlainArchive(Common::ArchiveMemberPtr file);
- PlainArchive(Common::SharedPtr<Common::ArchiveMember> file, const FileInputList &files);
+ void addFileEntry(const Common::String &name, const Entry entry);
+ Entry getFileEntry(const Common::String &name) const;
+ // Common::Archive API implementation
bool hasFile(const Common::String &name);
int listMembers(Common::ArchiveMemberList &list);
Common::ArchiveMemberPtr getMember(const Common::String &name);
Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const;
private:
- struct Entry {
- uint32 offset;
- uint32 size;
- };
-
typedef Common::HashMap<Common::String, Entry, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> FileMap;
- Common::SharedPtr<Common::ArchiveMember> _file;
+ Common::ArchiveMemberPtr _file;
FileMap _files;
};
+class TlkArchive : public Common::Archive {
+public:
+ TlkArchive(Common::ArchiveMemberPtr file, uint16 entryCount, const uint32 *fileEntries);
+ ~TlkArchive();
+
+ bool hasFile(const Common::String &name);
+ int listMembers(Common::ArchiveMemberList &list);
+ Common::ArchiveMemberPtr getMember(const Common::String &name);
+ Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const;
+private:
+ Common::ArchiveMemberPtr _file;
+
+ const uint32 *findFile(const Common::String &name) const;
+
+ const uint16 _entryCount;
+ const uint32 * const _fileEntries;
+};
+
class CachedArchive : public Common::Archive {
public:
struct InputEntry {
@@ -99,28 +115,28 @@ public:
virtual ~ResArchiveLoader() {}
virtual bool checkFilename(Common::String filename) const = 0;
virtual bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const = 0;
- virtual Common::Archive *load(Common::SharedPtr<Common::ArchiveMember> file, Common::SeekableReadStream &stream) const = 0;
+ virtual Common::Archive *load(Common::ArchiveMemberPtr file, Common::SeekableReadStream &stream) const = 0;
};
class ResLoaderPak : public ResArchiveLoader {
public:
bool checkFilename(Common::String filename) const;
bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const;
- Common::Archive *load(Common::SharedPtr<Common::ArchiveMember> file, Common::SeekableReadStream &stream) const;
+ Common::Archive *load(Common::ArchiveMemberPtr file, Common::SeekableReadStream &stream) const;
};
class ResLoaderInsMalcolm : public ResArchiveLoader {
public:
bool checkFilename(Common::String filename) const;
bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const;
- Common::Archive *load(Common::SharedPtr<Common::ArchiveMember> file, Common::SeekableReadStream &stream) const;
+ Common::Archive *load(Common::ArchiveMemberPtr file, Common::SeekableReadStream &stream) const;
};
class ResLoaderTlk : public ResArchiveLoader {
public:
bool checkFilename(Common::String filename) const;
bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const;
- Common::Archive *load(Common::SharedPtr<Common::ArchiveMember> file, Common::SeekableReadStream &stream) const;
+ Common::Archive *load(Common::ArchiveMemberPtr file, Common::SeekableReadStream &stream) const;
};
class InstallerLoader {
diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp
index ade9886c2e..e09cc8123c 100644
--- a/engines/kyra/screen.cpp
+++ b/engines/kyra/screen.cpp
@@ -40,7 +40,7 @@ namespace Kyra {
Screen::Screen(KyraEngine_v1 *vm, OSystem *system)
: _system(system), _vm(vm), _sjisInvisibleColor(0),
- _cursorColorKey((vm->gameFlags().gameID == GI_KYRA1) ? 0xFF : 0x00) {
+ _cursorColorKey((vm->game() == GI_KYRA1) ? 0xFF : 0x00) {
_debugEnabled = false;
_maskMinY = _maskMaxY = -1;
@@ -86,7 +86,7 @@ bool Screen::init() {
if (_vm->gameFlags().useHiResOverlay) {
_useOverlays = true;
_useSJIS = (_vm->gameFlags().lang == Common::JA_JPN);
- _sjisInvisibleColor = (_vm->gameFlags().gameID == GI_KYRA1) ? 0x80 : 0xF6;
+ _sjisInvisibleColor = (_vm->game() == GI_KYRA1) ? 0x80 : 0xF6;
for (int i = 0; i < SCREEN_OVLS_NUM; ++i) {
if (!_sjisOverlayPtrs[i]) {
@@ -1300,7 +1300,7 @@ void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int
_dsScaleH = 0x100;
}
- if ((flags & 0x2000) && _vm->gameFlags().gameID != GI_KYRA1)
+ if ((flags & 0x2000) && _vm->game() != GI_KYRA1)
_dsTable5 = va_arg(args, uint8 *);
static const DsMarginSkipFunc dsMarginFunc[] = {
@@ -1436,7 +1436,7 @@ void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int
uint16 frameSize = READ_LE_UINT16(src); src += 2;
- int colorTableColors = ((_vm->gameFlags().gameID != GI_KYRA1) && (shapeFlags & 4)) ? *src++ : 16;
+ int colorTableColors = ((_vm->game() != GI_KYRA1) && (shapeFlags & 4)) ? *src++ : 16;
if (!(flags & 0x8000) && (shapeFlags & 1))
_dsTable2 = src;
@@ -3016,10 +3016,10 @@ byte *Screen::getOverlayPtr(int page) {
else if (page == 2 || page == 3)
return _sjisOverlayPtrs[2];
- if (_vm->gameFlags().gameID == GI_KYRA2) {
+ if (_vm->game() == GI_KYRA2) {
if (page == 12 || page == 13)
return _sjisOverlayPtrs[3];
- } else if (_vm->gameFlags().gameID == GI_LOL) {
+ } else if (_vm->game() == GI_LOL) {
if (page == 4 || page == 5)
return _sjisOverlayPtrs[3];
if (page == 6 || page == 7)
diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp
index 3907f844cb..216bf07f6f 100644
--- a/engines/kyra/screen_v2.cpp
+++ b/engines/kyra/screen_v2.cpp
@@ -53,7 +53,7 @@ uint8 *Screen_v2::generateOverlay(const Palette &pal, uint8 *buffer, int opColor
int maxIndex = maxColor;
if (maxIndex == -1) {
- if (_vm->gameFlags().gameID == GI_LOL) {
+ if (_vm->game() == GI_LOL) {
if (_use16ColorMode)
maxIndex = 255;
else
diff --git a/engines/kyra/script_tim.cpp b/engines/kyra/script_tim.cpp
index 20bc8abec5..907c5ee7bd 100644
--- a/engines/kyra/script_tim.cpp
+++ b/engines/kyra/script_tim.cpp
@@ -95,7 +95,7 @@ TIMInterpreter::TIMInterpreter(KyraEngine_v1 *engine, Screen_v2 *screen_v2, OSys
_textDisplayed = false;
_textAreaBuffer = new uint8[320*40];
assert(_textAreaBuffer);
- if ((_vm->gameFlags().platform == Common::kPlatformPC98 || _vm->gameFlags().isDemo) && _vm->gameFlags().gameID == GI_LOL)
+ if ((_vm->gameFlags().platform == Common::kPlatformPC98 || _vm->gameFlags().isDemo) && _vm->game() == GI_LOL)
_drawPage2 = 0;
else
_drawPage2 = 8;
@@ -176,7 +176,7 @@ TIM *TIMInterpreter::load(const char *filename, const Common::Array<const TIMOpc
Common::strlcpy(_tim->filename, filename, 13);
- _tim->isLoLOutro = (_vm->gameFlags().gameID == GI_LOL) && !scumm_stricmp(filename, "LOLFINAL.TIM");
+ _tim->isLoLOutro = (_vm->game() == GI_LOL) && !scumm_stricmp(filename, "LOLFINAL.TIM");
_tim->lolCharacter = 0;
TIM *r = _tim;
@@ -467,7 +467,7 @@ void TIMInterpreter::setupTextPalette(uint index, int fadePalette) {
int TIMInterpreter::initAnimStruct(int index, const char *filename, int x, int y, int, int offscreenBuffer, uint16 wsaFlags) {
Movie *wsa = 0;
- const bool isLoLDemo = _vm->gameFlags().isDemo && _vm->gameFlags().gameID == GI_LOL;
+ const bool isLoLDemo = _vm->gameFlags().isDemo && _vm->game() == GI_LOL;
if (isLoLDemo || _vm->gameFlags().platform == Common::kPlatformPC98 || _currentTim->isLoLOutro)
_drawPage2 = 0;
@@ -755,7 +755,7 @@ int TIMInterpreter::cmd_loadSoundFile(const uint16 *param) {
const char *file = (const char *)(_currentTim->text + READ_LE_UINT16(_currentTim->text + (param[0]<<1)));
_vm->sound()->loadSoundFile(file);
- if (_vm->gameFlags().gameID == GI_LOL)
+ if (_vm->game() == GI_LOL)
_vm->sound()->loadSfxFile(file);
return 1;
diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp
index 9ab4aa0053..8458d751de 100644
--- a/engines/kyra/sound_adlib.cpp
+++ b/engines/kyra/sound_adlib.cpp
@@ -2241,7 +2241,7 @@ const int SoundAdLibPC::_kyra1NumSoundTriggers = ARRAYSIZE(SoundAdLibPC::_kyra1S
SoundAdLibPC::SoundAdLibPC(KyraEngine_v1 *vm, Audio::Mixer *mixer)
: Sound(vm, mixer), _driver(0), _trackEntries(), _soundDataPtr(0) {
memset(_trackEntries, 0, sizeof(_trackEntries));
- _v2 = (_vm->gameFlags().gameID == GI_KYRA2) || (_vm->gameFlags().gameID == GI_LOL && !_vm->gameFlags().isDemo);
+ _v2 = (_vm->game() == GI_KYRA2) || (_vm->game() == GI_LOL && !_vm->gameFlags().isDemo);
_driver = new AdLibDriver(mixer, _v2);
assert(_driver);
diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp
index 026c72de26..57da51ab5a 100644
--- a/engines/kyra/sound_midi.cpp
+++ b/engines/kyra/sound_midi.cpp
@@ -519,12 +519,12 @@ bool SoundMidiPC::init() {
if (_nativeMT32 && _type == kMidiMT32) {
const char *midiFile = 0;
const char *pakFile = 0;
- if (_vm->gameFlags().gameID == GI_KYRA1) {
+ if (_vm->game() == GI_KYRA1) {
midiFile = "INTRO";
- } else if (_vm->gameFlags().gameID == GI_KYRA2) {
+ } else if (_vm->game() == GI_KYRA2) {
midiFile = "HOF_SYX";
pakFile = "AUDIO.PAK";
- } else if (_vm->gameFlags().gameID == GI_LOL) {
+ } else if (_vm->game() == GI_LOL) {
midiFile = "LOREINTR";
if (_vm->gameFlags().isDemo) {
@@ -618,7 +618,7 @@ void SoundMidiPC::loadSoundFile(Common::String file) {
// Since KYRA1 uses the same file for SFX and Music
// we setup sfx to play from music file as well
- if (_vm->gameFlags().gameID == GI_KYRA1) {
+ if (_vm->game() == GI_KYRA1) {
for (int i = 0; i < 3; ++i) {
_output->setSoundSource(i+1);
_sfx[i]->loadMusic(_musicFile, fileSize);
@@ -631,7 +631,7 @@ void SoundMidiPC::loadSfxFile(Common::String file) {
Common::StackLock lock(_mutex);
// Kyrandia 1 doesn't use a special sfx file
- if (_vm->gameFlags().gameID == GI_KYRA1)
+ if (_vm->game() == GI_KYRA1)
return;
file = getFileName(file);
diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp
index 750c6edfc2..16004159ab 100644
--- a/engines/kyra/sound_towns.cpp
+++ b/engines/kyra/sound_towns.cpp
@@ -48,6 +48,7 @@ SoundTowns::SoundTowns(KyraEngine_v1 *vm, Audio::Mixer *mixer)
SoundTowns::~SoundTowns() {
AudioCD.stop();
haltTrack();
+ delete _driver;
delete[] _musicTrackData;
delete[] _sfxFileData;
}
@@ -592,7 +593,7 @@ int32 SoundTownsPC98_v2::voicePlay(const char *file, Audio::SoundHandle *handle,
int h = 0;
if (_currentSFX) {
- while (_mixer->isSoundHandleActive(_soundChannels[h]) && h < kNumChannelHandles)
+ while (h < kNumChannelHandles && _mixer->isSoundHandleActive(_soundChannels[h]))
h++;
if (h >= kNumChannelHandles)
return 0;
diff --git a/engines/lure/scripts.cpp b/engines/lure/scripts.cpp
index 41a09e0d1d..20758466ad 100644
--- a/engines/lure/scripts.cpp
+++ b/engines/lure/scripts.cpp
@@ -1297,6 +1297,11 @@ bool HotspotScript::execute(Hotspot *h) {
default:
// Set the animation frame number
+
+ // WORKAROUND: In Lure English EGA, the apparatus in room #30 can be set with an invalid frame number
+ if ((h->hotspotId() == 1059) && (opcode >= h->numFrames()))
+ opcode = h->numFrames() - 1;
+
debugC(ERROR_DETAILED, kLureDebugScripts, "SET FRAME NUMBER = %d", opcode);
h->setFrameNumber(opcode);
diff --git a/engines/m4/globals.h b/engines/m4/globals.h
index 3fc31b4ec2..67dcfc2b94 100644
--- a/engines/m4/globals.h
+++ b/engines/m4/globals.h
@@ -229,7 +229,68 @@ struct MadsConfigData {
#define SET_GLOBAL(x,y) _madsVm->globals()->_globals[x] = y
#define SET_GLOBAL32(x,y) { _madsVm->globals()->_globals[x] = (y) & 0xffff; _madsVm->globals()->_globals[(x) + 1] = (y) >> 16; }
-typedef Common::HashMap<uint16, uint16> IntStorage;
+union DataMapEntry {
+ bool *boolValue;
+ uint16 *uint16Value;
+ int *intValue;
+};
+
+typedef Common::HashMap<uint16, uint16> DataMapHash;
+
+enum DataMapType {BOOL, UINT16, INT};
+
+class DataMapWrapper {
+ friend class DataMap;
+private:
+ DataMapEntry _value;
+ DataMapType _type;
+public:
+ DataMapWrapper(bool *v) { _value.boolValue = v; _type = BOOL; }
+ DataMapWrapper(uint16 *v) { _value.uint16Value = v; _type = UINT16; }
+ DataMapWrapper(int16 *v) { _value.uint16Value = (uint16 *)v; _type = UINT16; }
+ DataMapWrapper(int *v) { _value.intValue = v; _type = INT; }
+
+ uint16 getIntValue() {
+ if (_type == BOOL) return *_value.boolValue ? 0xffff : 0;
+ else if (_type == UINT16) return *_value.uint16Value;
+ else return *_value.intValue;
+ }
+ void setIntValue(uint16 v) {
+ if (_type == BOOL) *_value.boolValue = v != 0;
+ else if (_type == UINT16) *_value.uint16Value = v;
+ else *_value.intValue = v;
+ }
+};
+
+#define MAP_DATA(V) _madsVm->globals()->_dataMap.addMapping(new DataMapWrapper(V))
+
+class DataMap {
+private:
+ DataMapHash _data;
+ Common::Array<DataMapWrapper *> _mapList;
+public:
+ DataMap() {
+ _mapList.push_back(NULL);
+ }
+ ~DataMap() {
+ for (uint i = 1; i < _mapList.size(); ++i)
+ delete _mapList[i];
+ }
+
+ void addMapping(DataMapWrapper *v) { _mapList.push_back(v); }
+ uint16 get(uint16 index) {
+ if (index < _mapList.size())
+ return _mapList[index]->getIntValue();
+
+ return _data[index];
+ }
+ void set(uint16 index, uint16 v) {
+ if (index < _mapList.size())
+ _mapList[index]->setIntValue(v);
+ else
+ _data[index] = v;
+ }
+};
class MadsGlobals : public Globals {
private:
@@ -259,7 +320,7 @@ public:
int previousScene;
int16 _nextSceneId;
uint16 actionNouns[3];
- IntStorage _dataMap;
+ DataMap _dataMap;
int _difficultyLevel;
void loadMadsVocab();
diff --git a/engines/m4/m4.h b/engines/m4/m4.h
index 3174c886d5..b68f7248af 100644
--- a/engines/m4/m4.h
+++ b/engines/m4/m4.h
@@ -96,10 +96,10 @@ class Animation;
enum M4GameType {
GType_Riddle = 1,
- GType_Burger,
- GType_RexNebular,
- GType_DragonSphere,
- GType_Phantom
+ GType_Burger = 2,
+ GType_RexNebular = 3,
+ GType_DragonSphere = 4,
+ GType_Phantom = 5
};
enum Features {
@@ -224,8 +224,10 @@ public:
MadsGlobals *globals() { return (MadsGlobals *)_globals; }
MadsScene *scene() { return (MadsScene *)_scene; }
void startScene(int sceneNum) {
- if (!_scene)
+ if (!_scene) {
_scene = new MadsScene(this);
+ ((MadsScene *)_scene)->initialise();
+ }
_scene->show();
_scene->loadScene(101);
}
diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp
index e7c20b237d..cebe2215ca 100644
--- a/engines/m4/mads_logic.cpp
+++ b/engines/m4/mads_logic.cpp
@@ -24,9 +24,12 @@
*/
#include "m4/m4.h"
+#include "m4/dialogs.h"
#include "m4/mads_logic.h"
#include "m4/scene.h"
+#define MAX_CALL_PARAMS 10
+
namespace M4 {
void MadsGameLogic::initialiseGlobals() {
@@ -139,6 +142,53 @@ void MadsGameLogic::initialiseGlobals() {
/*--------------------------------------------------------------------------*/
+const char *MadsSceneLogic::subFormatList[] = {"scene%d_enter", "scene%d_step", "scene%d_preaction", "scene%d_actions"};
+
+#define OPSIZE8 0x40 ///< when this bit is set - the operand size is 8 bits
+#define OPSIZE16 0x80 ///< when this bit is set - the operand size is 16 bits
+#define OPMASK 0x3F ///< mask to isolate the opcode
+
+enum Opcodes {
+ OP_HALT = 0, OP_IMM = 1, OP_ZERO = 2, OP_ONE = 3, OP_MINUSONE = 4, OP_STR = 5, OP_DLOAD = 6,
+ OP_DSTORE = 7, OP_PAL = 8, OP_LOAD = 9, OP_GLOAD = 10, OP_STORE = 11, OP_GSTORE = 12,
+ OP_CALL = 13, OP_LIBCALL = 14, OP_RET = 15, OP_ALLOC = 16, OP_JUMP = 17, OP_JMPFALSE = 18,
+ OP_JMPTRUE = 19, OP_EQUAL = 20, OP_LESS = 21, OP_LEQUAL = 22, OP_NEQUAL = 23, OP_GEQUAL = 24,
+ OP_GREAT = 25, OP_PLUS = 26, OP_MINUS = 27, OP_LOR = 28, OP_MULT = 29, OP_DIV = 30,
+ OP_MOD = 31, OP_AND = 32, OP_OR = 33, OP_EOR = 34, OP_LAND = 35, OP_NOT = 36, OP_COMP = 37,
+ OP_NEG = 38, OP_DUP = 39,
+ TOTAL_OPCODES = 40
+};
+
+const char *MadsSceneLogic::_opcodeStrings[] = {
+ "HALT", "IMM", "ZERO", "ONE", "MINUSONE", "STR", "DLOAD", "DSTORE", NULL, "LOAD", "GLOAD",
+ "STORE", "GSTORE", "CALL", "LIBCALL", "RET", "ALLOC", "JUMP", "JMPFALSE", "JMPTRUE", "EQUAL",
+ "LESS", "LEQUAL", "NEQUAL", "GEQUAL", "GREAT", "PLUS", "MINUS", "LOR", "MULT", "DIV",
+ "MOD", "AND", "OR", "EOR", "LAND", "NOT", "COMP", "NEG", "DUP"
+};
+
+/**
+ * This method sets up the data map with pointers to all the common game objects. This allows the script engine to
+ * convert game specific offsets for various fields in the original game's data segment into a generic data index
+ * that will be common across all the MADS games
+ */
+void MadsSceneLogic::initialiseDataMap() {
+ // The unique order of these items must be maintained
+ MAP_DATA((uint16 *)&_madsVm->scene()->_abortTimersMode2);
+ MAP_DATA(&_madsVm->scene()->_abortTimers);
+ MAP_DATA(&_madsVm->_player._stepEnabled);
+ MAP_DATA(&_madsVm->scene()->_nextScene);
+ MAP_DATA(&_madsVm->scene()->_previousScene);
+ MAP_DATA(&_madsVm->_player._playerPos.x);
+ MAP_DATA(&_madsVm->_player._playerPos.y);
+ MAP_DATA(&_madsVm->_player._direction);
+ MAP_DATA(&_madsVm->_player._visible);
+ MAP_DATA(&_madsVm->scene()->_animActive);
+}
+
+DataMap &MadsSceneLogic::dataMap() {
+ return _madsVm->globals()->_dataMap;
+}
+
const char *MadsSceneLogic::formAnimName(char sepChar, int16 suffixNum) {
return MADSResourceManager::getResourceName(sepChar, _sceneNumber, EXTTYPE_NONE, NULL, suffixNum);
}
@@ -177,10 +227,6 @@ void MadsSceneLogic::getAnimName() {
strcpy(_madsVm->scene()->_aaName, newName);
}
-IntStorage &MadsSceneLogic::dataMap() {
- return _madsVm->globals()->_dataMap;
-}
-
/*--------------------------------------------------------------------------*/
uint16 MadsSceneLogic::loadSpriteSet(uint16 suffixNum, uint16 sepChar) {
@@ -220,44 +266,6 @@ void MadsSceneLogic::activateHotspot(int idx, bool active) {
// TODO:
}
-void MadsSceneLogic::lowRoomsEntrySound() {
- if (!_madsVm->globals()->_config.musicFlag) {
- _madsVm->_sound->playSound(2);
- } else {
- // Play different sounds for each of the rooms
- switch (_madsVm->globals()->sceneNumber) {
- case 101:
- _madsVm->_sound->playSound(11);
- break;
- case 102:
- _madsVm->_sound->playSound(12);
- break;
- case 103:
- _madsVm->_sound->playSound(3);
- _madsVm->_sound->playSound(25);
- break;
- case 104:
- _madsVm->_sound->playSound(10);
- break;
- case 105:
- if ((_madsVm->globals()->previousScene < 104) || (_madsVm->globals()->previousScene > 108))
- _madsVm->_sound->playSound(10);
- break;
- case 106:
- _madsVm->_sound->playSound(13);
- break;
- case 107:
- _madsVm->_sound->playSound(3);
- break;
- case 108:
- _madsVm->_sound->playSound(15);
- break;
- default:
- break;
- }
- }
-}
-
void MadsSceneLogic::getPlayerSpritesPrefix() {
_madsVm->_sound->playSound(5);
@@ -315,17 +323,107 @@ void MadsSceneLogic::getPlayerSpritesPrefix2() {
/*--------------------------------------------------------------------------*/
/**
- * FIXME:
- * Currently I'm only working at providing manual implementation of the first Rex Nebular scene.
- * It will make more sense to convert the remaining game logic from the games into some
- * kind of bytecode scripts
+ * Loads the MADS.DAT file and loads the script data for the correct game/language
*/
+void MadsSceneLogic::initialiseScripts() {
+ Common::File f;
+ if (!f.open("mads.dat")) {
+ warning("Could not locate mads.dat file");
+ return;
+ }
+
+ // Validate that the file being read is a valid mads.dat file
+ char header[4];
+ f.read(&header[0], 4);
+ if (strncmp(header, "MADS", 4) != 0) {
+ warning("Invalid mads.dat file");
+ return;
+ }
+
+ // Get a list of the offsets of game blocks
+ uint32 v;
+ Common::Array<uint32> offsets;
+ while ((v = f.readUint32LE()) != 0)
+ offsets.push_back(v);
+
+ // Check the header of each block in turn
+ _scriptsData = NULL;
+ _scriptsSize = 0;
+
+ for (uint i = 0; i < offsets.size(); ++i) {
+ // Get the block header
+ f.seek(offsets[i]);
+ byte gameId = f.readByte();
+ byte language = f.readByte();
+ f.readByte(); // Language currently unused
+
+ // If this block isn't for the current game, skip it
+ if (_madsVm->getGameType() != (gameId + 2))
+ continue;
+ if ((language != 1) || (_madsVm->getLanguage() != Common::EN_ANY))
+ continue;
+
+ // Found script block for the given game and language.
+ _scriptsSize = (i < (offsets.size() - 1)) ? offsets[i + 1] - offsets[i] : f.size() - offsets[i];
+ break;
+ }
+
+ if (!_scriptsSize) {
+ warning("Could not find appropriate scripts block for game in mads.dat file");
+ f.close();
+ return;
+ }
+
+ // Load up the list of subroutines into a hash map
+ uint32 blockOffset = f.pos() - 3;
+ uint32 subsStart = 0;
+ for (;;) {
+ // Get next entry
+ Common::String subName;
+ char c;
+ while ((c = (char)f.readByte()) != '\0')
+ subName += c;
+ if (subName.empty())
+ // Reached end of subroutine list
+ break;
+
+ // Read in the offset of the routine
+ uint32 offset = f.readUint32LE();
+ if (_subroutines.empty()) {
+ // The first subroutine offset is used to reduce the amount of data to later load in. In essence,
+ // the subroutine index will not be separately loaded, since it's contents will be in the hash map
+ subsStart = offset;
+ _scriptsSize -= offset;
+ }
+
+ _subroutines[subName] = offset - subsStart;
+ _subroutineOffsets.push_back(offset - subsStart);
+ }
+
+ // Read in the remaining data
+ f.seek(blockOffset + subsStart, SEEK_SET);
+ _scriptsData = (byte *)malloc(_scriptsSize);
+ f.read(_scriptsData, _scriptsSize);
+
+ f.close();
+}
void MadsSceneLogic::selectScene(int sceneNum) {
assert(sceneNum == 101);
_sceneNumber = sceneNum;
Common::set_to(&_spriteIndexes[0], &_spriteIndexes[50], 0);
+
+ // If debugging is turned on, show a debug warning if any of the scene methods aren't present
+ if (gDebugLevel > 0) {
+ for (int i = 0; i < 4; ++i) {
+ char buffer[20];
+ sprintf(buffer, subFormatList[i], sceneNum);
+ Common::HashMap<Common::String, uint32>::iterator it = _subroutines.find(Common::String(buffer));
+ if (it == _subroutines.end())
+ debugC(1, kDebugScript, "Scene method %s not found", buffer);
+ }
+ }
}
void MadsSceneLogic::setupScene() {
@@ -343,149 +441,492 @@ void MadsSceneLogic::setupScene() {
getAnimName();
}
-void MadsSceneLogic::enterScene() {
- for (int i = 1; i <= 7; ++i)
- _spriteIndexes[i - 1] = loadSpriteSet(i, 'x');
- _spriteIndexes[7] = loadSpriteSet(0xFFFF, 'm');
- _spriteIndexes[8] = loadSpriteSet(1, 'b');
- _spriteIndexes[9] = loadSpriteSet(2, 'b');
- _spriteIndexes[10] = loadSpriteSet(0, 'a');
- _spriteIndexes[11] = loadSpriteSet(1, 'a');
- _spriteIndexes[12] = loadSpriteSet(8, 'x');
- _spriteIndexes[13] = loadSpriteSet(0, 'x');
-
- _spriteIndexes[15] = startCycledSpriteSequence(_spriteIndexes[0], false, 5, 0, 0, 25);
- _spriteIndexes[16] = startCycledSpriteSequence(_spriteIndexes[1], false, 4, 0, 1, 0);
- _spriteIndexes[17] = startCycledSpriteSequence(_spriteIndexes[2], false, 4, 0, 1, 0);
-
- _madsVm->scene()->_sequenceList.addSubEntry(_spriteIndexes[17], SM_FRAME_INDEX, 7, 70);
-
- _spriteIndexes[18] = startReversibleSpriteSequence(_spriteIndexes[3], false, 10, 0, 0, 60);
- _spriteIndexes[19] = startCycledSpriteSequence(_spriteIndexes[4], false, 5, 0, 1, 0);
- _spriteIndexes[20] = startCycledSpriteSequence(_spriteIndexes[5], false, 10, 0, 2, 0);
- _spriteIndexes[21] = startCycledSpriteSequence(_spriteIndexes[6], false, 6, 0, 0, 0);
- _spriteIndexes[23] = startCycledSpriteSequence(_spriteIndexes[8], false, 6, 0, 10, 4);
- _spriteIndexes[24] = startCycledSpriteSequence(_spriteIndexes[9], false, 6, 0, 32, 47);
-
- activateHotspot(0x137, false); // SHIELD MODULATOR
- // shield_panel_opened = 0;
-
- if (_madsVm->globals()->previousScene != -1)
- _madsVm->globals()->_globals[10] = 0;
- if (_madsVm->globals()->previousScene != -2) {
- _madsVm->_player._playerPos = Common::Point(100, 152);
- }
-
- if ((_madsVm->globals()->previousScene == 112) ||
- ((_madsVm->globals()->previousScene != -2) && (_spriteIndexes[29] != 0))) {
- // Returning from probe cutscene?
- _spriteIndexes[29] = -1;
- _madsVm->_player._playerPos = Common::Point(161, 123);
- _madsVm->_player._direction = 9;
-
- // TODO: Extra flags setting
- _spriteIndexes[25] = startCycledSpriteSequence(_spriteIndexes[10], false, 3, 0, 0, 0);
- _madsVm->scene()->_sequenceList.setAnimRange(_spriteIndexes[25], 17, 17);
- activateHotspot(0x47, false); // CHAIR
- /*timer_unk1 = */_madsVm->scene()->_dynamicHotspots.add(0x47, 0x13F /*SIT_IN*/, -1,
- Common::Rect(159, 84, 159+33, 84+36));
+/**
+ * Handles the logic when a scene is entered
+ */
+void MadsSceneLogic::doEnterScene() {
+ char buffer[20];
+ sprintf(buffer, subFormatList[SUBFORMAT_ENTER], _sceneNumber);
+ execute(Common::String(buffer));
+}
+
+/**
+ * Handles the script execution which is called regularly every frame
+ */
+void MadsSceneLogic::doSceneStep() {
+ char buffer[20];
+ sprintf(buffer, subFormatList[SUBFORMAT_STEP], _sceneNumber);
+ execute(Common::String(buffer));
+}
+
+/**
+ * Handles and preactions before an action is started
+ */
+void MadsSceneLogic::doPreactions() {
+ char buffer[20];
+ sprintf(buffer, subFormatList[SUBFORMAT_PREACTIONS], _sceneNumber);
+ execute(Common::String(buffer));
+}
+
+/**
+ * Handles any action that has been selected
+ */
+void MadsSceneLogic::doAction() {
+ char buffer[20];
+ sprintf(buffer, subFormatList[SUBFORMAT_ACTIONS], _sceneNumber);
+ execute(Common::String(buffer));
+}
+
+/**
+ * Executes the script with the specified name
+ */
+void MadsSceneLogic::execute(const Common::String &scriptName) {
+ Common::HashMap<Common::String, uint32>::iterator it = _subroutines.find(scriptName);
+ if (it != _subroutines.end())
+ execute(it->_value);
+}
+
+#define UNUSED_VAL 0xEAEAEAEA
+/**
+ * Executes the script at the specified offset
+ */
+void MadsSceneLogic::execute(uint32 subOffset) {
+ Common::Array<ScriptVar> locals;
+ Common::Stack<ScriptVar> stack;
+ char opcodeBuffer[100];
+ uint32 scriptOffset = subOffset;
+ uint32 param;
+
+ debugC(1, kDebugScript, "executing script at %xh", subOffset);
+
+ bool done = false;
+ while (!done) {
+ param = UNUSED_VAL;
+ byte opcode = _scriptsData[scriptOffset++];
+ sprintf(opcodeBuffer, "%.4x[%.2d] - %s", scriptOffset - 1, stack.size(), _opcodeStrings[opcode & OPMASK]);
+
+ switch (opcode & OPMASK) {
+ case OP_HALT: // end of program
+ case OP_RET:
+ done = true;
+ break;
+
+ case OP_IMM: // Loads immediate value onto stack
+ param = getParam(scriptOffset, opcode);
+ stack.push(ScriptVar(param));
+ break;
+
+ case OP_ZERO: // loads zero onto stack
+ stack.push(ScriptVar((uint32)0));
+ break;
+
+ case OP_ONE: // loads one onto stack
+ stack.push(ScriptVar(1));
+ break;
+
+ case OP_MINUSONE: // loads minus one (0xffff) onto stack
+ stack.push(ScriptVar(0xffff));
+ break;
+
+ case OP_DLOAD: { // Gets data variable
+ param = getParam(scriptOffset, opcode);
+ uint16 v = dataMap().get(param);
+ stack.push(ScriptVar(v));
+ break;
+ }
+
+ case OP_DSTORE: { // Stores data variable
+ param = getParam(scriptOffset, opcode);
+ ScriptVar v = stack.pop();
+ dataMap().set(param, v.isInt() ? v.get() : 0);
+ break;
+ }
- //if (_madsVm->globals()->previousScene == 112)
- // room101Check();
- } else {
- _spriteIndexes[26] = startCycledSpriteSequence(_spriteIndexes[11], false, 6, 0, 0, 0);
- _madsVm->scene()->_sequenceList.setDepth(_spriteIndexes[26], 4);
- }
+ case OP_LOAD: // loads local variable onto stack
+ param = getParam(scriptOffset, opcode);
+ stack.push(locals[param]);
+ break;
- _madsVm->globals()->loadQuoteSet(0x31, 0x32, 0x37, 0x38, 0x39, -1);
+ case OP_STORE: // Pops a value and stores it in a local
+ // Get the local index and expand the locals store if necessary
+ param = getParam(scriptOffset, opcode);
+ while (param >= locals.size())
+ locals.push_back(ScriptVar());
- if (_madsVm->globals()->_globals[10]) {
- const char *animName = MADSResourceManager::getResourceName('S', 'e', EXTTYPE_AA, NULL, -1);
- _madsVm->scene()->loadAnimation(animName, 71);
+ locals[param] = stack.pop();
+ break;
- _madsVm->_player._playerPos = Common::Point(68, 140);
- _madsVm->_player._direction = 4;
- _madsVm->_player._visible = false;
- _madsVm->_player._stepEnabled = false;
+ case OP_GLOAD: // loads global variable onto stack
+ param = getParam(scriptOffset, opcode);
+ assert(param < TOTAL_NUM_VARIABLES);
+ stack.push(_madsVm->globals()->_globals[param]);
+ break;
+
+ case OP_GSTORE: // pops stack and stores in global variable
+ param = getParam(scriptOffset, opcode);
+ assert(param < TOTAL_NUM_VARIABLES);
+ _madsVm->globals()->_globals[param] = stack.pop().get();
+ break;
+
+ case OP_CALL: // procedure call
+ param = getParam(scriptOffset, opcode);
+ assert(param < _subroutineOffsets.size());
+ execute(_subroutineOffsets[param]);
+ break;
- dataMap()[0x56FC] = 0;
- dataMap()[0x5482] = 0;
- dataMap()[0x5484] = 30;
+ case OP_LIBCALL: // library procedure or function call
+ param = getParam(scriptOffset, opcode);
+ callSubroutine(param, stack);
+ break;
+
+ case OP_JUMP: // unconditional jump
+ param = subOffset + getParam(scriptOffset, opcode);
+ scriptOffset = param;
+ break;
+
+ case OP_JMPFALSE: // conditional jump
+ param = subOffset + getParam(scriptOffset, opcode);
+ if (stack.pop().get() == 0)
+ // Condition satisfied - do the jump
+ scriptOffset = param;
+ break;
+
+ case OP_JMPTRUE: // conditional jump
+ param = subOffset + getParam(scriptOffset, opcode);
+ if (stack.pop().get() != 0)
+ // Condition satisfied - do the jump
+ scriptOffset = param;
+ break;
+
+ case OP_EQUAL: // tests top two items on stack for equality
+ case OP_LESS: // tests top two items on stack
+ case OP_LEQUAL: // tests top two items on stack
+ case OP_NEQUAL: // tests top two items on stack
+ case OP_GEQUAL: // tests top two items on stack
+ case OP_GREAT: // tests top two items on stack
+ case OP_LOR: // logical or of top two items on stack and replaces with result
+ case OP_LAND: // logical ands top two items on stack and replaces with result
+ {
+ uint32 param2 = stack.pop().get();
+ uint32 param1 = stack.pop().get();
+
+ // Do the comparison
+ uint32 tmp = 0;
+ switch (opcode) {
+ case OP_EQUAL: tmp = (param1 == param2); break;
+ case OP_LESS: tmp = (param1 < param2); break;
+ case OP_LEQUAL: tmp = (param1 <= param2); break;
+ case OP_NEQUAL: tmp = (param1 != param2); break;
+ case OP_GEQUAL: tmp = (param1 >= param2); break;
+ case OP_GREAT: tmp = (param1 > param2); break;
+
+ case OP_LOR: tmp = (param1 || param2); break;
+ case OP_LAND: tmp = (param1 && param2); break;
+ }
+
+ stack.push(ScriptVar(tmp));
+ }
+ break;
+
+ case OP_PLUS: // adds top two items on stack and replaces with result
+ case OP_MINUS: // subs top two items on stack and replaces with result
+ case OP_MULT: // multiplies top two items on stack and replaces with result
+ case OP_DIV: // divides top two items on stack and replaces with result
+ case OP_MOD: // divides top two items on stack and replaces with modulus
+ case OP_AND: // bitwise ands top two items on stack and replaces with result
+ case OP_OR: // bitwise ors top two items on stack and replaces with result
+ case OP_EOR: // bitwise exclusive ors top two items on stack and replaces with result
+ {
+ uint32 param2 = stack.pop().get();
+ uint32 param1 = stack.pop().get();
+
+ // replace other operand with result of operation
+ switch (opcode) {
+ case OP_PLUS: param1 += param2; break;
+ case OP_MINUS: param1 -= param2; break;
+ case OP_MULT: param1 *= param2; break;
+ case OP_DIV: param1 /= param2; break;
+ case OP_MOD: param1 %= param2; break;
+ case OP_AND: param1 &= param2; break;
+ case OP_OR: param1 |= param2; break;
+ case OP_EOR: param1 ^= param2; break;
+ }
+
+ stack.push(ScriptVar(param1));
+ }
+ break;
+
+ case OP_NOT: // logical nots top item on stack
+ param = stack.pop().get();
+ stack.push(ScriptVar((uint32)!param & 0xffff));
+ break;
+
+ case OP_COMP: // complements top item on stack
+ param = stack.pop().get();
+ stack.push(ScriptVar(~param & 0xffff));
+ break;
+
+ case OP_NEG: // negates top item on stack
+ param = stack.pop().get();
+ stack.push(ScriptVar(((uint32)-(int32)param) & 0xffff));
+ break;
+
+ case OP_DUP: // duplicates top item on stack
+ stack.push(stack.top());
+ break;
+
+ default:
+ error("execute() - Unknown opcode");
+ }
+
+ // check for stack size
+ assert(stack.size() < 100);
+
+ if (gDebugLevel > 0) {
+ if (param != UNUSED_VAL)
+ sprintf(opcodeBuffer + strlen(opcodeBuffer), "\t%d", param);
+ debugC(2, kDebugScript, "%s", opcodeBuffer);
+ }
}
- _madsVm->globals()->_dataMap[0x5486] = 0;
- lowRoomsEntrySound();
+ debugC(1, kDebugScript, "finished executing script");
+
+ // make sure stack is unwound
+ assert(stack.size() == 0);
}
-void MadsSceneLogic::doPreactions() {
- warning("Still to do preactions logic");
+uint32 MadsSceneLogic::getParam(uint32 &scriptOffset, int opcode) {
+ switch (opcode & (~OPMASK)) {
+ case OPSIZE8:
+ return _scriptsData[scriptOffset++];
+ case OPSIZE16: {
+ uint16 v = READ_LE_UINT16(&_scriptsData[scriptOffset]);
+ scriptOffset += sizeof(uint16);
+ return v;
+ }
+ default: {
+ uint32 v = READ_LE_UINT32(&_scriptsData[scriptOffset]);
+ scriptOffset += sizeof(uint32);
+ return v;
+ }
+ }
}
-void MadsSceneLogic::doAction() {
- warning("Still to do actions logic");
+/**
+ * Support method for extracting the required number of parameters needed for a library routine call
+ */
+void MadsSceneLogic::getCallParameters(int numParams, Common::Stack<ScriptVar> &stack, ScriptVar *callParams) {
+ assert(numParams <= MAX_CALL_PARAMS);
+ for (int i = 0; i < numParams; ++i, ++callParams)
+ *callParams = stack.pop();
}
-void MadsSceneLogic::doSceneStep() {
- // TODO: Sound handling
-
- switch (_madsVm->scene()->_abortTimers) {
- case 70:
- _madsVm->_sound->playSound(9);
+#define EXTRACT_PARAMS(n) getCallParameters(n, stack, p)
+
+void MadsSceneLogic::callSubroutine(int subIndex, Common::Stack<ScriptVar> &stack) {
+ ScriptVar p[MAX_CALL_PARAMS];
+
+ switch (subIndex) {
+ case 1: {
+ // dialog_show
+ EXTRACT_PARAMS(1);
+ Dialog *dlg = new Dialog(_vm, p[0].getStr(), "TODO: Proper Title");
+ _vm->_viewManager->addView(dlg);
+ _vm->_viewManager->moveToFront(dlg);
break;
- case 71:
- _madsVm->globals()->_globals[10] = 0;
- _madsVm->_player._visible = true;
- _madsVm->_player._stepEnabled = true;
+ }
- _madsVm->_player._priorTimer = _madsVm->_currentTimer - _madsVm->_player._ticksAmount;
+ case 2:
+ // SequenceList_remove
+ EXTRACT_PARAMS(1);
+ _madsVm->scene()->_sequenceList.remove(p[0]);
break;
- case 72:
- case 73:
- // TODO: Method that should be scripted
+
+ case 3:
+ case 6:
+ case 20: {
+ // 3: start_reversible_sprite_sequence
+ // 6: start_cycled_sprite_sequence
+ // 20: start_sprite_sequence3
+ EXTRACT_PARAMS(6);
+ int idx;
+ if (subIndex == 3)
+ idx = startReversibleSpriteSequence(p[0], p[1] != 0, p[2], p[3], p[4], p[5]);
+ else if (subIndex == 6)
+ idx = startCycledSpriteSequence(p[0], p[1], p[2], p[3], p[4], p[5]);
+ else
+ idx = startSpriteSequence3(p[0], p[1] != 0, p[2], p[3], p[4], p[5]);
+ stack.push(ScriptVar(idx));
break;
+ }
- default:
+ case 4:
+ // SequenceList_setAnimRange
+ EXTRACT_PARAMS(3);
+ _madsVm->scene()->_sequenceList.setAnimRange(p[0], p[1], p[2]);
+ break;
+
+ case 5:
+ // SequenceList_addSubEntry
+ EXTRACT_PARAMS(4);
+ stack.push(ScriptVar(_madsVm->scene()->_sequenceList.addSubEntry(p[0], (SequenceSubEntryMode)p[1].get(), p[2], p[3])));
+ break;
+
+ case 7: {
+ // quotes_get_pointer
+ EXTRACT_PARAMS(1);
+ const char *quoteStr = _madsVm->globals()->getQuote(p[0]);
+ stack.push(ScriptVar(quoteStr));
break;
}
- // Wake up message sequence
- Animation *anim = _madsVm->scene()->activeAnimation();
- if (anim) {
- if ((anim->getCurrentFrame() == 6) && (dataMap()[0x5482] == 0)) {
- dataMap()[0x5482]++;
- _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]),
- 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(49));
- dataMap()[0x5484] += 14;
- }
+ case 8: {
+ // KernelMessageList_add
+ EXTRACT_PARAMS(8);
+ int msgIndex = _madsVm->scene()->_kernelMessages.add(Common::Point(p[0], p[1]), p[2],
+ p[3], p[4], p[5] | (p[6] << 16), p[7].getStr());
+ stack.push(ScriptVar(msgIndex));
+ break;
+ }
- if ((anim->getCurrentFrame() == 7) && (dataMap()[0x5482] == 1)) {
- dataMap()[0x5482]++;
- _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]),
- 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(54));
- dataMap()[0x5484] += 14;
- }
+ case 9:
+ // SequenceList_unk3
+ EXTRACT_PARAMS(1);
+ // TODO: Implement unk3 method
+// stack.push(ScriptVar(_madsVm->scene()->_sequenceList.unk3(p[0])));
+ break;
- if ((anim->getCurrentFrame() == 10) && (dataMap()[0x5482] == 2)) {
- dataMap()[0x5482]++;
- _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]),
- 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(55));
- dataMap()[0x5484] += 14;
- }
+ case 10:
+ // start_sound
+ EXTRACT_PARAMS(1);
+ _madsVm->_sound->playSound(p[0]);
+ break;
- if ((anim->getCurrentFrame() == 17) && (dataMap()[0x5482] == 3)) {
- dataMap()[0x5482]++;
- _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]),
- 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(56));
- dataMap()[0x5484] += 14;
- }
+ case 11:
+ // SceneLogic_formAnimName
+ EXTRACT_PARAMS(2);
+ stack.push(ScriptVar(formAnimName((char)p[0], p[1])));
+ break;
+
+ case 12:
+ // SpriteList_addSprites
+ EXTRACT_PARAMS(2);
+ stack.push(ScriptVar(_madsVm->scene()->_spriteSlots.addSprites(p[0].getStr(), false, p[1])));
+ break;
+
+ case 13:
+ // hotspot_activate
+ EXTRACT_PARAMS(2);
+ // TODO: Implement setActive version that takes in a hotspot Id
+// _madsVm->scene()->getSceneResources().hotspots->setActive(p[0], p[1] != 0);
+ break;
- if ((anim->getCurrentFrame() == 20) && (dataMap()[0x5482] == 4)) {
- dataMap()[0x5482]++;
- _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]),
- 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(50));
- dataMap()[0x5484] += 14;
+ case 14: {
+ // DynamicHotspots_add
+ EXTRACT_PARAMS(7);
+ int idx = _madsVm->scene()->_dynamicHotspots.add(p[0], p[1], p[2],
+ Common::Rect(p[6], p[5], p[6] + p[4], p[5] + p[3]));
+ stack.push(ScriptVar(idx));
+ break;
+ }
+
+ case 15:
+ // SequenceList_setDepth
+ EXTRACT_PARAMS(2);
+ _madsVm->scene()->_sequenceList.setDepth(p[0], p[1]);
+ break;
+
+ case 16: {
+ // quotes_load
+ // Quotes loading can take an arbitrary number of quote Ids, terminated by a 0
+ int firstId = -1;
+ int quoteId;
+ while ((quoteId = stack.pop()) != 0) {
+ if (firstId == -1)
+ firstId = quoteId;
+ _madsVm->globals()->loadQuote(quoteId);
}
- }
+
+ if (firstId != -1)
+ stack.push(ScriptVar(_madsVm->globals()->getQuote(firstId)));
+ break;
+ }
+
+ case 17: {
+ // form_resource_name
+ EXTRACT_PARAMS(4);
+ const char *suffix = NULL;
+ if (p[4].isInt()) {
+ // If integer provided for suffix, it must be a value of 0 (NULL)
+ uint32 vTemp = p[4] | stack.pop();
+ assert(!vTemp);
+ } else
+ suffix = p[4].getStr();
+
+ stack.push(ScriptVar(MADSResourceManager::getResourceName((char)p[1], p[0], (ExtensionType)p[3].get(),
+ suffix, (int16)p[2])));
+ break;
+ }
+
+ case 18:
+ // MadsScene_loadAnimation
+ EXTRACT_PARAMS(3);
+ _madsVm->scene()->loadAnimation(p[1].getStr(), p[0]);
+ break;
+
+ case 19: {
+ // Action_isAction
+ int verbId = stack.pop();
+ int objectNameId = (verbId == 0) ? 0 : stack.pop().get();
+ int indirectObjectId = (objectNameId == 0) ? 0 : stack.pop().get();
+
+ stack.push(ScriptVar(_madsVm->scene()->_action.isAction(verbId, objectNameId, indirectObjectId)));
+ break;
+ }
+
+ case 21:
+ // DynamicHotspots_remove
+ EXTRACT_PARAMS(1);
+ _madsVm->scene()->_dynamicHotspots.remove(p[0]);
+ break;
+
+ case 22: {
+ // object_is_present
+ EXTRACT_PARAMS(1);
+ const MadsObject *obj = _madsVm->globals()->getObject(p[0]);
+ stack.push(ScriptVar((obj->roomNumber == _madsVm->scene()->_currentScene)));
+ break;
+ }
+
+ case 23:
+ // inventory_add
+ EXTRACT_PARAMS(1);
+ _madsVm->scene()->getInterface()->addObjectToInventory(p[0]);
+ break;
+
+ case 24: {
+ // dialog_picture_show
+ EXTRACT_PARAMS(3);
+ int messageId = p[0] | (p[1] << 16);
+ int objectNum = p[2];
+ warning("TODO: Implement dialog with picture. MessageId=%d, objectNum=%d", messageId, objectNum);
+ break;
+ }
+
+ case 25: {
+ // object_is_in_inventory
+ EXTRACT_PARAMS(1);
+ const MadsObject *obj = _madsVm->globals()->getObject(p[0]);
+ stack.push(ScriptVar(obj->isInInventory()));
+ break;
+ }
+
+ default:
+ error("Unknown subroutine %d called", subIndex);
+ break;
+ }
}
+#undef EXTRACT_PARAMS
+
}
diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h
index ec6eff368b..adafe6f93d 100644
--- a/engines/m4/mads_logic.h
+++ b/engines/m4/mads_logic.h
@@ -29,10 +29,38 @@
#ifndef M4_MADS_LOGIC_H
#define M4_MADS_LOGIC_H
+#include "common/hashmap.h"
+#include "common/hash-str.h"
+#include "common/stack.h"
#include "m4/mads_views.h"
namespace M4 {
+union ScriptVarValue {
+ const char *strValue;
+ uint32 intValue;
+};
+
+/**
+ * Specifies a script variable that either be a 32-bit unsigned integer or a string pointer
+ */
+class ScriptVar {
+private:
+ ScriptVarValue _value;
+ bool _isInt;
+public:
+ ScriptVar(uint32 v = 0) { _value.intValue = v; _isInt = true; }
+ ScriptVar(const char *s) { _value.strValue = s; _isInt = false; }
+
+ void set(uint32 v) { _value.intValue = v; _isInt = true; }
+ void set(const char *s) { _value.strValue = s; _isInt = false; }
+ const char *getStr() const { assert(!_isInt); return _value.strValue; }
+ uint32 get() const { assert(_isInt); return _value.intValue; }
+ bool isInt() const { return _isInt; }
+
+ operator int() { return get(); }
+};
+
class MadsSceneLogic {
private:
// Library interface methods
@@ -41,27 +69,45 @@ private:
uint16 startCycledSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
uint16 startSpriteSequence3(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
void activateHotspot(int idx, bool active);
- void lowRoomsEntrySound();
void getPlayerSpritesPrefix();
void getPlayerSpritesPrefix2();
private:
int _sceneNumber;
int16 _spriteIndexes[50];
+ byte *_scriptsData;
+ int _scriptsSize;
+ Common::HashMap<Common::String, uint32> _subroutines;
+ Common::Array<uint32> _subroutineOffsets;
+
+ enum SubFormatIndex {SUBFORMAT_ENTER, SUBFORMAT_STEP, SUBFORMAT_PREACTIONS, SUBFORMAT_ACTIONS};
+ static const char *subFormatList[];
+ static const char *_opcodeStrings[];
// Support functions
const char *formAnimName(char sepChar, int16 suffixNum);
void getSceneSpriteSet();
void getAnimName();
- IntStorage &dataMap();
+ DataMap &dataMap();
+ void getCallParameters(int numParams, Common::Stack<ScriptVar> &stack, ScriptVar *callParams);
public:
+ MadsSceneLogic() { _scriptsData = NULL; }
+ ~MadsSceneLogic() { delete _scriptsData; }
+
+ void initialiseScripts();
+ void initialiseDataMap();
void selectScene(int sceneNum);
void setupScene();
- void enterScene();
+ void doEnterScene();
void doPreactions();
void doAction();
void doSceneStep();
+
+ void execute(const Common::String &scriptName);
+ void execute(uint32 scriptOffset);
+ uint32 getParam(uint32 &scriptOffset, int opcode);
+ void callSubroutine(int subIndex, Common::Stack<ScriptVar> &stack);
};
class MadsGameLogic {
diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp
index d44fa2a753..641ee756e3 100644
--- a/engines/m4/mads_scene.cpp
+++ b/engines/m4/mads_scene.cpp
@@ -62,12 +62,14 @@ void SceneNode::load(Common::SeekableReadStream *stream) {
MadsScene::MadsScene(MadsEngine *vm): _sceneResources(), Scene(vm, &_sceneResources), MadsView(this) {
_vm = vm;
_activeAnimation = NULL;
+ _animActive = false;
MadsView::_bgSurface = Scene::_backgroundSurface;
MadsView::_depthSurface = Scene::_walkSurface;
_interfaceSurface = new MadsInterfaceView(vm);
_showMousePos = false;
_mouseMsgIndex = -1;
+ _previousScene = -1;
}
MadsScene::~MadsScene() {
@@ -174,7 +176,7 @@ void MadsScene::loadScene(int sceneNumber) {
// Do any scene specific setup
if (_vm->getGameType() == GType_RexNebular)
- _sceneLogic.enterScene();
+ _sceneLogic.doEnterScene();
// Miscellaneous player setup
_madsVm->_player._destPos = _madsVm->_player._destPos;
@@ -215,6 +217,7 @@ void MadsScene::leaveScene() {
if (_activeAnimation) {
delete _activeAnimation;
_activeAnimation = NULL;
+ _animActive = false;
}
Scene::leaveScene();
@@ -383,6 +386,7 @@ void MadsScene::updateState() {
if (((MadsAnimation *) _activeAnimation)->freeFlag() || freeFlag) {
delete _activeAnimation;
_activeAnimation = NULL;
+ _animActive = false;
}
}
@@ -454,6 +458,7 @@ void MadsScene::freeAnimation() {
delete _activeAnimation;
_activeAnimation = NULL;
+ _animActive = false;
}
@@ -573,6 +578,7 @@ void MadsScene::loadAnimation(const Common::String &animName, int abortTimers) {
MadsAnimation *anim = new MadsAnimation(_vm, this);
anim->load(animName.c_str(), abortTimers);
_activeAnimation = anim;
+ _animActive = true;
}
bool MadsScene::getDepthHighBit(const Common::Point &pt) {
diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h
index 7723058cc7..a029c63a4b 100644
--- a/engines/m4/mads_scene.h
+++ b/engines/m4/mads_scene.h
@@ -108,9 +108,14 @@ public:
Common::Point _destPos;
int _destFacing;
Common::Point _customDest;
+ bool _animActive;
public:
MadsScene(MadsEngine *vm);
virtual ~MadsScene();
+ void initialise() {
+ _sceneLogic.initialiseScripts();
+ _sceneLogic.initialiseDataMap();
+ }
// Methods that differ between engines
virtual void loadScene(int sceneNumber);
diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp
index 3e5f0c2ac9..58a9a99211 100644
--- a/engines/m4/mads_views.cpp
+++ b/engines/m4/mads_views.cpp
@@ -394,14 +394,20 @@ int MadsSpriteSlots::addSprites(const char *resName, bool suppressErrors, int fl
return -1;
}
+ // Append on a '.SS' suffix if the resource doesn't already have an extension
+ char buffer[100];
+ strncpy(buffer, resName, 95);
+ if (!strchr(buffer, '.'))
+ strcat(buffer, ".SS");
+
// Get the sprite set
- Common::SeekableReadStream *data = _vm->res()->get(resName);
- SpriteAsset *spriteSet = new SpriteAsset(_vm, data, data->size(), resName, false, flags);
+ Common::SeekableReadStream *data = _vm->res()->get(buffer);
+ SpriteAsset *spriteSet = new SpriteAsset(_vm, data, data->size(), buffer, false, flags);
spriteSet->translate(_madsVm->_palette);
assert(spriteSet != NULL);
_sprites.push_back(spriteSet);
- _vm->res()->toss(resName);
+ _vm->res()->toss(buffer);
return _sprites.size() - 1;
}
diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp
index 8457f2087a..57d63c153a 100644
--- a/engines/m4/scene.cpp
+++ b/engines/m4/scene.cpp
@@ -51,6 +51,7 @@ Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0,
_interfacePal = NULL;
_interfaceSurface = NULL;
_vm->_rails->setCodeSurface(_walkSurface);
+ _currentScene = -1;
}
Scene::~Scene() {
diff --git a/engines/m4/scene.h b/engines/m4/scene.h
index 9262a7c828..e0b28e6454 100644
--- a/engines/m4/scene.h
+++ b/engines/m4/scene.h
@@ -77,9 +77,6 @@ class Scene : public View {
private:
HotSpotList _sceneHotspots;
protected:
- int _currentScene;
- int _previousScene;
- int _nextScene;
GameInterfaceView *_interfaceSurface;
M4Surface *_backgroundSurface;
M4Surface *_walkSurface;
@@ -87,6 +84,10 @@ protected:
RGBList *_interfacePal;
SceneResources *_sceneResources;
public:
+ int _currentScene;
+ int _previousScene;
+ int _nextScene;
+public:
Scene(MadsM4Engine *vm, SceneResources *res);
virtual ~Scene();
diff --git a/engines/m4/ws_machine.cpp b/engines/m4/ws_machine.cpp
index 985ceedb2e..cb791026c9 100644
--- a/engines/m4/ws_machine.cpp
+++ b/engines/m4/ws_machine.cpp
@@ -157,12 +157,12 @@ int32 Machine::execInstruction() {
_code->loadInstruction(instruction);
if (instruction.instr >= 64) {
- if (machineConditionalsTable[instruction.instr - 64] != NULL)
+ if (machineConditionalsTable[instruction.instr - 64] != 0)
(this->*machineConditionalsTable[instruction.instr - 64])(instruction);
/* The next line is to yield on unimplemented opcodes */
else { fflush(stdout); g_system->delayMillis(5000); }
} else if (instruction.instr > 0) {
- if (machineCommandsTable[instruction.instr] != NULL)
+ if (machineCommandsTable[instruction.instr] != 0)
done = !(this->*machineCommandsTable[instruction.instr])(instruction);
/* The next line is to yield on unimplemented opcodes */
else { fflush(stdout); g_system->delayMillis(5000); }
diff --git a/engines/m4/ws_sequence.cpp b/engines/m4/ws_sequence.cpp
index 1f3c977609..79869a81d0 100644
--- a/engines/m4/ws_sequence.cpp
+++ b/engines/m4/ws_sequence.cpp
@@ -226,7 +226,7 @@ bool Sequence::runProgram() {
while (!done) {
Instruction instruction;
_code->loadInstruction(instruction);
- if (sequenceCommandsTable[instruction.instr] != NULL)
+ if (sequenceCommandsTable[instruction.instr] != 0)
done = !(this->*sequenceCommandsTable[instruction.instr])(instruction);
else { fflush(stdout); /*g_system->delayMillis(1000);*/ }
}
diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp
index 5dcfff4f90..0116167df1 100644
--- a/engines/mohawk/console.cpp
+++ b/engines/mohawk/console.cpp
@@ -309,6 +309,7 @@ RivenConsole::RivenConsole(MohawkEngine_Riven *vm) : GUI::Debugger(), _vm(vm) {
DCmd_Register("listZipCards", WRAP_METHOD(RivenConsole, Cmd_ListZipCards));
DCmd_Register("getRMAP", WRAP_METHOD(RivenConsole, Cmd_GetRMAP));
DCmd_Register("combos", WRAP_METHOD(RivenConsole, Cmd_Combos));
+ DCmd_Register("sliderState", WRAP_METHOD(RivenConsole, Cmd_SliderState));
}
RivenConsole::~RivenConsole() {
@@ -349,7 +350,7 @@ bool RivenConsole::Cmd_Var(int argc, const char **argv) {
return true;
}
- uint32 *globalVar = _vm->matchVarToString(argv[1]);
+ uint32 *globalVar = _vm->getVar(argv[1]);
if (!globalVar) {
DebugPrintf("Unknown variable \'%s\'\n", argv[1]);
@@ -466,10 +467,11 @@ bool RivenConsole::Cmd_Hotspots(int argc, const char **argv) {
DebugPrintf("Hotspot %d, index %d, BLST ID %d (", i, _vm->_hotspots[i].index, _vm->_hotspots[i].blstID);
if (_vm->_hotspots[i].enabled)
- DebugPrintf("enabled)\n");
+ DebugPrintf("enabled");
else
- DebugPrintf("disabled)\n");
+ DebugPrintf("disabled");
+ DebugPrintf(") - (%d, %d, %d, %d)\n", _vm->_hotspots[i].rect.left, _vm->_hotspots[i].rect.top, _vm->_hotspots[i].rect.right, _vm->_hotspots[i].rect.bottom);
DebugPrintf(" Name = %s\n", _vm->getHotspotName(i).c_str());
}
@@ -477,7 +479,7 @@ bool RivenConsole::Cmd_Hotspots(int argc, const char **argv) {
}
bool RivenConsole::Cmd_ZipMode(int argc, const char **argv) {
- uint32 *zipModeActive = _vm->matchVarToString("azip");
+ uint32 *zipModeActive = _vm->getVar("azip");
*zipModeActive = !(*zipModeActive);
DebugPrintf("Zip Mode is ");
@@ -620,9 +622,9 @@ bool RivenConsole::Cmd_Combos(int argc, const char **argv) {
// You'll need to look up the Rebel Tunnel puzzle on your own; the
// solution is constant.
- uint32 teleCombo = *_vm->matchVarToString("tcorrectorder");
- uint32 prisonCombo = *_vm->matchVarToString("pcorrectorder");
- uint32 domeCombo = *_vm->matchVarToString("adomecombo");
+ uint32 teleCombo = *_vm->getVar("tcorrectorder");
+ uint32 prisonCombo = *_vm->getVar("pcorrectorder");
+ uint32 domeCombo = *_vm->getVar("adomecombo");
DebugPrintf("Telescope Combo:\n ");
for (int i = 0; i < 5; i++)
@@ -641,6 +643,14 @@ bool RivenConsole::Cmd_Combos(int argc, const char **argv) {
return true;
}
+bool RivenConsole::Cmd_SliderState(int argc, const char **argv) {
+ if (argc > 1)
+ _vm->_externalScriptHandler->setDomeSliderState((uint32)atoi(argv[1]));
+
+ DebugPrintf("Dome Slider State = %08x\n", _vm->_externalScriptHandler->getDomeSliderState());
+ return true;
+}
+
LivingBooksConsole::LivingBooksConsole(MohawkEngine_LivingBooks *vm) : GUI::Debugger(), _vm(vm) {
DCmd_Register("playSound", WRAP_METHOD(LivingBooksConsole, Cmd_PlaySound));
DCmd_Register("stopSound", WRAP_METHOD(LivingBooksConsole, Cmd_StopSound));
diff --git a/engines/mohawk/console.h b/engines/mohawk/console.h
index 1806c61027..beba3f8852 100644
--- a/engines/mohawk/console.h
+++ b/engines/mohawk/console.h
@@ -89,6 +89,7 @@ private:
bool Cmd_ListZipCards(int argc, const char **argv);
bool Cmd_GetRMAP(int argc, const char **argv);
bool Cmd_Combos(int argc, const char **argv);
+ bool Cmd_SliderState(int argc, const char **argv);
};
class LivingBooksConsole : public GUI::Debugger {
diff --git a/engines/mohawk/dialogs.cpp b/engines/mohawk/dialogs.cpp
index c09763cbb3..a7369b4825 100644
--- a/engines/mohawk/dialogs.cpp
+++ b/engines/mohawk/dialogs.cpp
@@ -125,17 +125,17 @@ RivenOptionsDialog::~RivenOptionsDialog() {
void RivenOptionsDialog::open() {
Dialog::open();
- _zipModeCheckbox->setState(*_vm->matchVarToString("azip") != 0);
- _waterEffectCheckbox->setState(*_vm->matchVarToString("waterenabled") != 0);
+ _zipModeCheckbox->setState(*_vm->getVar("azip") != 0);
+ _waterEffectCheckbox->setState(*_vm->getVar("waterenabled") != 0);
}
void RivenOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
switch (cmd) {
case kZipCmd:
- *_vm->matchVarToString("azip") = _zipModeCheckbox->getState() ? 1 : 0;
+ *_vm->getVar("azip") = _zipModeCheckbox->getState() ? 1 : 0;
break;
case kWaterCmd:
- *_vm->matchVarToString("waterenabled") = _waterEffectCheckbox->getState() ? 1 : 0;
+ *_vm->getVar("waterenabled") = _waterEffectCheckbox->getState() ? 1 : 0;
break;
case GUI::kCloseCmd:
close();
diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp
index 1974aec9c2..64629f949d 100644
--- a/engines/mohawk/graphics.cpp
+++ b/engines/mohawk/graphics.cpp
@@ -399,7 +399,7 @@ void RivenGraphics::clearWaterEffects() {
bool RivenGraphics::runScheduledWaterEffects() {
// Don't run the effect if it's disabled
- if (*_vm->matchVarToString("waterenabled") == 0)
+ if (*_vm->getVar("waterenabled") == 0)
return false;
Graphics::Surface *screen = NULL;
@@ -597,28 +597,35 @@ void RivenGraphics::showInventory() {
// Clear the inventory area
clearInventoryArea();
- // The demo doesn't have the inventory system and we don't want
- // to show the inventory on setup screens or in other journals.
- if (_vm->getFeatures() & GF_DEMO || _vm->getCurStack() == aspit)
- return;
-
- // There are three books and three vars. We have three different
- // combinations. At the start you have just Atrus' journal. Later,
- // you get Catherine's journal and the trap book. Near the end,
- // you lose the trap book and have just the two journals.
-
- bool hasCathBook = *_vm->matchVarToString("acathbook") != 0;
- bool hasTrapBook = *_vm->matchVarToString("atrapbook") != 0;
-
- if (!hasCathBook) {
- drawInventoryImage(101, g_atrusJournalRect1);
- } else if (!hasTrapBook) {
- drawInventoryImage(101, g_atrusJournalRect2);
- drawInventoryImage(102, g_cathJournalRect2);
+ // Draw the demo's exit button
+ if (_vm->getFeatures() & GF_DEMO) {
+ // extras.mhk tBMP 101 contains "EXIT" instead of Atrus' journal in the demo!
+ // The demo's extras.mhk contains all the other inventory/marble/credits image
+ // but has hacked tBMP 101 with "EXIT". *sigh*
+ drawInventoryImage(101, g_demoExitRect);
} else {
- drawInventoryImage(101, g_atrusJournalRect3);
- drawInventoryImage(102, g_cathJournalRect3);
- drawInventoryImage(100, g_trapBookRect3);
+ // We don't want to show the inventory on setup screens or in other journals.
+ if (_vm->getCurStack() == aspit)
+ return;
+
+ // There are three books and three vars. We have three different
+ // combinations. At the start you have just Atrus' journal. Later,
+ // you get Catherine's journal and the trap book. Near the end,
+ // you lose the trap book and have just the two journals.
+
+ bool hasCathBook = *_vm->getVar("acathbook") != 0;
+ bool hasTrapBook = *_vm->getVar("atrapbook") != 0;
+
+ if (!hasCathBook) {
+ drawInventoryImage(101, g_atrusJournalRect1);
+ } else if (!hasTrapBook) {
+ drawInventoryImage(101, g_atrusJournalRect2);
+ drawInventoryImage(102, g_cathJournalRect2);
+ } else {
+ drawInventoryImage(101, g_atrusJournalRect3);
+ drawInventoryImage(102, g_cathJournalRect3);
+ drawInventoryImage(100, g_trapBookRect3);
+ }
}
_vm->_system->updateScreen();
@@ -672,6 +679,23 @@ void RivenGraphics::drawRect(Common::Rect rect, bool active) {
_vm->_system->unlockScreen();
}
+void RivenGraphics::drawImageRect(uint16 id, Common::Rect srcRect, Common::Rect dstRect) {
+ // Draw tBMP id from srcRect to dstRect
+ ImageData *imageData = _bitmapDecoder->decodeImage(_vm->getRawData(ID_TBMP, id));
+ Graphics::Surface *surface = imageData->getSurface();
+ delete imageData;
+
+ assert(srcRect.width() == dstRect.width() && srcRect.height() == dstRect.height());
+
+ for (uint16 i = 0; i < srcRect.height(); i++)
+ memcpy(_mainScreen->getBasePtr(dstRect.left, i + dstRect.top), surface->getBasePtr(srcRect.left, i + srcRect.top), srcRect.width() * surface->bytesPerPixel);
+
+ surface->free();
+ delete surface;
+
+ _dirtyScreen = true;
+}
+
LBGraphics::LBGraphics(MohawkEngine_LivingBooks *vm) : _vm(vm) {
_bmpDecoder = (_vm->getGameType() == GType_LIVINGBOOKSV1) ? new OldMohawkBitmap() : new MohawkBitmap();
_palette = new byte[256 * 4];
@@ -707,7 +731,7 @@ void LBGraphics::copyImageToScreen(uint16 image, uint16 left, uint16 right) {
}
void LBGraphics::setPalette(uint16 id) {
- // Old Living Books gamnes use the old CTBL-style palette format while newer
+ // Old Living Books games use the old CTBL-style palette format while newer
// games use the better tPAL format which can store partial palettes.
if (_vm->getGameType() == GType_LIVINGBOOKSV1) {
diff --git a/engines/mohawk/graphics.h b/engines/mohawk/graphics.h
index dd1764e6d6..5271c86d0d 100644
--- a/engines/mohawk/graphics.h
+++ b/engines/mohawk/graphics.h
@@ -41,6 +41,8 @@ class MohawkBitmap;
class MystBitmap;
enum {
+ kRivenOpenHandCursor = 2003,
+ kRivenClosedHandCursor = 2004,
kRivenMainCursor = 3000,
kRivenPelletCursor = 5000,
kRivenHideCursor = 9000
@@ -117,7 +119,7 @@ private:
uint16 type;
uint16 width;
uint16 height;
- } *entries;
+ } *entries;
Common::File picFile;
} _pictureFile;
@@ -147,6 +149,7 @@ public:
Common::Array<uint16> _activatedPLSTs;
void drawPLST(uint16 x);
void drawRect(Common::Rect rect, bool active);
+ void drawImageRect(uint16 id, Common::Rect srcRect, Common::Rect dstRect);
// Water Effect
void scheduleWaterEffect(uint16);
@@ -181,7 +184,6 @@ private:
Graphics::Surface *_mainScreen;
bool _dirtyScreen;
Graphics::PixelFormat _pixelFormat;
- byte findBlackIndex();
};
class LBGraphics {
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp
index 07b08dc220..c7428a92fb 100644
--- a/engines/mohawk/riven.cpp
+++ b/engines/mohawk/riven.cpp
@@ -44,6 +44,7 @@ Common::Rect *g_cathJournalRect2;
Common::Rect *g_atrusJournalRect3;
Common::Rect *g_cathJournalRect3;
Common::Rect *g_trapBookRect3;
+Common::Rect *g_demoExitRect;
MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescription *gamedesc) : MohawkEngine(syst, gamedesc) {
_showHotspots = false;
@@ -73,6 +74,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio
g_atrusJournalRect3 = new Common::Rect(222, 402, 240, 426);
g_cathJournalRect3 = new Common::Rect(291, 408, 311, 419);
g_trapBookRect3 = new Common::Rect(363, 396, 386, 432);
+ g_demoExitRect = new Common::Rect(291, 408, 317, 419);
}
MohawkEngine_Riven::~MohawkEngine_Riven() {
@@ -92,13 +94,13 @@ MohawkEngine_Riven::~MohawkEngine_Riven() {
delete g_atrusJournalRect3;
delete g_cathJournalRect3;
delete g_trapBookRect3;
+ delete g_demoExitRect;
}
GUI::Debugger *MohawkEngine_Riven::getDebugger() {
return _console;
}
-
Common::Error MohawkEngine_Riven::run() {
MohawkEngine::run();
@@ -114,124 +116,133 @@ Common::Error MohawkEngine_Riven::run() {
initVars();
- // Open extras.mhk for common images (non-existant in the demo)
- if (!(getFeatures() & GF_DEMO)) {
- _extrasFile = new MohawkArchive();
- _extrasFile->open("extras.mhk");
- }
+ // Open extras.mhk for common images
+ _extrasFile = new MohawkArchive();
+ _extrasFile->open("extras.mhk");
// Start at main cursor
_gfx->changeCursor(kRivenMainCursor);
- // Load game from launcher/command line if requested
- if (ConfMan.hasKey("save_slot") && !(getFeatures() & GF_DEMO)) {
+ // Let's begin, shall we?
+ if (getFeatures() & GF_DEMO) {
+ // Start the demo off with the videos
+ changeToStack(aspit);
+ changeToCard(6);
+ } else if (ConfMan.hasKey("save_slot")) {
+ // Load game from launcher/command line if requested
uint32 gameToLoad = ConfMan.getInt("save_slot");
Common::StringArray savedGamesList = _saveLoad->generateSaveGameList();
if (gameToLoad > savedGamesList.size())
error ("Could not find saved game");
_saveLoad->loadGame(savedGamesList[gameToLoad]);
- } else { // Otherwise, start us off at aspit's card 1
+ } else {
+ // Otherwise, start us off at aspit's card 1 (the main menu)
changeToStack(aspit);
changeToCard(1);
}
+
+ while (!_gameOver && !shouldQuit())
+ handleEvents();
+
+ return Common::kNoError;
+}
+
+void MohawkEngine_Riven::handleEvents() {
Common::Event event;
- while (!_gameOver) {
- bool needsUpdate = _gfx->runScheduledWaterEffects();
- needsUpdate |= _video->updateBackgroundMovies();
- while (_eventMan->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_MOUSEMOVE:
- _mousePos = event.mouse;
- checkHotspotChange();
+ // Update background videos and the water effect
+ bool needsUpdate = _gfx->runScheduledWaterEffects();
+ needsUpdate |= _video->updateBackgroundMovies();
+
+ while (_eventMan->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_MOUSEMOVE:
+ checkHotspotChange();
- // Check to show the inventory
- if (_mousePos.y >= 392)
+ if (!(getFeatures() & GF_DEMO)) {
+ // Check to show the inventory, but it is always "showing" in the demo
+ if (_eventMan->getMousePos().y >= 392)
_gfx->showInventory();
else
_gfx->hideInventory();
+ }
- needsUpdate = true;
- break;
- case Common::EVENT_LBUTTONDOWN:
+ needsUpdate = true;
+ break;
+ case Common::EVENT_LBUTTONDOWN:
+ if (_curHotspot >= 0)
+ runHotspotScript(_curHotspot, kMouseDownScript);
+ break;
+ case Common::EVENT_LBUTTONUP:
+ // See RivenScript::switchCard() for more information on why we sometimes
+ // disable the next up event.
+ if (!_ignoreNextMouseUp) {
if (_curHotspot >= 0)
- runHotspotScript(_curHotspot, kMouseDownScript);
+ runHotspotScript(_curHotspot, kMouseUpScript);
+ else
+ checkInventoryClick();
+ }
+ _ignoreNextMouseUp = false;
+ break;
+ case Common::EVENT_KEYDOWN:
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_d:
+ if (event.kbd.flags & Common::KBD_CTRL) {
+ _console->attach();
+ _console->onFrame();
+ }
break;
- case Common::EVENT_LBUTTONUP:
- // See RivenScript::switchCard() for more information on why we sometimes
- // disable the next up event.
- if (!_ignoreNextMouseUp) {
- if (_curHotspot >= 0)
- runHotspotScript(_curHotspot, kMouseUpScript);
- else
- checkInventoryClick();
+ case Common::KEYCODE_SPACE:
+ pauseGame();
+ break;
+ case Common::KEYCODE_F4:
+ _showHotspots = !_showHotspots;
+ if (_showHotspots) {
+ for (uint16 i = 0; i < _hotspotCount; i++)
+ _gfx->drawRect(_hotspots[i].rect, _hotspots[i].enabled);
+ needsUpdate = true;
+ } else
+ refreshCard();
+ break;
+ case Common::KEYCODE_F5:
+ runDialog(*_optionsDialog);
+ updateZipMode();
+ break;
+ case Common::KEYCODE_r:
+ // Return to the main menu in the demo on ctrl+r
+ if (event.kbd.flags & Common::KBD_CTRL && getFeatures() & GF_DEMO) {
+ if (_curStack != aspit)
+ changeToStack(aspit);
+ changeToCard(1);
}
- _ignoreNextMouseUp = false;
break;
- case Common::EVENT_KEYDOWN:
- switch (event.kbd.keycode) {
- case Common::KEYCODE_d:
- if (event.kbd.flags & Common::KBD_CTRL) {
- _console->attach();
- _console->onFrame();
- }
- break;
- case Common::KEYCODE_SPACE:
- pauseGame();
- break;
- case Common::KEYCODE_F4:
- _showHotspots = !_showHotspots;
- if (_showHotspots) {
- for (uint16 i = 0; i < _hotspotCount; i++)
- _gfx->drawRect(_hotspots[i].rect, _hotspots[i].enabled);
- needsUpdate = true;
- } else
- refreshCard();
- break;
- case Common::KEYCODE_F5:
- runDialog(*_optionsDialog);
- updateZipMode();
- break;
- case Common::KEYCODE_ESCAPE:
- if (getFeatures() & GF_DEMO) {
- if (_curStack != aspit)
- changeToStack(aspit);
- changeToCard(1);
- }
- break;
- default:
- break;
+ case Common::KEYCODE_p:
+ // Play the intro videos in the demo on ctrl+p
+ if (event.kbd.flags & Common::KBD_CTRL && getFeatures() & GF_DEMO) {
+ if (_curStack != aspit)
+ changeToStack(aspit);
+ changeToCard(6);
}
break;
default:
break;
}
+ break;
+ default:
+ break;
}
+ }
- if (_curHotspot >= 0)
- runHotspotScript(_curHotspot, kMouseInsideScript);
-
- if (shouldQuit()) {
- if (_eventMan->shouldRTL() && (getFeatures() & GF_DEMO) && !(_curStack == aspit && _curCard == 12)) {
- if (_curStack != aspit)
- changeToStack(aspit);
- changeToCard(12);
- _eventMan->resetRTL();
- continue;
- }
- return Common::kNoError;
- }
-
- // Update the screen if we need to
- if (needsUpdate)
- _system->updateScreen();
+ if (_curHotspot >= 0)
+ runHotspotScript(_curHotspot, kMouseInsideScript);
- // Cut down on CPU usage
- _system->delayMillis(10);
- }
+ // Update the screen if we need to
+ if (needsUpdate)
+ _system->updateScreen();
- return Common::kNoError;
+ // Cut down on CPU usage
+ _system->delayMillis(10);
}
// Stack/Card-Related Functions
@@ -379,12 +390,11 @@ void MohawkEngine_Riven::loadHotspots(uint16 id) {
// NOTE: The hotspot scripts are cleared by the RivenScriptManager automatically.
- Common::SeekableReadStream* inStream = getRawData(ID_HSPT, id);
+ Common::SeekableReadStream *inStream = getRawData(ID_HSPT, id);
_hotspotCount = inStream->readUint16BE();
_hotspots = new RivenHotspot[_hotspotCount];
-
for (uint16 i = 0; i < _hotspotCount; i++) {
_hotspots[i].enabled = true;
@@ -396,26 +406,21 @@ void MohawkEngine_Riven::loadHotspots(uint16 id) {
int16 right = inStream->readSint16BE();
int16 bottom = inStream->readSint16BE();
- // Riven has some weird hotspots, disable them here
+ // Riven has some invalid rects, disable them here
+ // Known weird hotspots:
+ // - tspit 371 (DVD: 377), hotspot 4
if (left >= right || top >= bottom) {
- left = top = right = bottom = 0;
- _hotspots[i].enabled = 0;
+ warning("%s %d hotspot %d is invalid: (%d, %d, %d, %d)", getStackName(_curStack).c_str(), _curCard, i, left, top, right, bottom);
+ left = top = right = bottom = 0;
+ _hotspots[i].enabled = 0;
}
_hotspots[i].rect = Common::Rect(left, top, right, bottom);
_hotspots[i].u0 = inStream->readUint16BE();
-
- if (_hotspots[i].u0 != 0)
- warning("Hotspot %d u0 non-zero", i);
-
_hotspots[i].mouse_cursor = inStream->readUint16BE();
_hotspots[i].index = inStream->readUint16BE();
_hotspots[i].u1 = inStream->readSint16BE();
-
- if (_hotspots[i].u1 != -1)
- warning("Hotspot %d u1 not -1", i);
-
_hotspots[i].zipModeHotspot = inStream->readUint16BE();
// Read in the scripts now
@@ -431,7 +436,7 @@ void MohawkEngine_Riven::updateZipMode() {
for (uint32 i = 0; i < _hotspotCount; i++) {
if (_hotspots[i].zipModeHotspot) {
- if (*matchVarToString("azip") != 0) {
+ if (*getVar("azip") != 0) {
// Check if a zip mode hotspot is enabled by checking the name/id against the ZIPS records.
Common::String hotspotName = getName(HotspotNames, _hotspots[i].name_resource);
@@ -455,7 +460,7 @@ void MohawkEngine_Riven::checkHotspotChange() {
uint16 hotspotIndex = 0;
bool foundHotspot = false;
for (uint16 i = 0; i < _hotspotCount; i++)
- if (_hotspots[i].enabled && _hotspots[i].rect.contains(_mousePos)) {
+ if (_hotspots[i].enabled && _hotspots[i].rect.contains(_eventMan->getMousePos())) {
foundHotspot = true;
hotspotIndex = i;
}
@@ -481,50 +486,71 @@ Common::String MohawkEngine_Riven::getHotspotName(uint16 hotspot) {
}
void MohawkEngine_Riven::checkInventoryClick() {
+ Common::Point mousePos = _eventMan->getMousePos();
+
// Don't even bother. We're not in the inventory portion of the screen.
- if (_mousePos.y < 392)
+ if (mousePos.y < 392)
+ return;
+
+ // In the demo, check if we've clicked the exit button
+ if (getFeatures() & GF_DEMO) {
+ if (g_demoExitRect->contains(mousePos)) {
+ if (_curStack == aspit && _curCard == 1) {
+ // From the main menu, go to the "quit" screen
+ changeToCard(12);
+ } else if (_curStack == aspit && _curCard == 12) {
+ // From the "quit" screen, just quit
+ _gameOver = true;
+ } else {
+ // Otherwise, return to the main menu
+ if (_curStack != aspit)
+ changeToStack(aspit);
+ changeToCard(1);
+ }
+ }
return;
+ }
- // No inventory in the demo or opening screens.
- if (getFeatures() & GF_DEMO || _curStack == aspit)
+ // No inventory shown on aspit
+ if (_curStack == aspit)
return;
// Set the return stack/card id's.
- *matchVarToString("returnstackid") = _curStack;
- *matchVarToString("returncardid") = _curCard;
+ *getVar("returnstackid") = _curStack;
+ *getVar("returncardid") = _curCard;
// See RivenGraphics::showInventory() for an explanation
// of the variables' meanings.
- bool hasCathBook = *matchVarToString("acathbook") != 0;
- bool hasTrapBook = *matchVarToString("atrapbook") != 0;
+ bool hasCathBook = *getVar("acathbook") != 0;
+ bool hasTrapBook = *getVar("atrapbook") != 0;
// Go to the book if a hotspot contains the mouse
if (!hasCathBook) {
- if (g_atrusJournalRect1->contains(_mousePos)) {
+ if (g_atrusJournalRect1->contains(mousePos)) {
_gfx->hideInventory();
changeToStack(aspit);
changeToCard(5);
}
} else if (!hasTrapBook) {
- if (g_atrusJournalRect2->contains(_mousePos)) {
+ if (g_atrusJournalRect2->contains(mousePos)) {
_gfx->hideInventory();
changeToStack(aspit);
changeToCard(5);
- } else if (g_cathJournalRect2->contains(_mousePos)) {
+ } else if (g_cathJournalRect2->contains(mousePos)) {
_gfx->hideInventory();
changeToStack(aspit);
changeToCard(6);
}
} else {
- if (g_atrusJournalRect3->contains(_mousePos)) {
+ if (g_atrusJournalRect3->contains(mousePos)) {
_gfx->hideInventory();
changeToStack(aspit);
changeToCard(5);
- } else if (g_cathJournalRect3->contains(_mousePos)) {
+ } else if (g_cathJournalRect3->contains(mousePos)) {
_gfx->hideInventory();
changeToStack(aspit);
changeToCard(6);
- } else if (g_trapBookRect3->contains(_mousePos)) {
+ } else if (g_trapBookRect3->contains(mousePos)) {
_gfx->hideInventory();
changeToStack(aspit);
changeToCard(7);
@@ -607,6 +633,24 @@ void MohawkEngine_Riven::runHotspotScript(uint16 hotspot, uint16 scriptType) {
}
}
+void MohawkEngine_Riven::delayAndUpdate(uint32 ms) {
+ uint32 startTime = _system->getMillis();
+
+ while (_system->getMillis() < startTime + ms && !shouldQuit()) {
+ bool needsUpdate = _gfx->runScheduledWaterEffects();
+ needsUpdate |= _video->updateBackgroundMovies();
+
+ Common::Event event;
+ while (_system->getEventManager()->pollEvent(event))
+ ;
+
+ if (needsUpdate)
+ _system->updateScreen();
+
+ _system->delayMillis(10); // Ease off the CPU
+ }
+}
+
void MohawkEngine_Riven::runLoadDialog() {
GUI::SaveLoadChooser slc("Load Game:", "Load");
slc.setSaveMode(false);
@@ -636,19 +680,19 @@ Common::Error MohawkEngine_Riven::saveGameState(int slot, const char *desc) {
return _saveLoad->saveGame(Common::String(desc)) ? Common::kNoError : Common::kUnknownError;
}
-static const char *rivenStackNames[] = {
- "aspit",
- "bspit",
- "gspit",
- "jspit",
- "ospit",
- "pspit",
- "rspit",
- "tspit"
-};
-
-Common::String MohawkEngine_Riven::getStackName(uint16 stack) {
- return Common::String(rivenStackNames[stack]);
+Common::String MohawkEngine_Riven::getStackName(uint16 stack) const {
+ static const char *rivenStackNames[] = {
+ "aspit",
+ "bspit",
+ "gspit",
+ "jspit",
+ "ospit",
+ "pspit",
+ "rspit",
+ "tspit"
+ };
+
+ return rivenStackNames[stack];
}
bool ZipMode::operator== (const ZipMode &z) const {
diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h
index 631285455e..13818810f1 100644
--- a/engines/mohawk/riven.h
+++ b/engines/mohawk/riven.h
@@ -74,6 +74,7 @@ extern Common::Rect *g_cathJournalRect2;
extern Common::Rect *g_atrusJournalRect3;
extern Common::Rect *g_cathJournalRect3;
extern Common::Rect *g_trapBookRect3;
+extern Common::Rect *g_demoExitRect;
struct RivenHotspot {
uint16 blstID;
@@ -135,6 +136,7 @@ private:
uint16 _curCard;
uint16 _curStack;
void loadCard(uint16);
+ void handleEvents();
// Hotspot related functions and variables
uint16 _hotspotCount;
@@ -153,41 +155,43 @@ private:
bool _ignoreNextMouseUp;
public:
- Common::SeekableReadStream *getExtrasResource(uint32 tag, uint16 id);
- bool _activatedSLST;
- void runLoadDialog();
-
+ // Stack/card/script funtions
void changeToCard(uint16 dest);
void changeToStack(uint16);
void refreshCard();
Common::String getName(uint16 nameResource, uint16 nameID);
- Common::String getStackName(uint16 stack);
+ Common::String getStackName(uint16 stack) const;
void runCardScript(uint16 scriptType);
void runUpdateScreenScript() { runCardScript(kCardUpdateScript); }
- uint16 getCurCard() { return _curCard; }
- uint16 getCurStack() { return _curStack; }
+ uint16 getCurCard() const { return _curCard; }
+ uint16 getCurStack() const { return _curStack; }
uint16 matchRMAPToCard(uint32);
uint32 getCurCardRMAP();
- Common::Point _mousePos;
+ // Hotspot functions/variables
RivenHotspot *_hotspots;
int32 _curHotspot;
Common::Array<ZipMode> _zipModeData;
- uint16 getHotspotCount() { return _hotspotCount; }
+ uint16 getHotspotCount() const { return _hotspotCount; }
void runHotspotScript(uint16 hotspot, uint16 scriptType);
- int32 getCurHotspot() { return _curHotspot; }
+ int32 getCurHotspot() const { return _curHotspot; }
Common::String getHotspotName(uint16 hotspot);
+ // Variable functions
void initVars();
- uint32 getVarCount() { return _varCount; }
+ uint32 getVarCount() const { return _varCount; }
uint32 getGlobalVar(uint32 index);
Common::String getGlobalVarName(uint32 index);
uint32 *getLocalVar(uint32 index);
- uint32 *matchVarToString(Common::String varName);
- uint32 *matchVarToString(const char *varName);
+ uint32 *getVar(const Common::String &varName);
+ // Miscellaneous
void setGameOver() { _gameOver = true; }
void ignoreNextMouseUp() { _ignoreNextMouseUp = true; }
+ Common::SeekableReadStream *getExtrasResource(uint32 tag, uint16 id);
+ bool _activatedSLST;
+ void runLoadDialog();
+ void delayAndUpdate(uint32 ms);
};
} // End of namespace Mohawk
diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp
index 67d621a54c..5a2321a07a 100644
--- a/engines/mohawk/riven_external.cpp
+++ b/engines/mohawk/riven_external.cpp
@@ -34,8 +34,12 @@
namespace Mohawk {
+static const uint32 kDomeSliderDefaultState = 0x01F00000;
+static const uint32 kDomeSliderSlotCount = 25;
+
RivenExternal::RivenExternal(MohawkEngine_Riven *vm) : _vm(vm) {
setupCommands();
+ _sliderState = kDomeSliderDefaultState;
}
RivenExternal::~RivenExternal() {
@@ -64,6 +68,8 @@ void RivenExternal::setupCommands() {
COMMAND(xadisablemenureturn);
COMMAND(xaenablemenureturn);
COMMAND(xalaunchbrowser);
+ COMMAND(xadisablemenuintro);
+ COMMAND(xaenablemenuintro);
// bspit (Bookmaking Island) external commands
COMMAND(xblabopenbook);
@@ -200,16 +206,33 @@ void RivenExternal::runCommand(uint16 argc, uint16 *argv) {
}
void RivenExternal::runDemoBoundaryDialog() {
- GUI::MessageDialog dialog("This demo does not allow you\n"
- "to visit that part of Riven.");
+ GUI::MessageDialog dialog("Exploration beyond this point available only within the full version of\n"
+ "the game.");
dialog.runModal();
}
void RivenExternal::runEndGame(uint16 video) {
_vm->_sound->stopAllSLST();
- _vm->_video->playMovieBlocking(video);
+ _vm->_video->playMovie(video);
+ runCredits(video);
+}
+void RivenExternal::runCredits(uint16 video) {
// TODO: Play until the last frame and then run the credits
+
+ VideoHandle videoHandle = _vm->_video->findVideoHandle(video);
+
+ while (!_vm->_video->endOfVideo(videoHandle) && !_vm->shouldQuit()) {
+ if (_vm->_video->updateBackgroundMovies())
+ _vm->_system->updateScreen();
+
+ Common::Event event;
+ while (_vm->_system->getEventManager()->pollEvent(event))
+ ;
+
+ _vm->_system->delayMillis(10);
+ }
+
_vm->setGameOver();
}
@@ -231,7 +254,151 @@ void RivenExternal::runDomeCheck() {
// frame that is the magic one is the one with the golden symbol) but we
// give a 3 frame leeway in either direction.
if (frameCount - curFrame < 3 || curFrame < 3)
- *_vm->matchVarToString("domecheck") = 1;
+ *_vm->getVar("domecheck") = 1;
+}
+
+void RivenExternal::resetDomeSliders(uint16 bitmapId, uint16 soundId, uint16 startHotspot) {
+ // The rightmost slider should move left until it finds the next slider,
+ // then those two continue until they find the third slider. This continues
+ // until all five sliders have returned their starting slots.
+ byte slidersFound = 0;
+ for (uint32 i = 0; i < kDomeSliderSlotCount; i++) {
+ if (_sliderState & (1 << i)) {
+ // A slider occupies this spot. Increase the number of sliders we
+ // have found, but we're not doing any moving this iteration.
+ slidersFound++;
+ } else {
+ // Move all the sliders we have found over one slot
+ for (byte j = 0; j < slidersFound; j++) {
+ _sliderState &= ~(1 << (i - j - 1));
+ _sliderState |= 1 << (i - j);
+ }
+
+ // If we have at least one found slider, it has now moved
+ // so we should redraw and play a tick sound
+ if (slidersFound) {
+ _vm->_sound->playSound(soundId, false);
+ drawDomeSliders(bitmapId, startHotspot);
+ _vm->_system->delayMillis(10);
+ }
+ }
+ }
+
+ // Sanity checks - the slider count should always be 5 and we should end up at
+ // the default state after moving them all over.
+ assert(slidersFound == 5);
+ assert(_sliderState == kDomeSliderDefaultState);
+}
+
+void RivenExternal::checkDomeSliders(uint16 resetSlidersHotspot, uint16 openDomeHotspot) {
+ // Let's see if we're all matched up...
+ if (*_vm->getVar("adomecombo") == _sliderState) {
+ // Set the button hotspot to the open dome hotspot
+ _vm->_hotspots[resetSlidersHotspot].enabled = false;
+ _vm->_hotspots[openDomeHotspot].enabled = true;
+ } else {
+ // Set the button hotspot to the reset sliders hotspot
+ _vm->_hotspots[resetSlidersHotspot].enabled = true;
+ _vm->_hotspots[openDomeHotspot].enabled = false;
+ }
+}
+
+void RivenExternal::checkSliderCursorChange(uint16 startHotspot) {
+ // Set the cursor based on _sliderState and what hotspot we're over
+ for (uint16 i = 0; i < kDomeSliderSlotCount; i++) {
+ if (_vm->_hotspots[i + startHotspot].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
+ if (_sliderState & (1 << (24 - i)))
+ _vm->_gfx->changeCursor(kRivenOpenHandCursor);
+ else
+ _vm->_gfx->changeCursor(kRivenMainCursor);
+ break;
+ }
+ }
+}
+
+void RivenExternal::dragDomeSlider(uint16 bitmapId, uint16 soundId, uint16 resetSlidersHotspot, uint16 openDomeHotspot, uint16 startHotspot) {
+ int16 foundSlider = -1;
+
+ for (uint16 i = 0; i < kDomeSliderSlotCount; i++) {
+ if (_vm->_hotspots[i + startHotspot].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
+ // If the slider is not at this hotspot, we can't do anything else
+ if (!(_sliderState & (1 << (24 - i))))
+ return;
+
+ foundSlider = i;
+ break;
+ }
+ }
+
+ // We're not over any slider
+ if (foundSlider < 0)
+ return;
+
+ // We've clicked down, so show the closed hand cursor
+ _vm->_gfx->changeCursor(kRivenClosedHandCursor);
+
+ bool done = false;
+ while (!done) {
+ Common::Event event;
+ while (_vm->_system->getEventManager()->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_MOUSEMOVE:
+ if (foundSlider < 24 && !(_sliderState & (1 << (23 - foundSlider))) && _vm->_hotspots[foundSlider + startHotspot + 1].rect.contains(event.mouse)) {
+ // We've moved the slider right one space
+ _sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
+ foundSlider++;
+ _sliderState |= 1 << (24 - foundSlider);
+
+ // Now play a click sound and redraw
+ _vm->_sound->playSound(soundId, false);
+ drawDomeSliders(bitmapId, startHotspot);
+ } else if (foundSlider > 0 && !(_sliderState & (1 << (25 - foundSlider))) && _vm->_hotspots[foundSlider + startHotspot - 1].rect.contains(event.mouse)) {
+ // We've moved the slider left one space
+ _sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
+ foundSlider--;
+ _sliderState |= 1 << (24 - foundSlider);
+
+ // Now play a click sound and redraw
+ _vm->_sound->playSound(soundId, false);
+ drawDomeSliders(bitmapId, startHotspot);
+ } else
+ _vm->_system->updateScreen(); // A normal update for the cursor
+ break;
+ case Common::EVENT_LBUTTONUP:
+ done = true;
+ break;
+ default:
+ break;
+ }
+ }
+ _vm->_system->delayMillis(10);
+ }
+
+ // Check to see if we have the right combination
+ checkDomeSliders(resetSlidersHotspot, openDomeHotspot);
+}
+
+void RivenExternal::drawDomeSliders(uint16 bitmapId, uint16 startHotspot) {
+ Common::Rect dstAreaRect = Common::Rect(200, 250, 420, 319);
+
+ // On pspit, the rect is different by two pixels
+ // (alternatively, we could just use hotspot 3 here, but only on pspit is there a hotspot for this)
+ if (_vm->getCurStack() == pspit)
+ dstAreaRect.translate(-2, 0);
+
+ for (uint16 i = 0; i < kDomeSliderSlotCount; i++) {
+ Common::Rect srcRect = _vm->_hotspots[startHotspot + i].rect;
+ srcRect.translate(-dstAreaRect.left, -dstAreaRect.top); // Adjust the rect so it's in the destination area
+
+ Common::Rect dstRect = _vm->_hotspots[startHotspot + i].rect;
+
+ if (_sliderState & (1 << (24 - i)))
+ _vm->_gfx->drawImageRect(bitmapId, srcRect, dstRect);
+ else
+ _vm->_gfx->drawImageRect(bitmapId + 1, srcRect, dstRect);
+ }
+
+ _vm->_gfx->updateScreen();
}
// ------------------------------------------------------------------------------------
@@ -252,7 +419,7 @@ void RivenExternal::xasetupcomplete(uint16 argc, uint16 *argv) {
void RivenExternal::xaatrusopenbook(uint16 argc, uint16 *argv) {
// Get the variable
- uint32 page = *_vm->matchVarToString("aatruspage");
+ uint32 page = *_vm->getVar("aatruspage");
// Set hotspots depending on the page
if (page == 1) {
@@ -271,13 +438,13 @@ void RivenExternal::xaatrusopenbook(uint16 argc, uint16 *argv) {
void RivenExternal::xaatrusbookback(uint16 argc, uint16 *argv) {
// Return to where we were before entering the book
- _vm->changeToStack(*_vm->matchVarToString("returnstackid"));
- _vm->changeToCard(*_vm->matchVarToString("returncardid"));
+ _vm->changeToStack(*_vm->getVar("returnstackid"));
+ _vm->changeToCard(*_vm->getVar("returncardid"));
}
void RivenExternal::xaatrusbookprevpage(uint16 argc, uint16 *argv) {
// Get the page variable
- uint32 *page = _vm->matchVarToString("aatruspage");
+ uint32 *page = _vm->getVar("aatruspage");
// Decrement the page if it's not the first page
if (*page == 1)
@@ -297,7 +464,7 @@ void RivenExternal::xaatrusbookprevpage(uint16 argc, uint16 *argv) {
void RivenExternal::xaatrusbooknextpage(uint16 argc, uint16 *argv) {
// Get the page variable
- uint32 *page = _vm->matchVarToString("aatruspage");
+ uint32 *page = _vm->getVar("aatruspage");
// Increment the page if it's not the last page
if (((_vm->getFeatures() & GF_DEMO) && *page == 6) || *page == 10)
@@ -317,7 +484,7 @@ void RivenExternal::xaatrusbooknextpage(uint16 argc, uint16 *argv) {
void RivenExternal::xacathopenbook(uint16 argc, uint16 *argv) {
// Get the variable
- uint32 page = *_vm->matchVarToString("acathpage");
+ uint32 page = *_vm->getVar("acathpage");
// Set hotspots depending on the page
if (page == 1) {
@@ -340,19 +507,33 @@ void RivenExternal::xacathopenbook(uint16 argc, uint16 *argv) {
_vm->_gfx->drawPLST(51);
if (page == 28) {
- // TODO: Draw telescope combination
+ // Draw the telescope combination
+ // The images for the numbers are tBMP's 13 through 17.
+ // The start point is at (156, 247)
+ uint32 teleCombo = *_vm->getVar("tcorrectorder");
+ static const uint16 kNumberWidth = 32;
+ static const uint16 kNumberHeight = 25;
+ static const uint16 kDstX = 156;
+ static const uint16 kDstY = 247;
+
+ for (byte i = 0; i < 5; i++) {
+ uint16 offset = (getComboDigit(teleCombo, i) - 1) * kNumberWidth;
+ Common::Rect srcRect = Common::Rect(offset, 0, offset + kNumberWidth, kNumberHeight);
+ Common::Rect dstRect = Common::Rect(i * kNumberWidth + kDstX, kDstY, (i + 1) * kNumberWidth + kDstX, kDstY + kNumberHeight);
+ _vm->_gfx->drawImageRect(i + 13, srcRect, dstRect);
+ }
}
}
void RivenExternal::xacathbookback(uint16 argc, uint16 *argv) {
// Return to where we were before entering the book
- _vm->changeToStack(*_vm->matchVarToString("returnstackid"));
- _vm->changeToCard(*_vm->matchVarToString("returncardid"));
+ _vm->changeToStack(*_vm->getVar("returnstackid"));
+ _vm->changeToCard(*_vm->getVar("returncardid"));
}
void RivenExternal::xacathbookprevpage(uint16 argc, uint16 *argv) {
// Get the variable
- uint32 *page = _vm->matchVarToString("acathpage");
+ uint32 *page = _vm->getVar("acathpage");
// Increment the page if it's not the first page
if (*page == 1)
@@ -369,7 +550,7 @@ void RivenExternal::xacathbookprevpage(uint16 argc, uint16 *argv) {
void RivenExternal::xacathbooknextpage(uint16 argc, uint16 *argv) {
// Get the variable
- uint32 *page = _vm->matchVarToString("acathpage");
+ uint32 *page = _vm->getVar("acathpage");
// Increment the page if it's not the last page
if (*page == 49)
@@ -386,14 +567,14 @@ void RivenExternal::xacathbooknextpage(uint16 argc, uint16 *argv) {
void RivenExternal::xtrapbookback(uint16 argc, uint16 *argv) {
// Return to where we were before entering the book
- *_vm->matchVarToString("atrap") = 0;
- _vm->changeToStack(*_vm->matchVarToString("returnstackid"));
- _vm->changeToCard(*_vm->matchVarToString("returncardid"));
+ *_vm->getVar("atrap") = 0;
+ _vm->changeToStack(*_vm->getVar("returnstackid"));
+ _vm->changeToCard(*_vm->getVar("returncardid"));
}
void RivenExternal::xatrapbookclose(uint16 argc, uint16 *argv) {
// Close the trap book
- *_vm->matchVarToString("atrap") = 0;
+ *_vm->getVar("atrap") = 0;
// Play the page turning sound
_vm->_sound->playSound(8, false);
@@ -403,7 +584,7 @@ void RivenExternal::xatrapbookclose(uint16 argc, uint16 *argv) {
void RivenExternal::xatrapbookopen(uint16 argc, uint16 *argv) {
// Open the trap book
- *_vm->matchVarToString("atrap") = 1;
+ *_vm->getVar("atrap") = 1;
// Play the page turning sound
_vm->_sound->playSound(9, false);
@@ -417,42 +598,99 @@ void RivenExternal::xarestoregame(uint16 argc, uint16 *argv) {
}
void RivenExternal::xadisablemenureturn(uint16 argc, uint16 *argv) {
- // Dummy function -- implemented in Mohawk::go
+ // This function would normally enable the Windows menu item for
+ // returning to the main menu. Ctrl+r will do this instead.
+ // The original also had this shortcut.
}
void RivenExternal::xaenablemenureturn(uint16 argc, uint16 *argv) {
- // Dummy function -- implemented in Mohawk::go
+ // This function would normally enable the Windows menu item for
+ // returning to the main menu. Ctrl+r will do this instead.
+ // The original also had this shortcut.
}
void RivenExternal::xalaunchbrowser(uint16 argc, uint16 *argv) {
// Well, we can't launch a browser for obvious reasons ;)
+ // The original text is as follows (for reference):
+
+ // If you have an auto-dial configured connection to the Internet,
+ // please select YES below.
+ //
+ // America Online and CompuServe users may experience difficulty. If
+ // you find that you are unable to connect, please quit the Riven
+ // Demo, launch your browser and type in the following URL:
+ //
+ // www.redorb.com/buyriven
+ //
+ // Would you like to attempt to make the connection?
+ //
+ // [YES] [NO]
+
GUI::MessageDialog dialog("At this point, the Riven Demo would\n"
- "open up a web browser to bring you to\n"
- "the Riven website. ScummVM cannot do\n"
- "that. Visit the site on your own.");
+ "ask if you would like to open a web browser\n"
+ "to bring you to the Red Orb store to buy\n"
+ "the game. ScummVM cannot do that and\n"
+ "the site no longer exists.");
dialog.runModal();
}
+void RivenExternal::xadisablemenuintro(uint16 argc, uint16 *argv) {
+ // This function would normally enable the Windows menu item for
+ // playing the intro. Ctrl+p will play the intro movies instead.
+ // The original also had this shortcut.
+
+ // Hide the "exit" button here
+ _vm->_gfx->hideInventory();
+}
+
+void RivenExternal::xaenablemenuintro(uint16 argc, uint16 *argv) {
+ // This function would normally enable the Windows menu item for
+ // playing the intro. Ctrl+p will play the intro movies instead.
+ // The original also had this shortcut.
+
+ // Show the "exit" button here
+ _vm->_gfx->showInventory();
+}
+
// ------------------------------------------------------------------------------------
// bspit (Bookmaking Island) external commands
// ------------------------------------------------------------------------------------
void RivenExternal::xblabopenbook(uint16 argc, uint16 *argv) {
// Get the variable
- uint32 page = *_vm->matchVarToString("blabbook");
+ uint32 page = *_vm->getVar("blabbook");
// Draw the image of the page based on the blabbook variable
_vm->_gfx->drawPLST(page);
- // TODO: Draw the dome combo
if (page == 14) {
- warning ("Need to draw dome combo");
+ // Draw the dome combination
+ // The images for the numbers are tBMP's 364 through 368
+ // The start point is at (240, 82)
+ uint32 domeCombo = *_vm->getVar("adomecombo");
+ static const uint16 kNumberWidth = 32;
+ static const uint16 kNumberHeight = 24;
+ static const uint16 kDstX = 240;
+ static const uint16 kDstY = 82;
+ byte numCount = 0;
+
+ for (int bitPos = 24; bitPos >= 0; bitPos--) {
+ if (domeCombo & (1 << bitPos)) {
+ uint16 offset = (24 - bitPos) * kNumberWidth;
+ Common::Rect srcRect = Common::Rect(offset, 0, offset + kNumberWidth, kNumberHeight);
+ Common::Rect dstRect = Common::Rect(numCount * kNumberWidth + kDstX, kDstY, (numCount + 1) * kNumberWidth + kDstX, kDstY + kNumberHeight);
+ _vm->_gfx->drawImageRect(numCount + 364, srcRect, dstRect);
+ numCount++;
+ }
+ }
+
+ assert(numCount == 5); // Sanity check
}
}
void RivenExternal::xblabbookprevpage(uint16 argc, uint16 *argv) {
// Get the page variable
- uint32 *page = _vm->matchVarToString("blabbook");
+ uint32 *page = _vm->getVar("blabbook");
// Decrement the page if it's not the first page
if (*page == 1)
@@ -469,7 +707,7 @@ void RivenExternal::xblabbookprevpage(uint16 argc, uint16 *argv) {
void RivenExternal::xblabbooknextpage(uint16 argc, uint16 *argv) {
// Get the page variable
- uint32 *page = _vm->matchVarToString("blabbook");
+ uint32 *page = _vm->getVar("blabbook");
// Increment the page if it's not the last page
if (*page == 22)
@@ -485,8 +723,8 @@ void RivenExternal::xblabbooknextpage(uint16 argc, uint16 *argv) {
}
void RivenExternal::xsoundplug(uint16 argc, uint16 *argv) {
- uint32 heat = *_vm->matchVarToString("bheat");
- uint32 boilerInactive = *_vm->matchVarToString("bcratergg");
+ uint32 heat = *_vm->getVar("bheat");
+ uint32 boilerInactive = *_vm->getVar("bcratergg");
if (heat != 0)
_vm->_sound->playSLST(1, _vm->getCurCard());
@@ -497,9 +735,9 @@ void RivenExternal::xsoundplug(uint16 argc, uint16 *argv) {
}
void RivenExternal::xbchangeboiler(uint16 argc, uint16 *argv) {
- uint32 heat = *_vm->matchVarToString("bheat");
- uint32 water = *_vm->matchVarToString("bblrwtr");
- uint32 platform = *_vm->matchVarToString("bblrgrt");
+ uint32 heat = *_vm->getVar("bheat");
+ uint32 water = *_vm->getVar("bblrwtr");
+ uint32 platform = *_vm->getVar("bblrgrt");
if (argv[0] == 1) {
if (water == 0) {
@@ -561,8 +799,8 @@ void RivenExternal::xbchangeboiler(uint16 argc, uint16 *argv) {
}
void RivenExternal::xbupdateboiler(uint16 argc, uint16 *argv) {
- uint32 heat = *_vm->matchVarToString("bheat");
- uint32 platform = *_vm->matchVarToString("bblrgrt");
+ uint32 heat = *_vm->getVar("bheat");
+ uint32 platform = *_vm->getVar("bblrgrt");
if (heat) {
if (platform == 0) {
@@ -613,7 +851,7 @@ void RivenExternal::xbait(uint16 argc, uint16 *argv) {
// Set the bait if we put it on the plate
if (_vm->_hotspots[9].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
- *_vm->matchVarToString("bbait") = 1;
+ *_vm->getVar("bbait") = 1;
_vm->_gfx->drawPLST(4);
_vm->_gfx->updateScreen();
_vm->_hotspots[3].enabled = false; // Disable bait hotspot
@@ -652,32 +890,32 @@ void RivenExternal::xbaitplate(uint16 argc, uint16 *argv) {
// Set the bait if we put it on the plate, remove otherwise
if (_vm->_hotspots[9].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
- *_vm->matchVarToString("bbait") = 1;
+ *_vm->getVar("bbait") = 1;
_vm->_gfx->drawPLST(4);
_vm->_gfx->updateScreen();
_vm->_hotspots[3].enabled = false; // Disable bait hotspot
_vm->_hotspots[9].enabled = true; // Enable baitplate hotspot
} else {
- *_vm->matchVarToString("bbait") = 0;
+ *_vm->getVar("bbait") = 0;
_vm->_hotspots[3].enabled = true; // Enable bait hotspot
_vm->_hotspots[9].enabled = false; // Disable baitplate hotspot
}
}
void RivenExternal::xbisland190_opencard(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ checkDomeSliders(27, 28);
}
void RivenExternal::xbisland190_resetsliders(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ resetDomeSliders(701, 41, 2);
}
void RivenExternal::xbisland190_slidermd(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ dragDomeSlider(701, 41, 27, 28, 2);
}
void RivenExternal::xbisland190_slidermw(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ checkSliderCursorChange(2);
}
void RivenExternal::xbscpbtn(uint16 argc, uint16 *argv) {
@@ -689,15 +927,17 @@ void RivenExternal::xbisland_domecheck(uint16 argc, uint16 *argv) {
}
void RivenExternal::xvalvecontrol(uint16 argc, uint16 *argv) {
+ Common::Point startPos = _vm->_system->getEventManager()->getMousePos();
+
// Get the variable for the valve
- uint32 *valve = _vm->matchVarToString("bvalve");
+ uint32 *valve = _vm->getVar("bvalve");
int changeX = 0;
int changeY = 0;
bool done = false;
// Set the cursor to the closed position
- _vm->_gfx->changeCursor(2004);
+ _vm->_gfx->changeCursor(kRivenClosedHandCursor);
_vm->_system->updateScreen();
while (!done) {
@@ -706,8 +946,8 @@ void RivenExternal::xvalvecontrol(uint16 argc, uint16 *argv) {
while (_vm->_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_MOUSEMOVE:
- changeX = event.mouse.x - _vm->_mousePos.x;
- changeY = _vm->_mousePos.y - event.mouse.y;
+ changeX = event.mouse.x - startPos.x;
+ changeY = startPos.y - event.mouse.y;
_vm->_system->updateScreen();
break;
case Common::EVENT_LBUTTONUP:
@@ -746,26 +986,26 @@ void RivenExternal::xvalvecontrol(uint16 argc, uint16 *argv) {
// If we changed state and the new state is that the valve is flowing to
// the boiler, we need to update the boiler state.
if (*valve == 1) {
- if (*_vm->matchVarToString("bidvlv") == 1) { // Check which way the water is going at the boiler
- if (*_vm->matchVarToString("bblrarm") == 1) {
+ if (*_vm->getVar("bidvlv") == 1) { // Check which way the water is going at the boiler
+ if (*_vm->getVar("bblrarm") == 1) {
// If the pipe is open, make sure the water is drained out
- *_vm->matchVarToString("bheat") = 0;
- *_vm->matchVarToString("bblrwtr") = 0;
+ *_vm->getVar("bheat") = 0;
+ *_vm->getVar("bblrwtr") = 0;
} else {
// If the pipe is closed, fill the boiler again
- *_vm->matchVarToString("bheat") = *_vm->matchVarToString("bblrvalve");
- *_vm->matchVarToString("bblrwtr") = 1;
+ *_vm->getVar("bheat") = *_vm->getVar("bblrvalve");
+ *_vm->getVar("bblrwtr") = 1;
}
} else {
// Have the grating inside the boiler match the switch outside
- *_vm->matchVarToString("bblrgrt") = (*_vm->matchVarToString("bblrsw") == 1) ? 0 : 1;
+ *_vm->getVar("bblrgrt") = (*_vm->getVar("bblrsw") == 1) ? 0 : 1;
}
}
}
void RivenExternal::xbchipper(uint16 argc, uint16 *argv) {
// Why is this an external command....?
- if (*_vm->matchVarToString("bvalve") == 2)
+ if (*_vm->getVar("bvalve") == 2)
_vm->_video->playMovieBlocking(2);
}
@@ -786,19 +1026,19 @@ void RivenExternal::xgpincontrols(uint16 argc, uint16 *argv) {
}
void RivenExternal::xgisland25_opencard(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ checkDomeSliders(29, 30);
}
void RivenExternal::xgisland25_resetsliders(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ resetDomeSliders(161, 16, 2);
}
void RivenExternal::xgisland25_slidermd(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ dragDomeSlider(161, 16, 29, 30, 2);
}
void RivenExternal::xgisland25_slidermw(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ checkSliderCursorChange(2);
}
void RivenExternal::xgscpbtn(uint16 argc, uint16 *argv) {
@@ -815,13 +1055,13 @@ void RivenExternal::xgplateau3160_dopools(uint16 argc, uint16 *argv) {
void RivenExternal::xgwt200_scribetime(uint16 argc, uint16 *argv) {
// Get the current time
- *_vm->matchVarToString("gscribetime") = _vm->_system->getMillis();
+ *_vm->getVar("gscribetime") = _vm->_system->getMillis();
}
void RivenExternal::xgwt900_scribe(uint16 argc, uint16 *argv) {
- uint32 *scribeVar = _vm->matchVarToString("gscribe");
+ uint32 *scribeVar = _vm->getVar("gscribe");
- if (*scribeVar == 1 && _vm->_system->getMillis() > *_vm->matchVarToString("gscribetime") + 40000)
+ if (*scribeVar == 1 && _vm->_system->getMillis() > *_vm->getVar("gscribetime") + 40000)
*scribeVar = 2;
}
@@ -863,9 +1103,9 @@ void RivenExternal::xglview_villageon(uint16 argc, uint16 *argv) {
void RivenExternal::xreseticons(uint16 argc, uint16 *argv) {
// Reset the icons when going to Tay (rspit)
- *_vm->matchVarToString("jicons") = 0;
- *_vm->matchVarToString("jiconorder") = 0;
- *_vm->matchVarToString("jrbook") = 0;
+ *_vm->getVar("jicons") = 0;
+ *_vm->getVar("jiconorder") = 0;
+ *_vm->getVar("jrbook") = 0;
}
// Count up how many icons are pressed
@@ -886,30 +1126,30 @@ static byte countDepressedIcons(uint32 iconOrderVar) {
void RivenExternal::xicon(uint16 argc, uint16 *argv) {
// Set atemp as the status of whether or not the icon can be depressed.
- if (*_vm->matchVarToString("jicons") & (1 << (argv[0] - 1))) {
+ if (*_vm->getVar("jicons") & (1 << (argv[0] - 1))) {
// This icon is depressed. Allow depression only if the last depressed icon was this one.
- if ((*_vm->matchVarToString("jiconorder") & 0x1f) == argv[0])
- *_vm->matchVarToString("atemp") = 1;
+ if ((*_vm->getVar("jiconorder") & 0x1f) == argv[0])
+ *_vm->getVar("atemp") = 1;
else
- *_vm->matchVarToString("atemp") = 2;
+ *_vm->getVar("atemp") = 2;
} else
- *_vm->matchVarToString("atemp") = 0;
+ *_vm->getVar("atemp") = 0;
}
void RivenExternal::xcheckicons(uint16 argc, uint16 *argv) {
// Reset the icons if this is the sixth icon
- uint32 *iconOrderVar = _vm->matchVarToString("jiconorder");
+ uint32 *iconOrderVar = _vm->getVar("jiconorder");
if (countDepressedIcons(*iconOrderVar) == 5) {
*iconOrderVar = 0;
- *_vm->matchVarToString("jicons") = 0;
+ *_vm->getVar("jicons") = 0;
_vm->_sound->playSound(46, false);
}
}
void RivenExternal::xtoggleicon(uint16 argc, uint16 *argv) {
// Get the variables
- uint32 *iconsDepressed = _vm->matchVarToString("jicons");
- uint32 *iconOrderVar = _vm->matchVarToString("jiconorder");
+ uint32 *iconsDepressed = _vm->getVar("jicons");
+ uint32 *iconOrderVar = _vm->getVar("jiconorder");
if (*iconsDepressed & (1 << (argv[0] - 1))) {
// The icon is depressed, now unpress it
@@ -922,13 +1162,13 @@ void RivenExternal::xtoggleicon(uint16 argc, uint16 *argv) {
}
// Check if the puzzle is complete now and assign 1 to jrbook if the puzzle is complete.
- if (*iconOrderVar == *_vm->matchVarToString("jiconcorrectorder"))
- *_vm->matchVarToString("jrbook") = 1;
+ if (*iconOrderVar == *_vm->getVar("jiconcorrectorder"))
+ *_vm->getVar("jrbook") = 1;
}
void RivenExternal::xjtunnel103_pictfix(uint16 argc, uint16 *argv) {
// Get the jicons variable which contains which of the stones are depressed in the rebel tunnel puzzle
- uint32 iconsDepressed = *_vm->matchVarToString("jicons");
+ uint32 iconsDepressed = *_vm->getVar("jicons");
// Now, draw which icons are depressed based on the bits of the variable
if (iconsDepressed & (1 << 0))
@@ -949,7 +1189,7 @@ void RivenExternal::xjtunnel103_pictfix(uint16 argc, uint16 *argv) {
void RivenExternal::xjtunnel104_pictfix(uint16 argc, uint16 *argv) {
// Get the jicons variable which contains which of the stones are depressed in the rebel tunnel puzzle
- uint32 iconsDepressed = *_vm->matchVarToString("jicons");
+ uint32 iconsDepressed = *_vm->getVar("jicons");
// Now, draw which icons are depressed based on the bits of the variable
if (iconsDepressed & (1 << 9))
@@ -972,7 +1212,7 @@ void RivenExternal::xjtunnel104_pictfix(uint16 argc, uint16 *argv) {
void RivenExternal::xjtunnel105_pictfix(uint16 argc, uint16 *argv) {
// Get the jicons variable which contains which of the stones are depressed in the rebel tunnel puzzle
- uint32 iconsDepressed = *_vm->matchVarToString("jicons");
+ uint32 iconsDepressed = *_vm->getVar("jicons");
// Now, draw which icons are depressed based on the bits of the variable
if (iconsDepressed & (1 << 3))
@@ -993,7 +1233,7 @@ void RivenExternal::xjtunnel105_pictfix(uint16 argc, uint16 *argv) {
void RivenExternal::xjtunnel106_pictfix(uint16 argc, uint16 *argv) {
// Get the jicons variable which contains which of the stones are depressed in the rebel tunnel puzzle
- uint32 iconsDepressed = *_vm->matchVarToString("jicons");
+ uint32 iconsDepressed = *_vm->getVar("jicons");
// Now, draw which icons are depressed based on the bits of the variable
if (iconsDepressed & (1 << 16))
@@ -1027,7 +1267,7 @@ void RivenExternal::xvga1300_carriage(uint16 argc, uint16 *argv) {
_vm->changeToCard(_vm->matchRMAPToCard(0x183a9)); // Change to card looking straight again
_vm->_video->playMovieBlocking(2);
- uint32 *gallows = _vm->matchVarToString("jgallows");
+ uint32 *gallows = _vm->getVar("jgallows");
if (*gallows == 1) {
// If the gallows is open, play the up movie and return
_vm->_video->playMovieBlocking(3);
@@ -1072,15 +1312,15 @@ void RivenExternal::xvga1300_carriage(uint16 argc, uint16 *argv) {
}
void RivenExternal::xjdome25_resetsliders(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ resetDomeSliders(_vm->getFeatures() & GF_DVD ? 547 : 548, 81, 2);
}
void RivenExternal::xjdome25_slidermd(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ dragDomeSlider(_vm->getFeatures() & GF_DVD ? 547: 548, 81, 29, 28, 2);
}
void RivenExternal::xjdome25_slidermw(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ checkSliderCursorChange(2);
}
void RivenExternal::xjscpbtn(uint16 argc, uint16 *argv) {
@@ -1092,18 +1332,20 @@ void RivenExternal::xjisland3500_domecheck(uint16 argc, uint16 *argv) {
}
int RivenExternal::jspitElevatorLoop() {
+ Common::Point startPos = _vm->_system->getEventManager()->getMousePos();
+
Common::Event event;
int changeLevel = 0;
- _vm->_gfx->changeCursor(2004);
+ _vm->_gfx->changeCursor(kRivenClosedHandCursor);
_vm->_system->updateScreen();
for (;;) {
while (_vm->_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_MOUSEMOVE:
- if (event.mouse.y > (_vm->_mousePos.y + 10)) {
+ if (event.mouse.y > (startPos.y + 10)) {
changeLevel = -1;
- } else if (event.mouse.y < (_vm->_mousePos.y - 10)) {
+ } else if (event.mouse.y < (startPos.y - 10)) {
changeLevel = 1;
} else {
changeLevel = 0;
@@ -1157,7 +1399,7 @@ void RivenExternal::xhandlecontrolmid(uint16 argc, uint16 *argv) {
_vm->_video->playMovieBlocking(6);
// If the whark's mouth is open, close it
- uint32 *mouthVar = _vm->matchVarToString("jwmouth");
+ uint32 *mouthVar = _vm->getVar("jwmouth");
if (*mouthVar == 1) {
_vm->_video->playMovieBlocking(3);
_vm->_video->playMovieBlocking(8);
@@ -1176,27 +1418,27 @@ void RivenExternal::xhandlecontrolmid(uint16 argc, uint16 *argv) {
void RivenExternal::xjplaybeetle_550(uint16 argc, uint16 *argv) {
// Play a beetle animation 25% of the time
- *_vm->matchVarToString("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0) ? 1 : 0;
+ *_vm->getVar("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0) ? 1 : 0;
}
void RivenExternal::xjplaybeetle_600(uint16 argc, uint16 *argv) {
// Play a beetle animation 25% of the time
- *_vm->matchVarToString("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0) ? 1 : 0;
+ *_vm->getVar("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0) ? 1 : 0;
}
void RivenExternal::xjplaybeetle_950(uint16 argc, uint16 *argv) {
// Play a beetle animation 25% of the time
- *_vm->matchVarToString("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0) ? 1 : 0;
+ *_vm->getVar("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0) ? 1 : 0;
}
void RivenExternal::xjplaybeetle_1050(uint16 argc, uint16 *argv) {
// Play a beetle animation 25% of the time
- *_vm->matchVarToString("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0) ? 1 : 0;
+ *_vm->getVar("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0) ? 1 : 0;
}
void RivenExternal::xjplaybeetle_1450(uint16 argc, uint16 *argv) {
// Play a beetle animation 25% of the time as long as the girl is not present
- *_vm->matchVarToString("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0 && *_vm->matchVarToString("jgirl") != 1) ? 1 : 0;
+ *_vm->getVar("jplaybeetle") = (_vm->_rnd->getRandomNumberRng(0, 3) == 0 && *_vm->getVar("jgirl") != 1) ? 1 : 0;
}
void RivenExternal::xjlagoon700_alert(uint16 argc, uint16 *argv) {
@@ -1209,7 +1451,7 @@ void RivenExternal::xjlagoon800_alert(uint16 argc, uint16 *argv) {
void RivenExternal::xjlagoon1500_alert(uint16 argc, uint16 *argv) {
// Have the sunners move a bit as you get closer ;)
- uint32 *sunners = _vm->matchVarToString("jsunners");
+ uint32 *sunners = _vm->getVar("jsunners");
if (*sunners == 0) {
_vm->_video->playMovieBlocking(3);
} else if (*sunners == 1) {
@@ -1234,14 +1476,14 @@ void RivenExternal::xorollcredittime(uint16 argc, uint16 *argv) {
// WORKAROUND: The special change stuff only handles one destination and it would
// be messy to modify the way that currently works. If we use the trap book on Tay,
// we should be using the Tay end game sequences.
- if (*_vm->matchVarToString("returnstackid") == rspit) {
+ if (*_vm->getVar("returnstackid") == rspit) {
_vm->changeToStack(rspit);
_vm->changeToCard(2);
return;
}
// You used the trap book... why? What were you thinking?
- uint32 *gehnState = _vm->matchVarToString("agehn");
+ uint32 *gehnState = _vm->getVar("agehn");
if (*gehnState == 0) // Gehn who?
runEndGame(1);
@@ -1252,16 +1494,127 @@ void RivenExternal::xorollcredittime(uint16 argc, uint16 *argv) {
}
void RivenExternal::xbookclick(uint16 argc, uint16 *argv) {
- // TODO: This fun external command is probably one of the most complex,
- // up there with the marble puzzle ones. It involves so much... Basically,
- // it's playing when Gehn holds the trap book up to you and you have to
- // click on the book (hence the name of the function). Yeah, not fun.
- // Lots of timing stuff needs to be done for a couple videos.
+ // Hide the cursor
+ _vm->_gfx->changeCursor(kRivenHideCursor);
+
+ // Let's hook onto our video
+ VideoHandle video = _vm->_video->findVideoHandle(argv[0]);
+
+ // Convert from the standard QuickTime base time to milliseconds
+ // The values are in terms of 1/600 of a second.
+ // Have I said how much I just *love* QuickTime? </sarcasm>
+ uint32 startTime = argv[1] * 1000 / 600;
+ uint32 endTime = argv[2] * 1000 / 600;
+
+ // Track down our hotspot
+ // Of course, they're not in any sane order...
+ static const uint16 hotspotMap[] = { 1, 3, 2, 0 };
+ Common::Rect hotspotRect = _vm->_hotspots[hotspotMap[argv[3] - 1]].rect;
+
+ debug(0, "xbookclick:");
+ debug(0, "\tVideo Code = %d", argv[0]);
+ debug(0, "\tStart Time = %dms", startTime);
+ debug(0, "\tEnd Time = %dms", endTime);
+ debug(0, "\tHotspot = %d -> %d", argv[3], hotspotMap[argv[3] - 1]);
+
+ // Just let the video play while we wait until Gehn opens the trap book for us
+ while (_vm->_video->getElapsedTime(video) < startTime && !_vm->shouldQuit()) {
+ if (_vm->_video->updateBackgroundMovies())
+ _vm->_system->updateScreen();
+
+ Common::Event event;
+ while (_vm->_system->getEventManager()->pollEvent(event))
+ ;
+
+ _vm->_system->delayMillis(10);
+ }
+
+ // Break out if we're quitting
+ if (_vm->shouldQuit())
+ return;
+
+ // Update our hotspot stuff
+ if (hotspotRect.contains(_vm->_system->getEventManager()->getMousePos()))
+ _vm->_gfx->changeCursor(kRivenOpenHandCursor);
+ else
+ _vm->_gfx->changeCursor(kRivenMainCursor);
+
+ // OK, Gehn has opened the trap book and has asked us to go in. Let's watch
+ // and see what the player will do...
+ while (_vm->_video->getElapsedTime(video) < endTime && !_vm->shouldQuit()) {
+ bool updateScreen = _vm->_video->updateBackgroundMovies();
+
+ Common::Event event;
+ while (_vm->_system->getEventManager()->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_MOUSEMOVE:
+ if (hotspotRect.contains(_vm->_system->getEventManager()->getMousePos()))
+ _vm->_gfx->changeCursor(kRivenOpenHandCursor);
+ else
+ _vm->_gfx->changeCursor(kRivenMainCursor);
+ updateScreen = false; // Don't update twice, changing the cursor already updates the screen
+ break;
+ case Common::EVENT_LBUTTONUP:
+ if (hotspotRect.contains(_vm->_system->getEventManager()->getMousePos())) {
+ // OK, we've used the trap book! We go for ride lady!
+ _vm->_scriptMan->stopAllScripts(); // Stop all running scripts (so we don't remain in the cage)
+ _vm->_video->stopVideos(); // Stop all videos
+ _vm->_gfx->changeCursor(kRivenHideCursor); // Hide the cursor
+ _vm->_gfx->drawPLST(3); // Black out the screen
+ _vm->_gfx->updateScreen(); // Update the screen
+ _vm->_sound->playSound(0, false); // Play the link sound
+ _vm->_video->activateMLST(7, _vm->getCurCard()); // Activate Gehn Link Video
+ _vm->_video->playMovieBlocking(1); // Play Gehn Link Video
+ *_vm->getVar("agehn") = 4; // Set Gehn to the trapped state
+ *_vm->getVar("atrapbook") = 1; // We've got the trap book again
+ _vm->_sound->playSound(0, false); // Play the link sound again
+ _vm->changeToCard(_vm->matchRMAPToCard(0x2885)); // Link out! (TODO: Shouldn't this card change?)
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (updateScreen && !_vm->shouldQuit())
+ _vm->_system->updateScreen();
+
+ _vm->_system->delayMillis(10);
+ }
+
+ // Break out if we're quitting
+ if (_vm->shouldQuit())
+ return;
+
+ // Hide the cursor again
+ _vm->_gfx->changeCursor(kRivenHideCursor);
+
+ // If there was no click and this is the third time Gehn asks us to
+ // use the trap book, he will shoot the player. Dead on arrival.
+ // Run the credits from here.
+ if (*_vm->getVar("agehn") == 3) {
+ _vm->_scriptMan->stopAllScripts();
+ runCredits(argv[0]);
+ return;
+ }
+
+ // There was no click, so just play the rest of the video.
+ while (!_vm->_video->endOfVideo(video) && !_vm->shouldQuit()) {
+ if (_vm->_video->updateBackgroundMovies())
+ _vm->_system->updateScreen();
+
+ Common::Event event;
+ while (_vm->_system->getEventManager()->pollEvent(event))
+ ;
+
+ _vm->_system->delayMillis(10);
+ }
}
void RivenExternal::xooffice30_closebook(uint16 argc, uint16 *argv) {
// Close the blank linking book if it's open
- uint32 *book = _vm->matchVarToString("odeskbook");
+ uint32 *book = _vm->getVar("odeskbook");
if (*book != 1)
return;
@@ -1284,16 +1637,16 @@ void RivenExternal::xooffice30_closebook(uint16 argc, uint16 *argv) {
void RivenExternal::xobedroom5_closedrawer(uint16 argc, uint16 *argv) {
// Close the drawer if open when clicking on the journal.
_vm->_video->playMovieBlocking(2);
- *_vm->matchVarToString("ostanddrawer") = 0;
+ *_vm->getVar("ostanddrawer") = 0;
}
void RivenExternal::xogehnopenbook(uint16 argc, uint16 *argv) {
- _vm->_gfx->drawPLST(*_vm->matchVarToString("ogehnpage"));
+ _vm->_gfx->drawPLST(*_vm->getVar("ogehnpage"));
}
void RivenExternal::xogehnbookprevpage(uint16 argc, uint16 *argv) {
// Get the page variable
- uint32 *page = _vm->matchVarToString("ogehnpage");
+ uint32 *page = _vm->getVar("ogehnpage");
// Decrement the page if it's not the first page
if (*page == 1)
@@ -1310,7 +1663,7 @@ void RivenExternal::xogehnbookprevpage(uint16 argc, uint16 *argv) {
void RivenExternal::xogehnbooknextpage(uint16 argc, uint16 *argv) {
// Get the page variable
- uint32 *page = _vm->matchVarToString("ogehnpage");
+ uint32 *page = _vm->getVar("ogehnpage");
// Increment the page if it's not the last page
if (*page == 13)
@@ -1334,7 +1687,7 @@ void RivenExternal::xgwatch(uint16 argc, uint16 *argv) {
// Hide the cursor
_vm->_gfx->changeCursor(kRivenHideCursor);
- uint32 *prisonCombo = _vm->matchVarToString("pcorrectorder");
+ uint32 *prisonCombo = _vm->getVar("pcorrectorder");
uint32 soundTime = _vm->_system->getMillis() - 500; // Start the first sound instantly
byte curSound = 0;
@@ -1344,7 +1697,7 @@ void RivenExternal::xgwatch(uint16 argc, uint16 *argv) {
if (curSound == 5) // Break out after the last sound is done
break;
- _vm->_sound->playSound(getComboDigit(*prisonCombo, curSound) + 13);
+ _vm->_sound->playSound(getComboDigit(*prisonCombo, curSound) + 13, !(_vm->getFeatures() & GF_DVD));
curSound++;
soundTime = _vm->_system->getMillis();
}
@@ -1376,14 +1729,14 @@ void RivenExternal::xpisland990_elevcombo(uint16 argc, uint16 *argv) {
// It is impossible to get here if Gehn is not trapped. However,
// the original also disallows brute forcing the ending if you have
// not yet trapped Gehn.
- if (*_vm->matchVarToString("agehn") != 4)
+ if (*_vm->getVar("agehn") != 4)
return;
- uint32 *correctDigits = _vm->matchVarToString("pelevcombo");
+ uint32 *correctDigits = _vm->getVar("pelevcombo");
// pelevcombo keeps count of how many buttons we have pressed in the correct order.
// When pelevcombo is 5, clicking the handle will show the video freeing Catherine.
- if (*correctDigits < 5 && argv[0] == getComboDigit(*_vm->matchVarToString("pcorrectorder"), *correctDigits))
+ if (*correctDigits < 5 && argv[0] == getComboDigit(*_vm->getVar("pcorrectorder"), *correctDigits))
*correctDigits += 1;
else
*correctDigits = 0;
@@ -1398,19 +1751,19 @@ void RivenExternal::xpisland290_domecheck(uint16 argc, uint16 *argv) {
}
void RivenExternal::xpisland25_opencard(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ checkDomeSliders(31, 5);
}
void RivenExternal::xpisland25_resetsliders(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ resetDomeSliders(58, 10, 6);
}
void RivenExternal::xpisland25_slidermd(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ dragDomeSlider(58, 10, 31, 5, 6);
}
void RivenExternal::xpisland25_slidermw(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ checkSliderCursorChange(6);
}
// ------------------------------------------------------------------------------------
@@ -1430,8 +1783,8 @@ void RivenExternal::xrcredittime(uint16 argc, uint16 *argv) {
void RivenExternal::xrshowinventory(uint16 argc, uint16 *argv) {
// Give the trap book and Catherine's journal to the player
- *_vm->matchVarToString("atrapbook") = 1;
- *_vm->matchVarToString("acathbook") = 1;
+ *_vm->getVar("atrapbook") = 1;
+ *_vm->getVar("acathbook") = 1;
_vm->_gfx->showInventory();
}
@@ -1452,29 +1805,29 @@ void RivenExternal::xtexterior300_telescopedown(uint16 argc, uint16 *argv) {
_vm->_video->playMovieBlocking(3);
// Don't do anything else if the telescope power is off
- if (*_vm->matchVarToString("ttelevalve") == 0)
+ if (*_vm->getVar("ttelevalve") == 0)
return;
- uint32 *telescopePos = _vm->matchVarToString("ttelescope");
- uint32 *telescopeCover = _vm->matchVarToString("ttelecover");
+ uint32 *telescopePos = _vm->getVar("ttelescope");
+ uint32 *telescopeCover = _vm->getVar("ttelecover");
if (*telescopePos == 1) {
// We're at the bottom, which means one of two things can happen...
- if (*telescopeCover == 1 && *_vm->matchVarToString("ttelepin") == 1) {
+ if (*telescopeCover == 1 && *_vm->getVar("ttelepin") == 1) {
// ...if the cover is open and the pin is up, the game is now over.
- if (*_vm->matchVarToString("pcage") == 2) {
+ if (*_vm->getVar("pcage") == 2) {
// The best ending: Catherine is free, Gehn is trapped, Atrus comes to rescue you.
// And now we fall back to Earth... all the way...
warning("xtexterior300_telescopedown: Good ending");
_vm->_video->activateMLST(8, _vm->getCurCard());
runEndGame(8);
- } else if (*_vm->matchVarToString("agehn") == 4) {
+ } else if (*_vm->getVar("agehn") == 4) {
// The ok ending: Catherine is still trapped, Gehn is trapped, Atrus comes to rescue you.
// Nice going! Catherine and the islanders are all dead now! Just go back to your home...
warning("xtexterior300_telescopedown: OK ending");
_vm->_video->activateMLST(9, _vm->getCurCard());
runEndGame(9);
- } else if (*_vm->matchVarToString("atrapbook") == 1) {
+ } else if (*_vm->getVar("atrapbook") == 1) {
// The bad ending: Catherine is trapped, Gehn is free, Atrus gets shot by Gehn,
// And then you get shot by Cho. Nice going! Catherine and the islanders are dead
// and you have just set Gehn free from Riven, not to mention you're dead.
@@ -1510,10 +1863,10 @@ void RivenExternal::xtexterior300_telescopeup(uint16 argc, uint16 *argv) {
_vm->_video->playMovieBlocking(3);
// Don't do anything else if the telescope power is off
- if (*_vm->matchVarToString("ttelevalve") == 0)
+ if (*_vm->getVar("ttelevalve") == 0)
return;
- uint32 *telescopePos = _vm->matchVarToString("ttelescope");
+ uint32 *telescopePos = _vm->getVar("ttelescope");
// Check if we can't move up anymore
if (*telescopePos == 5) {
@@ -1530,9 +1883,9 @@ void RivenExternal::xtexterior300_telescopeup(uint16 argc, uint16 *argv) {
void RivenExternal::xtisland390_covercombo(uint16 argc, uint16 *argv) {
// Called when clicking the telescope cover buttons. argv[0] is the button number (1...5).
- uint32 *correctDigits = _vm->matchVarToString("tcovercombo");
+ uint32 *correctDigits = _vm->getVar("tcovercombo");
- if (*correctDigits < 5 && argv[0] == getComboDigit(*_vm->matchVarToString("tcorrectorder"), *correctDigits))
+ if (*correctDigits < 5 && argv[0] == getComboDigit(*_vm->getVar("tcorrectorder"), *correctDigits))
*correctDigits += 1;
else
*correctDigits = 0;
@@ -1548,8 +1901,8 @@ void RivenExternal::xtisland390_covercombo(uint16 argc, uint16 *argv) {
// Atrus' Journal and Trap Book are added to inventory
void RivenExternal::xtatrusgivesbooks(uint16 argc, uint16 *argv) {
// Give the player Atrus' Journal and the Trap book
- *_vm->matchVarToString("aatrusbook") = 1;
- *_vm->matchVarToString("atrapbook") = 1;
+ *_vm->getVar("aatrusbook") = 1;
+ *_vm->getVar("atrapbook") = 1;
}
// Trap Book is removed from inventory
@@ -1557,7 +1910,7 @@ void RivenExternal::xtchotakesbook(uint16 argc, uint16 *argv) {
// And now Cho takes the trap book. Sure, this isn't strictly
// necessary to add and them remove the trap book... but it
// seems better to do this ;)
- *_vm->matchVarToString("atrapbook") = 0;
+ *_vm->getVar("atrapbook") = 0;
}
void RivenExternal::xthideinventory(uint16 argc, uint16 *argv) {
@@ -1569,7 +1922,7 @@ void RivenExternal::xt7500_checkmarbles(uint16 argc, uint16 *argv) {
// marble position and set apower based on that. The game handles the video playing
// so we don't have to. For the purposes of making the game progress further, we'll
// just turn the power on for now.
- *_vm->matchVarToString("apower") = 1;
+ *_vm->getVar("apower") = 1;
}
void RivenExternal::xt7600_setupmarbles(uint16 argc, uint16 *argv) {
@@ -1597,19 +1950,19 @@ void RivenExternal::xtisland4990_domecheck(uint16 argc, uint16 *argv) {
}
void RivenExternal::xtisland5056_opencard(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ checkDomeSliders(29, 30);
}
void RivenExternal::xtisland5056_resetsliders(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ resetDomeSliders(_vm->getFeatures() & GF_DVD ? 813 : 798, 37, 3);
}
void RivenExternal::xtisland5056_slidermd(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ dragDomeSlider(_vm->getFeatures() & GF_DVD ? 813 : 798, 37, 29, 30, 3);
}
void RivenExternal::xtisland5056_slidermw(uint16 argc, uint16 *argv) {
- // TODO: Dome related
+ checkSliderCursorChange(3);
}
void RivenExternal::xtatboundary(uint16 argc, uint16 *argv) {
diff --git a/engines/mohawk/riven_external.h b/engines/mohawk/riven_external.h
index bdf3fa01bc..da22e3bd81 100644
--- a/engines/mohawk/riven_external.h
+++ b/engines/mohawk/riven_external.h
@@ -39,9 +39,12 @@ public:
void runCommand(uint16 argc, uint16 *argv);
uint16 getComboDigit(uint32 correctCombo, uint32 digit);
+ uint32 getDomeSliderState() { return _sliderState; }
+ void setDomeSliderState(uint32 state) { _sliderState = state; }
private:
MohawkEngine_Riven *_vm;
+ uint32 _sliderState;
typedef void (RivenExternal::*ExternalCmd)(uint16 argc, uint16 *argv);
@@ -58,8 +61,14 @@ private:
int jspitElevatorLoop();
void runDemoBoundaryDialog();
void runEndGame(uint16 video);
+ void runCredits(uint16 video);
void runDomeCheck();
void runDomeButtonMovie();
+ void resetDomeSliders(uint16 bitmapId, uint16 soundId, uint16 startHotspot);
+ void checkDomeSliders(uint16 resetSlidersHotspot, uint16 openDomeHotspot);
+ void checkSliderCursorChange(uint16 startHotspot);
+ void dragDomeSlider(uint16 bitmapId, uint16 soundId, uint16 resetSlidersHotspot, uint16 openDomeHotspot, uint16 startHotspot);
+ void drawDomeSliders(uint16 bitmapId, uint16 startHotspot);
// -----------------------------------------------------
// aspit (Main Menu, Books, Setup) external commands
@@ -86,6 +95,8 @@ private:
void xadisablemenureturn(uint16 argc, uint16 *argv);
void xaenablemenureturn(uint16 argc, uint16 *argv);
void xalaunchbrowser(uint16 argc, uint16 *argv);
+ void xadisablemenuintro(uint16 argc, uint16 *argv);
+ void xaenablemenuintro(uint16 argc, uint16 *argv);
// -----------------------------------------------------
// bspit (Boiler Island) external commands
diff --git a/engines/mohawk/riven_saveload.cpp b/engines/mohawk/riven_saveload.cpp
index d73b4ec0dc..c055eb51a8 100644
--- a/engines/mohawk/riven_saveload.cpp
+++ b/engines/mohawk/riven_saveload.cpp
@@ -161,7 +161,7 @@ bool RivenSaveLoad::loadGame(Common::String filename) {
if (name == "dropLeftStart" || name == "dropRightStart")
continue;
- uint32 *var = _vm->matchVarToString(name);
+ uint32 *var = _vm->getVar(name);
*var = rawVariables[i];
@@ -272,8 +272,8 @@ bool RivenSaveLoad::saveGame(Common::String filename) {
filename += ".rvn";
// Convert class variables to variable numbers
- *_vm->matchVarToString("currentstackid") = mapNewStackIDToOld(_vm->getCurStack());
- *_vm->matchVarToString("currentcardid") = _vm->getCurCard();
+ *_vm->getVar("currentstackid") = mapNewStackIDToOld(_vm->getCurStack());
+ *_vm->getVar("currentcardid") = _vm->getCurCard();
Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(filename);
if (!saveFile)
diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp
index 1fcaba8ac0..2b91dce35a 100644
--- a/engines/mohawk/riven_scripts.cpp
+++ b/engines/mohawk/riven_scripts.cpp
@@ -38,7 +38,7 @@ namespace Mohawk {
RivenScript::RivenScript(MohawkEngine_Riven *vm, Common::SeekableReadStream *stream, uint16 scriptType, uint16 parentStack, uint16 parentCard)
: _vm(vm), _stream(stream), _scriptType(scriptType), _parentStack(parentStack), _parentCard(parentCard) {
setupOpcodes();
- _isRunning = false;
+ _isRunning = _continueRunning = false;
}
RivenScript::~RivenScript() {
@@ -227,7 +227,7 @@ void RivenScript::dumpCommands(Common::StringArray varNames, Common::StringArray
}
void RivenScript::runScript() {
- _isRunning = true;
+ _isRunning = _continueRunning = true;
if (_stream->pos() != 0)
_stream->seek(0);
@@ -242,7 +242,7 @@ void RivenScript::processCommands(bool runCommands) {
uint16 commandCount = _stream->readUint16BE();
- for (uint16 j = 0; j < commandCount && !_vm->shouldQuit() && _stream->pos() < _stream->size(); j++) {
+ for (uint16 j = 0; j < commandCount && !_vm->shouldQuit() && _stream->pos() < _stream->size() && _continueRunning; j++) {
uint16 command = _stream->readUint16BE();
if (command == 8) {
@@ -398,7 +398,7 @@ void RivenScript::changeCursor(uint16 op, uint16 argc, uint16 *argv) {
void RivenScript::delay(uint16 op, uint16 argc, uint16 *argv) {
debug(2, "Delay %dms", argv[0]);
if (argv[0] > 0)
- _vm->_system->delayMillis(argv[0]);
+ _vm->delayAndUpdate(argv[0]);
}
// Command 17: call external command
@@ -632,6 +632,11 @@ RivenScriptList RivenScriptManager::readScripts(Common::SeekableReadStream *stre
return scriptList;
}
+void RivenScriptManager::stopAllScripts() {
+ for (uint32 i = 0; i < _currentScripts.size(); i++)
+ _currentScripts[i]->stopRunning();
+}
+
void RivenScriptManager::unloadUnusedScripts() {
// Free any scripts that aren't part of the current card and aren't running
for (uint32 i = 0; i < _currentScripts.size(); i++) {
diff --git a/engines/mohawk/riven_scripts.h b/engines/mohawk/riven_scripts.h
index 5187bbde08..a85cde1702 100644
--- a/engines/mohawk/riven_scripts.h
+++ b/engines/mohawk/riven_scripts.h
@@ -62,6 +62,7 @@ public:
uint16 getParentStack() { return _parentStack; }
uint16 getParentCard() { return _parentCard; }
bool isRunning() { return _isRunning; }
+ void stopRunning() { _continueRunning = false; }
static uint32 calculateScriptSize(Common::SeekableReadStream *script);
@@ -76,8 +77,8 @@ private:
MohawkEngine_Riven *_vm;
Common::SeekableReadStream *_stream;
- uint16 _scriptType, _parentStack, _parentCard, _parentHotspot;
- bool _isRunning;
+ uint16 _scriptType, _parentStack, _parentCard;
+ bool _isRunning, _continueRunning;
void dumpCommands(Common::StringArray varNames, Common::StringArray xNames, byte tabs);
void processCommands(bool runCommands);
@@ -131,6 +132,7 @@ public:
~RivenScriptManager();
RivenScriptList readScripts(Common::SeekableReadStream *stream, bool garbageCollect = true);
+ void stopAllScripts();
private:
void unloadUnusedScripts();
diff --git a/engines/mohawk/riven_vars.cpp b/engines/mohawk/riven_vars.cpp
index b6d2dff315..ae06afef01 100644
--- a/engines/mohawk/riven_vars.cpp
+++ b/engines/mohawk/riven_vars.cpp
@@ -271,7 +271,7 @@ static const char *variableNames[] = {
};
uint32 *MohawkEngine_Riven::getLocalVar(uint32 index) {
- return matchVarToString(getName(VariableNames, index));
+ return getVar(getName(VariableNames, index));
}
uint32 MohawkEngine_Riven::getGlobalVar(uint32 index) {
@@ -279,18 +279,15 @@ uint32 MohawkEngine_Riven::getGlobalVar(uint32 index) {
}
Common::String MohawkEngine_Riven::getGlobalVarName(uint32 index) {
- return Common::String(variableNames[index]);
+ return variableNames[index];
}
-uint32 *MohawkEngine_Riven::matchVarToString(Common::String varName) {
- return matchVarToString(varName.c_str());
-}
-
-uint32 *MohawkEngine_Riven::matchVarToString(const char *varName) {
+uint32 *MohawkEngine_Riven::getVar(const Common::String &varName) {
for (uint32 i = 0; i < _varCount; i++)
- if (!scumm_stricmp(varName, variableNames[i]))
+ if (varName.equalsIgnoreCase(variableNames[i]))
return &_vars[i];
- error ("Unknown variable: \'%s\'", varName);
+
+ error ("Unknown variable: '%s'", varName.c_str());
return NULL;
}
@@ -304,33 +301,33 @@ void MohawkEngine_Riven::initVars() {
_vars[i] = 0;
// Init Variables to their correct starting state.
- *matchVarToString("ttelescope") = 5;
- *matchVarToString("tgatestate") = 1;
- *matchVarToString("jbridge1") = 1;
- *matchVarToString("jbridge4") = 1;
- *matchVarToString("jgallows") = 1;
- *matchVarToString("jiconcorrectorder") = 12068577;
- *matchVarToString("bblrvalve") = 1;
- *matchVarToString("bblrwtr") = 1;
- *matchVarToString("bfans") = 1;
- *matchVarToString("bytrap") = 2;
- *matchVarToString("aatruspage") = 1;
- *matchVarToString("acathpage") = 1;
- *matchVarToString("bheat") = 1;
- *matchVarToString("waterenabled") = 1;
- *matchVarToString("ogehnpage") = 1;
- *matchVarToString("bblrsw") = 1;
- *matchVarToString("ocage") = 1;
+ *getVar("ttelescope") = 5;
+ *getVar("tgatestate") = 1;
+ *getVar("jbridge1") = 1;
+ *getVar("jbridge4") = 1;
+ *getVar("jgallows") = 1;
+ *getVar("jiconcorrectorder") = 12068577;
+ *getVar("bblrvalve") = 1;
+ *getVar("bblrwtr") = 1;
+ *getVar("bfans") = 1;
+ *getVar("bytrap") = 2;
+ *getVar("aatruspage") = 1;
+ *getVar("acathpage") = 1;
+ *getVar("bheat") = 1;
+ *getVar("waterenabled") = 1;
+ *getVar("ogehnpage") = 1;
+ *getVar("bblrsw") = 1;
+ *getVar("ocage") = 1;
// Randomize the telescope combination
- uint32 *teleCombo = matchVarToString("tcorrectorder");
+ uint32 *teleCombo = getVar("tcorrectorder");
for (byte i = 0; i < 5; i++) {
*teleCombo *= 10;
*teleCombo += _rnd->getRandomNumberRng(1, 5); // 5 buttons
}
// Randomize the prison combination
- uint32 *prisonCombo = matchVarToString("pcorrectorder");
+ uint32 *prisonCombo = getVar("pcorrectorder");
for (byte i = 0; i < 5; i++) {
*prisonCombo *= 10;
*prisonCombo += _rnd->getRandomNumberRng(1, 3); // 3 buttons/sounds
@@ -338,7 +335,7 @@ void MohawkEngine_Riven::initVars() {
// Randomize the dome combination -- each bit represents a slider position,
// the highest bit (1 << 24) represents 1, (1 << 23) represents 2, etc.
- uint32 *domeCombo = matchVarToString("adomecombo");
+ uint32 *domeCombo = getVar("adomecombo");
for (byte bitsSet = 0; bitsSet < 5;) {
uint32 randomBit = 1 << (24 - _rnd->getRandomNumber(24));
diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp
index 17456b8ec3..b7ee4c8a2c 100644
--- a/engines/mohawk/video.cpp
+++ b/engines/mohawk/video.cpp
@@ -123,7 +123,7 @@ void VideoManager::waitUntilMovieEnds(VideoHandle videoHandle) {
delete _videoStreams[videoHandle].video;
_videoStreams[videoHandle].video = 0;
- _videoStreams[videoHandle].id = 0;
+ _videoStreams[videoHandle].id = 0xffff;
_videoStreams[videoHandle].filename.clear();
}
@@ -156,7 +156,7 @@ bool VideoManager::updateBackgroundMovies() {
} else {
delete _videoStreams[i].video;
_videoStreams[i].video = 0;
- _videoStreams[i].id = 0;
+ _videoStreams[i].id = 0xffff;
_videoStreams[i].filename.clear();
continue;
}
@@ -292,7 +292,7 @@ void VideoManager::stopMovie(uint16 id) {
if (_mlstRecords[i].movieID == _videoStreams[j].id) {
delete _videoStreams[j].video;
_videoStreams[j].video = 0;
- _videoStreams[j].id = 0;
+ _videoStreams[j].id = 0xffff;
_videoStreams[j].filename.clear();
return;
}
@@ -368,7 +368,7 @@ VideoHandle VideoManager::createVideoHandle(Common::String filename, uint16 x, u
entry.x = x;
entry.y = y;
entry.filename = filename;
- entry.id = 0;
+ entry.id = 0xffff;
entry.loop = loop;
entry.enabled = true;
@@ -412,4 +412,14 @@ uint32 VideoManager::getFrameCount(const VideoHandle &handle) {
return _videoStreams[handle]->getFrameCount();
}
+uint32 VideoManager::getElapsedTime(const VideoHandle &handle) {
+ assert(handle != NULL_VID_HANDLE);
+ return _videoStreams[handle]->getElapsedTime();
+}
+
+bool VideoManager::endOfVideo(const VideoHandle &handle) {
+ assert(handle != NULL_VID_HANDLE);
+ return _videoStreams[handle]->endOfVideo();
+}
+
} // End of namespace Mohawk
diff --git a/engines/mohawk/video.h b/engines/mohawk/video.h
index 6aa553e26b..4c6ed05cef 100644
--- a/engines/mohawk/video.h
+++ b/engines/mohawk/video.h
@@ -94,6 +94,8 @@ public:
VideoHandle findVideoHandle(uint16 id);
int32 getCurFrame(const VideoHandle &handle);
uint32 getFrameCount(const VideoHandle &handle);
+ uint32 getElapsedTime(const VideoHandle &handle);
+ bool endOfVideo(const VideoHandle &handle);
private:
MohawkEngine *_vm;
diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp
index d7ee037c50..2887d79693 100644
--- a/engines/saga/scene.cpp
+++ b/engines/saga/scene.cpp
@@ -987,8 +987,8 @@ void Scene::processSceneResources() {
size_t resourceDataLength;
const byte *palPointer;
size_t i;
- SAGAResourceTypes *types;
- int typesCount;
+ SAGAResourceTypes *types = 0;
+ int typesCount = 0;
SAGAResourceTypes resType;
getResourceTypes(types, typesCount);
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index fac819167b..6246754ec4 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -178,6 +178,10 @@ Console::Console(SciEngine *engine) : GUI::Debugger(),
DCmd_Register("bc", WRAP_METHOD(Console, cmdBreakpointDelete)); // alias
DCmd_Register("bp_method", WRAP_METHOD(Console, cmdBreakpointMethod));
DCmd_Register("bpx", WRAP_METHOD(Console, cmdBreakpointMethod)); // alias
+ DCmd_Register("bp_read", WRAP_METHOD(Console, cmdBreakpointRead));
+ DCmd_Register("bpr", WRAP_METHOD(Console, cmdBreakpointRead)); // alias
+ DCmd_Register("bp_write", WRAP_METHOD(Console, cmdBreakpointWrite));
+ DCmd_Register("bpw", WRAP_METHOD(Console, cmdBreakpointWrite)); // alias
DCmd_Register("bp_kernel", WRAP_METHOD(Console, cmdBreakpointKernel));
DCmd_Register("bpk", WRAP_METHOD(Console, cmdBreakpointKernel)); // alias
DCmd_Register("bp_function", WRAP_METHOD(Console, cmdBreakpointFunction));
@@ -389,7 +393,9 @@ bool Console::cmdHelp(int argc, const char **argv) {
DebugPrintf("Breakpoints:\n");
DebugPrintf(" bp_list / bplist / bl - Lists the current breakpoints\n");
DebugPrintf(" bp_del / bpdel / bc - Deletes a breakpoint with the specified index\n");
- DebugPrintf(" bp_method / bpx - Sets a breakpoint on the execution or access of a specified method/selector\n");
+ DebugPrintf(" bp_method / bpx - Sets a breakpoint on the execution of a specified method/selector\n");
+ DebugPrintf(" bp_read / bpr - Sets a breakpoint on reading of a specified selector\n");
+ DebugPrintf(" bp_write / bpw - Sets a breakpoint on writing to a specified selector\n");
DebugPrintf(" bp_kernel / bpk - Sets a breakpoint on execution of a kernel function\n");
DebugPrintf(" bp_function / bpe - Sets a breakpoint on the execution of the specified exported function\n");
DebugPrintf("\n");
@@ -446,6 +452,7 @@ bool Console::cmdGetVersion(int argc, const char **argv) {
DebugPrintf("Resource volume version: %s\n", g_sci->getResMan()->getVolVersionDesc());
DebugPrintf("Resource map version: %s\n", g_sci->getResMan()->getMapVersionDesc());
DebugPrintf("Contains selector vocabulary (vocab.997): %s\n", hasVocab997 ? "yes" : "no");
+ DebugPrintf("Has CantBeHere selector: %s\n", g_sci->getKernel()->_selectorCache.cantBeHere != -1 ? "yes" : "no");
DebugPrintf("Game version (VERSION file): %s\n", gameVersion.c_str());
DebugPrintf("\n");
@@ -2740,9 +2747,15 @@ bool Console::cmdBreakpointList(int argc, const char **argv) {
for (; bp != end; ++bp) {
DebugPrintf(" #%i: ", i);
switch (bp->type) {
- case BREAK_SELECTOR:
+ case BREAK_SELECTOREXEC:
DebugPrintf("Execute %s\n", bp->name.c_str());
break;
+ case BREAK_SELECTORREAD:
+ DebugPrintf("Read %s\n", bp->name.c_str());
+ break;
+ case BREAK_SELECTORWRITE:
+ DebugPrintf("Write %s\n", bp->name.c_str());
+ break;
case BREAK_EXPORT:
bpdata = bp->address;
DebugPrintf("Execute script %d, export %d\n", bpdata >> 16, bpdata & 0xFFFF);
@@ -2802,7 +2815,7 @@ bool Console::cmdBreakpointDelete(int argc, const char **argv) {
bool Console::cmdBreakpointMethod(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Sets a breakpoint on execution/access of a specified method/selector.\n");
+ DebugPrintf("Sets a breakpoint on execution of a specified method/selector.\n");
DebugPrintf("Usage: %s <name>\n", argv[0]);
DebugPrintf("Example: %s ego::doit\n", argv[0]);
DebugPrintf("May also be used to set a breakpoint that applies whenever an object\n");
@@ -2814,12 +2827,45 @@ bool Console::cmdBreakpointMethod(int argc, const char **argv) {
Thus, we can't check whether the command argument is a valid method name.
A breakpoint set on an invalid method name will just never trigger. */
Breakpoint bp;
- bp.type = BREAK_SELECTOR;
+ bp.type = BREAK_SELECTOREXEC;
bp.name = argv[1];
_debugState._breakpoints.push_back(bp);
- _debugState._activeBreakpointTypes |= BREAK_SELECTOR;
+ _debugState._activeBreakpointTypes |= BREAK_SELECTOREXEC;
+ return true;
+}
+bool Console::cmdBreakpointRead(int argc, const char **argv) {
+ if (argc != 2) {
+ DebugPrintf("Sets a breakpoint on reading of a specified selector.\n");
+ DebugPrintf("Usage: %s <name>\n", argv[0]);
+ DebugPrintf("Example: %s ego::view\n", argv[0]);
+ return true;
+ }
+
+ Breakpoint bp;
+ bp.type = BREAK_SELECTORREAD;
+ bp.name = argv[1];
+
+ _debugState._breakpoints.push_back(bp);
+ _debugState._activeBreakpointTypes |= BREAK_SELECTORREAD;
+ return true;
+}
+
+bool Console::cmdBreakpointWrite(int argc, const char **argv) {
+ if (argc != 2) {
+ DebugPrintf("Sets a breakpoint on writing of a specified selector.\n");
+ DebugPrintf("Usage: %s <name>\n", argv[0]);
+ DebugPrintf("Example: %s ego::view\n", argv[0]);
+ return true;
+ }
+
+ Breakpoint bp;
+ bp.type = BREAK_SELECTORWRITE;
+ bp.name = argv[1];
+
+ _debugState._breakpoints.push_back(bp);
+ _debugState._activeBreakpointTypes |= BREAK_SELECTORWRITE;
return true;
}
diff --git a/engines/sci/console.h b/engines/sci/console.h
index 60599ea783..444443154c 100644
--- a/engines/sci/console.h
+++ b/engines/sci/console.h
@@ -135,6 +135,8 @@ private:
bool cmdBreakpointList(int argc, const char **argv);
bool cmdBreakpointDelete(int argc, const char **argv);
bool cmdBreakpointMethod(int argc, const char **argv);
+ bool cmdBreakpointRead(int argc, const char **argv);
+ bool cmdBreakpointWrite(int argc, const char **argv);
bool cmdBreakpointKernel(int argc, const char **argv);
bool cmdBreakpointFunction(int argc, const char **argv);
// VM
diff --git a/engines/sci/debug.h b/engines/sci/debug.h
index 5cf0e38fbc..d9959f0b7f 100644
--- a/engines/sci/debug.h
+++ b/engines/sci/debug.h
@@ -37,13 +37,15 @@ enum BreakpointType {
* Break when selector is executed. data contains (char *) selector name
* (in the format Object::Method)
*/
- BREAK_SELECTOR = 1,
+ BREAK_SELECTOREXEC = 1 << 0, // break when selector gets executed
+ BREAK_SELECTORREAD = 1 << 1, // break when selector gets executed
+ BREAK_SELECTORWRITE = 1 << 2, // break when selector gets executed
/**
* Break when an exported function is called. data contains
* script_no << 16 | export_no.
*/
- BREAK_EXPORT = 2
+ BREAK_EXPORT = 1 << 3
};
struct Breakpoint {
diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp
index e330bd5f30..fbef406ee7 100644
--- a/engines/sci/detection.cpp
+++ b/engines/sci/detection.cpp
@@ -55,6 +55,7 @@ static const PlainGameDescriptor s_sciGameTitles[] = {
{"laurabow", "Laura Bow: The Colonel's Bequest"},
{"lsl2", "Leisure Suit Larry 2: Goes Looking for Love (in Several Wrong Places)"},
{"lsl3", "Leisure Suit Larry 3: Passionate Patti in Pursuit of the Pulsating Pectorals"},
+ {"mothergoose", "Mixed-Up Mother Goose"},
{"pq2", "Police Quest II: The Vengeance"},
{"qfg1", "Quest for Glory I: So You Want to Be a Hero"},
{"sq3", "Space Quest III: The Pirates of Pestulon"},
@@ -77,6 +78,7 @@ static const PlainGameDescriptor s_sciGameTitles[] = {
{"longbow", "Conquests of the Longbow: The Adventures of Robin Hood"},
{"lsl1sci", "Leisure Suit Larry in the Land of the Lounge Lizards"},
{"lsl5", "Leisure Suit Larry 5: Passionate Patti Does a Little Undercover Work"},
+ {"mothergoose256", "Mixed-Up Mother Goose"},
{"msastrochicken", "Ms. Astro Chicken"},
{"pq1sci", "Police Quest: In Pursuit of the Death Angel"},
{"pq3", "Police Quest III: The Kindred"},
@@ -94,7 +96,6 @@ static const PlainGameDescriptor s_sciGameTitles[] = {
{"sq5", "Space Quest V: The Next Mutation"},
{"islandbrain", "The Island of Dr. Brain"},
{"lsl6", "Leisure Suit Larry 6: Shape Up or Slip Out!"},
- {"mothergoose", "Mixed-Up Mother Goose"},
{"pepper", "Pepper's Adventure in Time"},
{"slater", "Slater & Charlie Go Camping"},
// === SCI2 games =========================================================
@@ -170,6 +171,7 @@ static const GameIdStrToEnum s_gameIdStrToEnum[] = {
{ "lsl6hires", GID_LSL6HIRES },
{ "lsl7", GID_LSL7 },
{ "mothergoose", GID_MOTHERGOOSE },
+ { "mothergoose256", GID_MOTHERGOOSE256 },
{ "mothergoosehires",GID_MOTHERGOOSEHIRES },
{ "msastrochicken", GID_MSASTROCHICKEN },
{ "pepper", GID_PEPPER },
@@ -654,7 +656,7 @@ SaveStateList SciMetaEngine::listSaves(const char *target) const {
// Obtain the last 3 digits of the filename, since they correspond to the save slot
slotNum = atoi(file->c_str() + file->size() - 3);
- if (slotNum >= 0 && slotNum < 999) {
+ if (slotNum >= 0 && slotNum <= 99) {
Common::InSaveFile *in = saveFileMan->openForLoading(*file);
if (in) {
SavegameMetadata meta;
@@ -721,7 +723,7 @@ SaveStateDescriptor SciMetaEngine::querySaveMetaInfos(const char *target, int sl
return SaveStateDescriptor();
}
-int SciMetaEngine::getMaximumSaveSlot() const { return 999; }
+int SciMetaEngine::getMaximumSaveSlot() const { return 99; }
void SciMetaEngine::removeSaveState(const char *target, int slot) const {
Common::String fileName = Common::String::printf("%s.%03d", target, slot);
diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h
index 0614eff6e6..d489ba219d 100644
--- a/engines/sci/detection_tables.h
+++ b/engines/sci/detection_tables.h
@@ -219,6 +219,21 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Codename: Iceman - English DOS (supplied by ssburnout in bug report #3049193)
+ // 1.022 9x5.25" (label: Int#0.000.668)
+ {"iceman", "", {
+ {"resource.map", 0, "2948e06dab4930e4c8098c24ac874db8", 6252},
+ {"resource.000", 0, "b1bccd827453d4cb834bfd5b45bef63c", 26974},
+ {"resource.001", 0, "005bd332d4b0f9d8e99d3b905223a332", 126839},
+ {"resource.002", 0, "250b859381ebf2bf8922bd99683b0cc1", 307001},
+ {"resource.003", 0, "7d7a840701d2f6eff57679bf7dced747", 318060},
+ {"resource.004", 0, "e0e72970bad9a956db13dcb63d898437", 322457},
+ {"resource.005", 0, "1f2f79e399098859c73e49ac6a3545d8", 330657},
+ {"resource.006", 0, "08050329aa113a9f14ed99cbfe3536ec", 232942},
+ {"resource.007", 0, "64f342463f6f35ba71b3509ef696ae3f", 267811},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Codename: Iceman - English DOS 1.023 (from abevi, bug report #2612718)
{"iceman", "", {
{"resource.map", 0, "da131654de1d6f640222c092313c6ca5", 6252},
@@ -351,6 +366,16 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "8c767b3939add63d11274065e46aad04", 713158},
AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Conquests of the Longbow DOS 1.0 EGA (4 x 5.25" disks)
+ // Provided by ssburnout in bug report #3046802
+ {"longbow", "EGA", {
+ {"resource.map", 0, "0517ca368ec844df0cb21a05020fae01", 6021},
+ {"resource.000", 0, "36e8fda5d0b8c49e587c8a9617959f72", 934643},
+ {"resource.001", 0, "76c729e563809170e6cc8b2f3f6cf0a4", 1196133},
+ {"resource.002", 0, "8c767b3939add63d11274065e46aad04", 1152478},
+ {"resource.003", 0, "7025b87e735b1df3f0e9488a621f4333", 1171439},
+ AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Conquests of the Longbow - English DOS Non-Interactive Demo
// SCI interpreter version 1.000.510
{"longbow", "Demo", {
@@ -643,6 +668,15 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::ES_ESP, Common::kPlatformWindows, 0, GUIO_NONE },
+ // Gabriel Knight - English Macintosh
+ {"gk1", "", {
+ {"Data1", 0, "7a89c96365a4da5d3b3efdc3a94bab3e", 5831362},
+ {"Data2", 0, "db70638e972c3706e4dc9e01ef3a30ea", 6696048},
+ {"Data3", 0, "d740126293aea176c4f8a6c71634cff4", 3683997},
+ {"Data4", 0, "f6cbf2605f618ce035bed162d66b2b8a", 3233086},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NONE },
+
// Gabriel Knight 2 - English Windows Non-Interactive Demo
// Executable scanning reports "2.100.002"
{"gk2", "Demo", {
@@ -690,6 +724,16 @@ static const struct ADGameDescription SciGameDescriptions[] = {
#endif // ENABLE_SCI32
+ // Hoyle 1 - English DOS (supplied by ssburnout in bug report #3049193)
+ // 1.000.104 3x5.25" (label:INT.0.000.519)
+ {"hoyle1", "", {
+ {"resource.map", 0, "d6c37503a8f282636e1b08f7a6cf4afd", 7818},
+ {"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 162805},
+ {"resource.002", 0, "e0dd44069a62a463fd124974b915f10d", 342149},
+ {"resource.003", 0, "e0dd44069a62a463fd124974b915f10d", 328925},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Hoyle 1 - English DOS (supplied by wibble92 in bug report #2644547)
// SCI interpreter version 0.000.530
{"hoyle1", "", {
@@ -708,6 +752,13 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Hoyle 1 - English DOS (supplied by eddydrama in bug report #3052366)
+ {"hoyle1", "", {
+ {"resource.map", 0, "0af9a3dcd72a091960de070432e1f524", 4386},
+ {"resource.001", 0, "e0dd44069a62463fd124974b915f10d", 518127},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
#if 0 // TODO: unknown if these files are corrupt
// Hoyle 1 - English Amiga (from www.back2roots.org)
// SCI interpreter version 0.000.519 - FIXME: some have 0.000.530, others x.yyy.zzz
@@ -728,6 +779,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Hoyle 2 - English DOS (supplied by ssburnout in bug report #3049193)
+ // 1.000.011 1x3.5" (label:Int#6.21.90)
+ {"hoyle2", "", {
+ {"resource.map", 0, "db0ba08b953e9904a4960ad99cd29c20", 1356},
+ {"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 216315},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Hoyle 2 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.032"
// SCI interpreter version 0.000.685
@@ -776,8 +835,19 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
- // Hoyle 3 - English DOS Floppy 1.0 (supplied by abevi in bug report #2612718)
+ // Hoyle 3 - English DOS Floppy (supplied by eddydrama in bug report #3038837)
{"hoyle3", "", {
+ {"resource.map", 0, "31c9fc0977ac6e5b566c37096803d0cb", 2469},
+ {"resource.000", 0, "6ef28cac094dcd97fdb461662ead6f92", 12070},
+ {"resource.001", 0, "ca6a9750a2c138d8bcbba369126040e9", 348646},
+ {"resource.002", 0, "0a98a268ee99b92c233a0d7187c1f0fa", 345811},
+ {"resource.003", 0, "97cfd72633f8f9b2a0b1d4116cf3ee81", 346116},
+ {"resource.004", 0, "2884fb91b225fabd9ca87ea231293b48", 351218},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
+ // Hoyle 3 EGA - English DOS Floppy 1.0 (supplied by abevi in bug report #2612718)
+ {"hoyle3", "EGA", {
{"resource.map", 0, "1728af1f6a85938c3522e64449e76ca1", 2205},
{"resource.000", 0, "6ef28cac094dcd97fdb461662ead6f92", 319905},
{"resource.001", 0, "0a98a268ee99b92c233a0d7187c1f0fa", 526438},
@@ -803,7 +873,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
// Hoyle 4 (Hoyle Classic Card Games) - English DOS/Win
// SCI1.1
// Supplied by abevi in bug report #3039291
- {"hoyle4", "Demo", {
+ {"hoyle4", "", {
{"resource.map", 0, "2b577c975cc8d8d43f61b6a756129fe3", 4352},
{"resource.000", 0, "43e2c15ce436aab611a462ad0603e12d", 2000132},
AD_LISTEND},
@@ -880,6 +950,20 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // King's Quest 1 SCI Remake - English DOS (supplied by ssburnout in bug report #3049193)
+ // 1.000.051 9x5.25" (label: INT#9.19.90)
+ {"kq1sci", "SCI Remake", {
+ {"resource.map", 0, "4dac689e98b2fa6806232fdd61e24712", 9936},
+ {"resource.001", 0, "fed9e0072ffd511d248674e60dee2099", 196027},
+ {"resource.002", 0, "fed9e0072ffd511d248674e60dee2099", 330278},
+ {"resource.003", 0, "fed9e0072ffd511d248674e60dee2099", 355008},
+ {"resource.004", 0, "fed9e0072ffd511d248674e60dee2099", 265478},
+ {"resource.005", 0, "fed9e0072ffd511d248674e60dee2099", 316854},
+ {"resource.006", 0, "fed9e0072ffd511d248674e60dee2099", 351062},
+ {"resource.007", 0, "fed9e0072ffd511d248674e60dee2099", 330472},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// King's Quest 4 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.032"
// SCI interpreter version 0.000.685
@@ -901,6 +985,17 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ // King's Quest 4 - English DOS (original boxed release, 3 1/2" disks)
+ // SCI interpreter version 0.000.247
+ {"kq4sci", "", {
+ {"resource.map", 0, "042d54434174d8f9faf926ade2ffd805", 7416},
+ {"resource.001", 0, "851a62d00972dc4002f472cc0d84e71d", 491919},
+ {"resource.002", 0, "851a62d00972dc4002f472cc0d84e71d", 678804},
+ {"resource.003", 0, "851a62d00972dc4002f472cc0d84e71d", 683145},
+ {"resource.004", 0, "851a62d00972dc4002f472cc0d84e71d", 649441},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// King's Quest 4 - English DOS (from the King's Quest Collection)
// Executable scanning reports "0.000.502"
// SCI interpreter version 0.000.502
@@ -913,6 +1008,20 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // King's Quest 4 - English DOS (supplied by ssburnout in bug report #3049193)
+ // 1.006.003 8x5.25" (label: Int.#0.000.502)
+ {"kq4sci", "", {
+ {"resource.map", 0, "a22b66e6fa0d82460b985e9f7e562950", 9384},
+ {"resource.001", 0, "6db7de6f93c6ea62dca78abee677f8c0", 174852},
+ {"resource.002", 0, "6db7de6f93c6ea62dca78abee677f8c0", 356024},
+ {"resource.003", 0, "6db7de6f93c6ea62dca78abee677f8c0", 335716},
+ {"resource.004", 0, "6db7de6f93c6ea62dca78abee677f8c0", 312231},
+ {"resource.005", 0, "6db7de6f93c6ea62dca78abee677f8c0", 283466},
+ {"resource.006", 0, "6db7de6f93c6ea62dca78abee677f8c0", 324789},
+ {"resource.007", 0, "6db7de6f93c6ea62dca78abee677f8c0", 334441},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// King's Quest 4 - English DOS
// SCI interpreter version 0.000.274
{"kq4sci", "", {
@@ -1060,6 +1169,18 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // King's Quest V DOS 0.000.062 EGA (5 x 5.25" disks)
+ // Supplied by ssburnout in bug report #3046780
+ {"kq5", "EGA", {
+ {"resource.map", 0, "ef4fdc72ca7aef62054e8b075d7960d8", 7596},
+ {"resource.000", 0, "a591bd4b879fc832b8095c0b3befe9e2", 413648},
+ {"resource.001", 0, "c1eef048fa9fe76298c2d4705ef9549f", 1162806},
+ {"resource.002", 0, "4d74e8094ff57cea6ee92faf63dbd0af", 1194799},
+ {"resource.003", 0, "3cca5b2dae8afe94532edfdc98d7edbe", 1092325},
+ {"resource.004", 0, "8e5c1bc4d738cf7316ff506f59d265e2", 1187803},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// King's Quest 5 - German DOS Floppy (supplied by markcoolio in bug report #2727101, also includes english language)
// SCI interpreter version 1.000.060
{"kq5", "", {
@@ -1527,6 +1648,26 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Larry 2 - English DOS (supplied by ssburnout in bug report #3049193)
+ // 1.000.011 3x3.5" (label: Int. #0.000.343)
+ {"lsl2", "", {
+ {"resource.map", 0, "e5caa855a5be78c53a6a92157d0b9f5c", 4740},
+ {"resource.001", 0, "96033f57accfca903750413fd09193c8", 474642},
+ {"resource.002", 0, "96033f57accfca903750413fd09193c8", 407014},
+ {"resource.003", 0, "96033f57accfca903750413fd09193c8", 592834},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
+ // Larry 2 - English DOS (supplied by ssburnout in bug report #3049193)
+ // 1.002.000 3x3.5" (label: INT#0.000.409)
+ {"lsl2", "", {
+ {"resource.map", 0, "2c9c3b0923e3764f5ab999bcb71c2d47", 4758},
+ {"resource.001", 0, "4a24443a25e2b1492462a52809605dc2", 477625},
+ {"resource.002", 0, "4a24443a25e2b1492462a52809605dc2", 406935},
+ {"resource.003", 0, "4a24443a25e2b1492462a52809605dc2", 592533},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Larry 3 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.032"
// SCI interpreter version 0.000.685
@@ -1552,6 +1693,20 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Larry 3 - English DOS (supplied by ssburnout in bug report #3049193)
+ // 1.021 8x5.25" (label: Int#5.15.90)
+ {"lsl3", "", {
+ {"resource.map", 0, "a39a20580362af3437352dbc717734f8", 7452},
+ {"resource.001", 0, "f18441027154292836b973c655fa3175", 141515},
+ {"resource.002", 0, "f18441027154292836b973c655fa3175", 345494},
+ {"resource.003", 0, "f18441027154292836b973c655fa3175", 329220},
+ {"resource.004", 0, "f18441027154292836b973c655fa3175", 290303},
+ {"resource.005", 0, "f18441027154292836b973c655fa3175", 303905},
+ {"resource.006", 0, "f18441027154292836b973c655fa3175", 282649},
+ {"resource.007", 0, "f18441027154292836b973c655fa3175", 257178},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Larry 3 - English DOS
// SCI interpreter version 0.000.572
{"lsl3", "", {
@@ -1599,6 +1754,20 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ // Larry 3 1.050 Fr/En (9 x 5.25" disks)
+ // Provided by ssburnout in bug report #3046779
+ {"lsl3", "", {
+ {"resource.map", 0, "527277cee7b31dd603229443b48e70c4", 8910},
+ {"resource.001", 0, "65f1bdaa20f6d0470e9d969f22473873", 162132},
+ {"resource.002", 0, "65f1bdaa20f6d0470e9d969f22473873", 309705},
+ {"resource.003", 0, "65f1bdaa20f6d0470e9d969f22473873", 346507},
+ {"resource.004", 0, "65f1bdaa20f6d0470e9d969f22473873", 331947},
+ {"resource.005", 0, "65f1bdaa20f6d0470e9d969f22473873", 347136},
+ {"resource.006", 0, "65f1bdaa20f6d0470e9d969f22473873", 325292},
+ {"resource.007", 0, "65f1bdaa20f6d0470e9d969f22473873", 308982},
+ AD_LISTEND},
+ Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+
// Larry 5 - English Amiga
// Executable scanning reports "1.004.023"
// SCI interpreter version 1.000.784
@@ -1708,6 +1877,32 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Larry 5 1.0 EGA DOS (8 x 3.5" disks)
+ // Provided by ssburnout in bug report #3046806
+ {"lsl5", "EGA", {
+ {"resource.map", 0, "1370ae356fdda2e7f9ea56dda3ff9a57", 6597},
+ {"resource.000", 0, "f2537473213d70e7f4fc82e988ab90ca", 248416},
+ {"resource.001", 0, "bb642b0b0f879aca98addd62d901387e", 445841},
+ {"resource.002", 0, "c2cb2dec12e26f6243bc1b78e4e84940", 617030},
+ {"resource.003", 0, "f8e876302a3aba5bcaab5c51db6b6532", 682911},
+ {"resource.004", 0, "16f4d8fb1b526125edaca4fc6cbb7530", 530230},
+ {"resource.005", 0, "6043b2cc23d663e6a01b25bd0e4de55e", 576442},
+ {"resource.006", 0, "f6046a8445422f17d40b1b10ab21ebf3", 568551},
+ {"resource.007", 0, "640ee65595d40372ef95462f2c1ae28a", 593429},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
+ // Larry 5 EGA
+ // Supplied by omer_mor in bug report #3049771
+ {"lsl5", "EGA", {
+ {"resource.map", 0, "89dbf8006985ec0c547ffe125c25ebf9", 6255},
+ {"resource.000", 0, "f2537473213d70e7f4fc82e988ab90ca", 765747},
+ {"resource.001", 0, "bb642b0b0f879aca98addd62d901387e", 1196260},
+ {"resource.002", 0, "5a55af4e40728b1a8103dc47ad2afa8d", 1100539},
+ {"resource.003", 0, "16f4d8fb1b526125edaca4fc6cbb7530", 1064563},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Larry 6 - English DOS (from spookypeanut)
// SCI interpreter version 1.001.113
{"lsl6", "", {
@@ -1959,9 +2154,22 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Mixed-Up Mother Goose - English DOS Floppy EGA (supplied by ssburnout in bug report #3049193)
+ // 1.011 5x5.25" (label: Int#8.2.90)
+ {"mothergoose", "EGA", {
+ {"resource.map", 0, "7d308bfc6006d0e20985a7295c238efc", 2010},
+ {"resource.000", 0, "bb662eebeb5ffea2d705064801f6f70f", 140375},
+ {"resource.001", 0, "13ddcdf971339150c2963548c9761b31", 52648},
+ {"resource.002", 0, "13ddcdf971339150c2963548c9761b31", 204401},
+ {"resource.003", 0, "e2c858b89e89bffe37b33e01d2827930", 166990},
+ {"resource.004", 0, "dbbc22f124533ce308bc386b08956326", 146251},
+ {"resource.005", 0, "2ba5348e7fad641b9c4c7ff7c7cf4e68", 110979},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Mixed-Up Mother Goose v2.000 - English DOS Floppy (supplied by markcoolio in bug report #2723795)
// Executable scanning reports "1.001.031"
- {"mothergoose", "", {
+ {"mothergoose256", "", {
{"resource.map", 0, "52aae15e493cafd1da7e1c9b657a5bb9", 7026},
{"resource.000", 0, "b7ecd8ae9e254e80310b5a668b276e6e", 2948975},
AD_LISTEND},
@@ -1970,7 +2178,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
// Mixed-Up Mother Goose - English DOS CD (from jvprat)
// Executable scanning reports "x.yyy.zzz"
// SCI interpreter version 0.000.999 (just a guess)
- {"mothergoose", "CD", {
+ {"mothergoose256", "CD", {
{"resource.map", 0, "1c7f311b0a2c927b2fbe81ae341fb2f6", 5790},
{"resource.001", 0, "5a0ed1d745855148364de1b3be099bac", 4369438},
AD_LISTEND},
@@ -1978,7 +2186,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
// Mixed-Up Mother Goose - English Windows Interactive Demo
// Executable scanning reports "x.yyy.zzz"
- {"mothergoose", "Demo", {
+ {"mothergoose256", "Demo", {
{"resource.map", 0, "87f9dc1cafc4d4fa835fb2f00cf3a6ef", 4560},
{"resource.001", 0, "5a0ed1d745855148364de1b3be099bac", 2070072},
AD_LISTEND},
@@ -2240,6 +2448,19 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH },
+ // Police Quest 3 EGA
+ // Reported by musiclyinspired in bug report #3046573
+ {"pq3", "", {
+ {"resource.map", 0, "1341f7c9643947414a8e238b88f68d82", 5901},
+ {"resource.000", 0, "7659713720d61d9465a59091b7ee63ea", 402208},
+ {"resource.001", 0, "0284ca44341fbc3cb7a047e49d230234", 703373},
+ {"resource.002", 0, "fc9452f962bd7a9bbf6e78e9e52a8e18", 692676},
+ {"resource.003", 0, "31c226bf01b69c8182b8ca0e8760b0a7", 527848},
+ {"resource.004", 0, "b96a86ab681769e4cbb439670d967ca6", 449682},
+ {"resource.005", 0, "9e6c53a0e7eef53694d260fade8b1fc7", 724000},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Police Quest 4 - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.001.096
{"pq4", "Demo", {
@@ -2332,6 +2553,36 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Quest for Glory 1 / Hero's Quest - English DOS 5.25" Floppy (supplied by ssburnout in bug report #3049193)
+ // 1.001 10x5.25" (label: INT.#0.000.566)
+ {"qfg1", "", {
+ {"resource.map", 0, "c5a0346ff16c43b1eea9583d15e7743c", 6948},
+ {"resource.000", 0, "481b034132106390cb5160fe61dd5f58", 80334},
+ {"resource.001", 0, "4d67acf52833ff45c7f753d6663532e8", 95500},
+ {"resource.002", 0, "3e2a89d60d385caca5b3394049da4bc4", 271587},
+ {"resource.003", 0, "e56e9fd2f7d2c98774699f7a5087e524", 256373},
+ {"resource.004", 0, "d74cd4290bf60e1409117202e4ce8592", 266415},
+ {"resource.005", 0, "7288ed6d5da89b7a80b4af3897a7963a", 271185},
+ {"resource.006", 0, "69366c2a2f99917199fe1b60a4fee19d", 267852},
+ {"resource.007", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 272747},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
+ // Quest for Glory 1 / Hero's Quest - English DOS 5.25" Floppy (supplied by ssburnout in bug report #3049193)
+ // 1.200 10x5.25" (label: INT#9.10.90)
+ {"qfg1", "", {
+ {"resource.map", 0, "96939838dd9aa17b110c25256f04dd0b", 6906},
+ {"resource.000", 0, "40332d3ebfc70a4b6a6a0443c2763287", 79181},
+ {"resource.001", 0, "917fcef303e9489597154727baaa9e07", 74752},
+ {"resource.002", 0, "c000304092dc439d5103563853b4fc6d", 273186},
+ {"resource.003", 0, "1903eb08c02e2218b4a38ab9d5553e01", 258115},
+ {"resource.004", 0, "4b8e46d72ce887d13c552be56db3b3c8", 267882},
+ {"resource.005", 0, "f40198349d542e105d040743435e0cd6", 268907},
+ {"resource.006", 0, "f46690dca714abc8c89357d30e363dd3", 278387},
+ {"resource.007", 0, "951299a82a8134ed12c5c18118d45c2f", 269173},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Quest for Glory 1 / Hero's Quest - English DOS Demo
// Executable scanning reports "0.000.685"
{"qfg1", "Demo", {
@@ -2437,6 +2688,33 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH },
+ // Quest for Glory 2 - English (supplied by ssburnout in bug report #3049193)
+ // 1.000 5x5.25" (label: INT#10.31.90)
+ {"qfg2", "", {
+ {"resource.map", 0, "5b07fa7ea23afb7dd6804e64e7f7470f", 6906},
+ {"resource.000", 0, "a17e374c4d33b81208c862bc0ffc1a38", 212151},
+ {"resource.001", 0, "e4cc56e7a471325bc8ba1dc78334f52f", 866944},
+ {"resource.002", 0, "5f08242f962293be8fb852f183342350", 790850},
+ {"resource.003", 0, "0790f67d87642132be515cab05026baa", 972144},
+ {"resource.004", 0, "2ac1e6fea9aa1f5b91a06693a67b9766", 982830},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
+ // Quest for Glory 2 - English (supplied by ssburnout in bug report #3049193)
+ // 1.000 9x3.5" (label: INT#10.31.90)
+ {"qfg2", "", {
+ {"resource.map", 0, "1e30119a632a53eb8343fff7c9989025", 8148},
+ {"resource.000", 0, "a17e374c4d33b81208c862bc0ffc1a38", 212151},
+ {"resource.001", 0, "e4cc56e7a471325bc8ba1dc78334f52f", 331803},
+ {"resource.002", 0, "5f08242f962293be8fb852f183342350", 468129},
+ {"resource.003", 0, "5f08242f962293be8fb852f183342350", 501963},
+ {"resource.004", 0, "5f08242f962293be8fb852f183342350", 482486},
+ {"resource.005", 0, "5f08242f962293be8fb852f183342350", 478071},
+ {"resource.006", 0, "5e9deacbdb17198ad844988e04833520", 498593},
+ {"resource.007", 0, "2ac1e6fea9aa1f5b91a06693a67b9766", 490151},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Quest for Glory 2 - English (from FRG)
// Executable scanning reports "1.000.072"
{"qfg2", "", {
@@ -2513,6 +2791,15 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE },
+ // Quest for Glory 3 - Italian DOS
+ // Supplied by ghoost in bug report #3053457
+ {"qfg3", "", {
+ {"resource.map", 0, "19e2bf9b693932b5e2bb59b9f9ab86c9", 5958},
+ {"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868000},
+ {"resource.msg", 0, "5a0a896ff3e4a628db38a75eb6c84114", 259018},
+ AD_LISTEND},
+ Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NONE },
+
// Quest for Glory 4 - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.001.069 (just a guess)
{"qfg4", "Demo", {
@@ -2554,17 +2841,6 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
-#endif
-
- // Slater & Charlie go camping
- {"slater", "", {
- {"resource.000", 0, "1846b57fe84774be72f7c50ab3c90df0", 2256126},
- {"resource.map", 0, "21f85414124dc23e54544a5536dc35cd", 4044},
- {"resource.msg", 0, "c44f51fb955eae266fecf360ebcd5ad2", 1132},
- AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH },
-
-#ifdef ENABLE_SCI32
// RAMA - English DOS/Windows Demo
// Executable scanning reports "2.100.002", VERSION file reports "000.000.008"
{"rama", "Demo", {
@@ -2660,6 +2936,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH },
+ // Slater & Charlie Go Camping - English DOS/Windows
+ {"slater", "", {
+ {"resource.000", 0, "1846b57fe84774be72f7c50ab3c90df0", 2256126},
+ {"resource.map", 0, "21f85414124dc23e54544a5536dc35cd", 4044},
+ {"resource.msg", 0, "c44f51fb955eae266fecf360ebcd5ad2", 1132},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Space Quest 1 VGA Remake - English Amiga (from www.back2roots.org)
// SCI interpreter version 1.000.510 (just a guess)
{"sq1sci", "VGA Remake", {
@@ -2719,6 +3003,19 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Space Quest I 2.0 EGA DOS (6 x 3.5" disks)
+ // Provided by ssburnout in bug report #3046805
+ {"sq1sci", "EGA Remake", {
+ {"resource.map", 0, "dc1bb935bf32da652b2e687617f50cd4", 6003},
+ {"resource.000", 0, "e9d866534f8c84de82e25f2631ff258c", 409145},
+ {"resource.001", 0, "a89b7b52064c75b1985b289edc2f5c69", 647747},
+ {"resource.002", 0, "f43d4f08547336c9fd28c23a7da79c41", 697438},
+ {"resource.003", 0, "4164edf21495b9114f9a514e401b4d95", 669070},
+ {"resource.004", 0, "975c6e81194ae6b65e960a248129ecaa", 684119},
+ {"resource.005", 0, "13d96f7905637552c0647175ff816145", 695589},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Space Quest 3 - English Amiga (from www.back2roots.org)
// SCI interpreter version 0.000.453 (just a guess)
{"sq3", "", {
@@ -2845,7 +3142,6 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH },
-#if 0
// Space Quest 4 - English DOS - THIS VERSION IS PIRATED/CRACKED AND REPACKAGED =DO NOT RE-ADD=
// Executable scanning reports "1.000.753"
// SCI interpreter version 1.000.200 (just a guess)
@@ -2853,8 +3149,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a18088c8aceb06025dbc945f29e02935", 5124},
{"resource.000", 0, "e1f46832cd2458796028e054a0466031", 5502009},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
-#endif
+ Common::EN_ANY, Common::kPlatformPC, ADGF_PIRATED, GUIO_NOSPEECH },
// Space Quest 4 - English DOS
// Executable scanning reports "1.000.753"
@@ -2891,6 +3186,19 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ // Space Quest IV DOS 1.060 EGA (6 x 3.5" disks)
+ // Supplied by ssburnout in bug report #3046781
+ {"sq4", "EGA", {
+ {"resource.map", 0, "4f59814d23a3721f251140fdcfebe35d", 5556},
+ {"resource.000", 0, "e1f46832cd2458796028e054a0466031", 385479},
+ {"resource.001", 0, "590b996f85333dba50cfdd1489de2be2", 617504},
+ {"resource.002", 0, "ea8c49b84c6e641e7600cbca90a81741", 632814},
+ {"resource.003", 0, "33c396eb78bafaec38480bcdd9024843", 627369},
+ {"resource.004", 0, "9a673e33c3f6dd560b993ffed77eeb49", 534994},
+ {"resource.005", 0, "3c4841d0a3ebba4404af588c93620c22", 595465},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+
// Space Quest 4 - German DOS (from Tobis87, also includes english language)
// SCI interpreter version 1.000.200 (just a guess)
{"sq4", "", {
@@ -3010,13 +3318,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
AD_LISTEND},
Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
- // Space Quest 5 - English DOS
+ // Space Quest 5 - English DOS - THIS IS THE UNOFFICIAL BETA VERSION, WHICH IS OBVIOUSLY PIRATED AND CONTAINS MANY BUGS
+ // ffs. http://www.akril15.com/sr/sq5alt/sq5alt.html =DO NOT RE-ADD=
// SCI interpreter version 1.001.067
{"sq5", "", {
{"resource.map", 0, "8bde0a9adb9a3e9aaa861826874c9834", 6473},
{"resource.000", 0, "f4a48705764544d7cc64a7bb22a610df", 6025184},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH },
+ Common::EN_ANY, Common::kPlatformPC, ADGF_PIRATED, GUIO_NOSPEECH },
// Space Quest 5 v1.04 - German DOS (from Tobis87, updated information by markcool from bug reports #2723935 and #2724762)
// SCI interpreter version 1.001.068
diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp
index f99d412c64..97eec38caf 100644
--- a/engines/sci/engine/features.cpp
+++ b/engines/sci/engine/features.cpp
@@ -138,9 +138,9 @@ bool GameFeatures::autoDetectSoundType() {
SciVersion GameFeatures::detectDoSoundType() {
if (_doSoundType == SCI_VERSION_NONE) {
if (getSciVersion() == SCI_VERSION_0_EARLY) {
- // This game is using early SCI0 sound code (different headers than
- // SCI0 late)
- _doSoundType = SCI_VERSION_0_EARLY;
+ // Almost all of the SCI0EARLY games use different sound resources than
+ // SCI0LATE. Although the last SCI0EARLY game (lsl2) uses SCI0LATE resources
+ _doSoundType = g_sci->getResMan()->detectEarlySound() ? SCI_VERSION_0_EARLY : SCI_VERSION_0_LATE;
#ifdef ENABLE_SCI32
} else if (getSciVersion() >= SCI_VERSION_2_1) {
_doSoundType = SCI_VERSION_2_1;
@@ -275,15 +275,8 @@ SciVersion GameFeatures::detectLofsType() {
return _lofsType;
}
- // Find the "Game" object, super class of the actual game-object
- const reg_t game = g_sci->getGameObject();
- const Object *gameObject = _segMan->getObject(game);
- reg_t gameSuperClass = NULL_REG;
- if (gameObject) {
- gameSuperClass = gameObject->getSuperClassSelector();
- }
-
- // Find a function of the game object which invokes lofsa/lofss
+ // Find a function of the "Game" object (which is the game super class) which invokes lofsa/lofss
+ reg_t gameSuperClass = g_sci->getGameSuperClassAddress();
bool found = false;
if (!gameSuperClass.isNull()) {
Common::String gameSuperClassName = _segMan->getObjectName(gameSuperClass);
diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp
index 936b83d760..c1939c6566 100644
--- a/engines/sci/engine/gc.cpp
+++ b/engines/sci/engine/gc.cpp
@@ -28,6 +28,8 @@
namespace Sci {
+//#define GC_DEBUG_CODE
+
struct WorklistManager {
Common::Array<reg_t> _worklist;
AddrSet _map;
@@ -153,10 +155,12 @@ void run_gc(EngineState *s) {
// Some debug stuff
debugC(2, kDebugLevelGC, "[GC] Running...");
+#ifdef GC_DEBUG_CODE
const char *segnames[SEG_TYPE_MAX + 1];
int segcount[SEG_TYPE_MAX + 1];
memset(segnames, 0, sizeof(segnames));
memset(segcount, 0, sizeof(segcount));
+#endif
// Compute the set of all segments references currently in use.
AddrSet *activeRefs = findAllActiveReferences(s);
@@ -166,10 +170,13 @@ void run_gc(EngineState *s) {
const Common::Array<SegmentObj *> &heap = segMan->getSegments();
for (uint seg = 1; seg < heap.size(); seg++) {
SegmentObj *mobj = heap[seg];
+
if (mobj != NULL) {
+#ifdef GC_DEBUG_CODE
const SegmentType type = mobj->getType();
segnames[type] = SegmentObj::getSegmentTypeName(type);
-
+#endif
+
// Get a list of all deallocatable objects in this segment,
// then free any which are not referenced from somewhere.
const Common::Array<reg_t> tmp = mobj->listAllDeallocatable(seg);
@@ -179,7 +186,9 @@ void run_gc(EngineState *s) {
// Not found -> we can free it
mobj->freeAtAddress(segMan, addr);
debugC(2, kDebugLevelGC, "[GC] Deallocating %04x:%04x", PRINT_REG(addr));
+#ifdef GC_DEBUG_CODE
segcount[type]++;
+#endif
}
}
@@ -188,11 +197,13 @@ void run_gc(EngineState *s) {
delete activeRefs;
+#ifdef GC_DEBUG_CODE
// Output debug summary of garbage collection
debugC(2, kDebugLevelGC, "[GC] Summary:");
for (int i = 0; i <= SEG_TYPE_MAX; i++)
if (segcount[i])
debugC(2, kDebugLevelGC, "\t%d\t* %s", segcount[i], segnames[i]);
+#endif
}
} // End of namespace Sci
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 157884fac3..ff327a0049 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -744,11 +744,9 @@ void Kernel::setDefaultKernelNames(GameFeatures *features) {
_kernelNames = Common::StringArray(s_defaultKernelNames, ARRAYSIZE(s_defaultKernelNames));
// Some (later) SCI versions replaced CanBeHere by CantBeHere
- if (_selectorCache.cantBeHere != -1) {
- // hoyle 3 has cantBeHere selector but is assuming to call kCanBeHere
- if (g_sci->getGameId() != GID_HOYLE3)
- _kernelNames[0x4d] = "CantBeHere";
- }
+ // If vocab.999 exists, the kernel function is still named CanBeHere
+ if (_selectorCache.cantBeHere != -1)
+ _kernelNames[0x4d] = "CantBeHere";
switch (getSciVersion()) {
case SCI_VERSION_0_EARLY:
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index b6247b46f1..dedc836b32 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -419,6 +419,7 @@ reg_t kStrSplit(EngineState *s, int argc, reg_t *argv);
reg_t kPlatform(EngineState *s, int argc, reg_t *argv);
reg_t kTextColors(EngineState *s, int argc, reg_t *argv);
reg_t kTextFonts(EngineState *s, int argc, reg_t *argv);
+reg_t kShow(EngineState *s, int argc, reg_t *argv);
reg_t kDummy(EngineState *s, int argc, reg_t *argv);
reg_t kEmpty(EngineState *s, int argc, reg_t *argv);
reg_t kStub(EngineState *s, int argc, reg_t *argv);
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index b2b8eb593e..29e2a38ad4 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -320,16 +320,16 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL },
{ MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL },
{ MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, kDeviceInfo_workarounds }, // subop
- { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, NULL },
+ { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, kDisplay_workarounds },
// ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro
// restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same
- { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL },
+ { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, kDirLoop_workarounds },
{ MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL },
{ MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL },
{ MAP_CALL(DisposeScript), SIG_EVERYWHERE, "i(i*)", NULL, kDisposeScript_workarounds },
{ MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "i(i)", NULL, NULL },
{ MAP_CALL(DoAudio), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop
- { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL, NULL },
+ { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o(i)", NULL, NULL },
{ MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL },
{ MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL },
{ MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop
@@ -412,9 +412,9 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, NULL },
{ MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL },
{ MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL },
- { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir", NULL, NULL },
+ { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "[r0]i[r0]", NULL, NULL },
{ MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL },
- { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rir(r)", NULL, NULL },
+ { MAP_CALL(SaveGame), SIG_EVERYWHERE, "[r0]i[r0](r)", NULL, NULL },
{ MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL },
{ MAP_CALL(SetCursor), SIG_SCI21, SIGFOR_ALL, "i(i)([io])(i*)", NULL, NULL },
// TODO: SCI2.1 may supply an object optionally (mother goose sci21 right on startup) - find out why
@@ -430,11 +430,12 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL, NULL },
{ MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "(i)(i)", NULL, NULL },
{ MAP_CALL(ShowMovie), SIG_EVERYWHERE, "(.*)", NULL, NULL },
+ { MAP_CALL(Show), SIG_EVERYWHERE, "i", NULL, NULL },
{ MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL, NULL },
{ MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL, NULL },
{ MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL, NULL },
{ MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, kStrAt_workarounds },
- { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL },
+ { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, kStrCat_workarounds },
{ MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL },
{ MAP_CALL(StrCpy), SIG_EVERYWHERE, "r[r0](i)", NULL, NULL },
{ MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL },
@@ -502,7 +503,7 @@ static const char *s_defaultKernelNames[] = {
/*0x06*/ "IsObject",
/*0x07*/ "RespondsTo",
/*0x08*/ "DrawPic",
- /*0x09*/ "Dummy", // Show
+ /*0x09*/ "Show",
/*0x0a*/ "PicNotValid",
/*0x0b*/ "Animate",
/*0x0c*/ "SetNowSeen",
diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp
index 3395811700..9d48174078 100644
--- a/engines/sci/engine/kevent.cpp
+++ b/engines/sci/engine/kevent.cpp
@@ -23,6 +23,8 @@
*
*/
+#include "common/system.h"
+
#include "sci/sci.h"
#include "sci/engine/features.h"
#include "sci/engine/state.h"
@@ -42,7 +44,6 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
int mask = argv[0].toUint16();
reg_t obj = argv[1];
SciEvent curEvent;
- int oldx, oldy;
int modifier_mask = getSciVersion() <= SCI_VERSION_01 ? SCI_KEYMOD_ALL : SCI_KEYMOD_NO_FOOLOCK;
SegManager *segMan = s->_segMan;
Common::Point mousePos;
@@ -67,13 +68,24 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
return make_reg(0, 1);
}
- oldx = mousePos.x;
- oldy = mousePos.y;
curEvent = g_sci->getEventManager()->getSciEvent(mask);
if (g_sci->getVocabulary())
g_sci->getVocabulary()->parser_event = NULL_REG; // Invalidate parser event
+ if (s->_cursorWorkaroundActive) {
+ // ffs: GfxCursor::setPosition()
+ // we check, if actual cursor position is inside given rect
+ // if that's the case, we switch ourself off. Otherwise
+ // we simulate the original set position to the scripts
+ if (s->_cursorWorkaroundRect.contains(mousePos.x, mousePos.y)) {
+ s->_cursorWorkaroundActive = false;
+ } else {
+ mousePos.x = s->_cursorWorkaroundPoint.x;
+ mousePos.y = s->_cursorWorkaroundPoint.y;
+ }
+ }
+
writeSelectorValue(segMan, obj, SELECTOR(x), mousePos.x);
writeSelectorValue(segMan, obj, SELECTOR(y), mousePos.y);
@@ -162,6 +174,21 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
g_sci->_soundCmd->updateSci0Cues();
}
+ // Wait a bit here, so that the CPU isn't maxed out when the game
+ // is waiting for user input (e.g. when showing text boxes) - bug
+ // #3037874. This works when games do benchmarking at the beginning,
+ // because most of them call kAnimate for benchmarking without
+ // calling kGetEvent in between (rightly so).
+ if (g_sci->getGameId() == GID_JONES && g_sci->getEngineState()->currentRoomNumber() == 764) {
+ // Jones CD is an exception, as it incorrectly calls GetEvent
+ // while benchmarking. Thus, don't delay here for room 764 in
+ // Jones (the speed test room), otherwise speed testing will
+ // fail and the game won't show any views, as it will think that
+ // the user has a slow machine - bug #3058865
+ } else {
+ g_system->delayMillis(10);
+ }
+
return s->r_acc;
}
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp
index 39c32ccc68..e08f27cdf7 100644
--- a/engines/sci/engine/kfile.cpp
+++ b/engines/sci/engine/kfile.cpp
@@ -24,10 +24,13 @@
*/
#include "common/archive.h"
+#include "common/config-manager.h"
#include "common/file.h"
#include "common/str.h"
#include "common/savefile.h"
+#include "gui/saveload.h"
+
#include "sci/sci.h"
#include "sci/engine/state.h"
#include "sci/engine/kernel.h"
@@ -37,7 +40,7 @@
namespace Sci {
struct SavegameDesc {
- uint id;
+ int16 id;
int virtualId; // straight numbered, according to id but w/o gaps
int date;
int time;
@@ -98,13 +101,9 @@ enum {
-reg_t file_open(EngineState *s, const char *filename, int mode) {
- // QfG3 character import prepends /\ to the filenames.
- if (filename[0] == '/' && filename[1] == '\\')
- filename += 2;
-
+reg_t file_open(EngineState *s, const char *filename, int mode, bool unwrapFilename) {
Common::String englishName = g_sci->getSciLanguageString(filename, K_LANG_ENGLISH);
- const Common::String wrappedName = g_sci->wrapFilename(englishName);
+ Common::String wrappedName = unwrapFilename ? g_sci->wrapFilename(englishName) : englishName;
Common::SeekableReadStream *inFile = 0;
Common::WriteStream *outFile = 0;
Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
@@ -180,7 +179,7 @@ reg_t kFOpen(EngineState *s, int argc, reg_t *argv) {
int mode = argv[1].toUint16();
debugC(2, kDebugLevelFile, "kFOpen(%s,0x%x)", name.c_str(), mode);
- return file_open(s, name.c_str(), mode);
+ return file_open(s, name.c_str(), mode, true);
}
static FileHandle *getFileFromHandle(EngineState *s, uint handle) {
@@ -218,29 +217,31 @@ reg_t kFPuts(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
-static void fgets_wrapper(EngineState *s, char *dest, int maxsize, int handle) {
+static int fgets_wrapper(EngineState *s, char *dest, int maxsize, int handle) {
FileHandle *f = getFileFromHandle(s, handle);
if (!f)
- return;
+ return 0;
if (!f->_in) {
error("fgets_wrapper: Trying to read from file '%s' opened for writing", f->_name.c_str());
- return;
+ return 0;
}
+ int readBytes = 0;
if (maxsize > 1) {
memset(dest, 0, maxsize);
f->_in->readLine(dest, maxsize);
+ readBytes = strlen(dest); // FIXME: sierra sci returned byte count and didn't react on NUL characters
// The returned string must not have an ending LF
- int strSize = strlen(dest);
- if (strSize > 0) {
- if (dest[strSize - 1] == 0x0A)
- dest[strSize - 1] = 0;
+ if (readBytes > 0) {
+ if (dest[readBytes - 1] == 0x0A)
+ dest[readBytes - 1] = 0;
}
} else {
- *dest = f->_in->readByte();
+ *dest = 0;
}
debugC(2, kDebugLevelFile, " -> FGets'ed \"%s\"", dest);
+ return readBytes;
}
reg_t kFGets(EngineState *s, int argc, reg_t *argv) {
@@ -249,9 +250,9 @@ reg_t kFGets(EngineState *s, int argc, reg_t *argv) {
int handle = argv[2].toUint16();
debugC(2, kDebugLevelFile, "kFGets(%d, %d)", handle, maxsize);
- fgets_wrapper(s, buf, maxsize, handle);
+ int readBytes = fgets_wrapper(s, buf, maxsize, handle);
s->_segMan->memcpy(argv[0], (const byte*)buf, maxsize);
- return argv[0];
+ return readBytes ? argv[0] : NULL_REG;
}
/**
@@ -269,7 +270,7 @@ reg_t kGetCWD(EngineState *s, int argc, reg_t *argv) {
}
static void listSavegames(Common::Array<SavegameDesc> &saves);
-static int findSavegame(Common::Array<SavegameDesc> &saves, uint saveId);
+static int findSavegame(Common::Array<SavegameDesc> &saves, int16 saveId);
enum {
K_DEVICE_INFO_GET_DEVICE = 0,
@@ -452,7 +453,7 @@ static void listSavegames(Common::Array<SavegameDesc> &saves) {
}
// Find a savedgame according to virtualId and return the position within our array
-static int findSavegame(Common::Array<SavegameDesc> &saves, uint savegameId) {
+static int findSavegame(Common::Array<SavegameDesc> &saves, int16 savegameId) {
for (uint saveNr = 0; saveNr < saves.size(); saveNr++) {
if (saves[saveNr].id == savegameId)
return saveNr;
@@ -460,7 +461,7 @@ static int findSavegame(Common::Array<SavegameDesc> &saves, uint savegameId) {
return -1;
}
-// The scripts get IDs ranging from 1000->1999, because the scripts require us to assign unique ids THAT EVEN STAY BETWEEN
+// The scripts get IDs ranging from 100->199, because the scripts require us to assign unique ids THAT EVEN STAY BETWEEN
// SAVES and the scripts also use "saves-count + 1" to create a new savedgame slot.
// SCI1.1 actually recycles ids, in that case we will currently get "0".
// This behaviour is required especially for LSL6. In this game, it's possible to quick save. The scripts will use
@@ -548,78 +549,102 @@ reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) {
}
reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) {
- Common::String game_id = s->_segMan->getString(argv[0]);
- uint virtualId = argv[1].toUint16();
- Common::String game_description = s->_segMan->getString(argv[2]);
+ Common::String game_id;
+ int16 virtualId = argv[1].toSint16();
+ int16 savegameId = -1;
+ Common::String game_description;
Common::String version;
+
if (argc > 3)
version = s->_segMan->getString(argv[3]);
- debug(3, "kSaveGame(%s,%d,%s,%s)", game_id.c_str(), virtualId, game_description.c_str(), version.c_str());
-
// We check here, we don't want to delete a users save in case we are within a kernel function
if (s->executionStackBase) {
warning("kSaveGame - won't save from within kernel function");
return NULL_REG;
}
- Common::Array<SavegameDesc> saves;
- listSavegames(saves);
-
- uint savegameId;
- if ((virtualId >= SAVEGAMEID_OFFICIALRANGE_START) && (virtualId <= SAVEGAMEID_OFFICIALRANGE_END)) {
- // savegameId is an actual Id, so search for it just to make sure
- savegameId = virtualId - SAVEGAMEID_OFFICIALRANGE_START;
- if (findSavegame(saves, savegameId) == -1)
+ if (argv[0].isNull()) {
+ // Direct call, from a patched Game::save
+ if ((argv[1] != SIGNAL_REG) || (!argv[2].isNull()))
+ error("kSaveGame: assumed patched call isn't accurate");
+
+ // we are supposed to show a dialog for the user and let him choose where to save
+ g_sci->_soundCmd->pauseAll(true); // pause music
+ const EnginePlugin *plugin = NULL;
+ EngineMan.findGame(g_sci->getGameIdStr(), &plugin);
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Save game:", "Save");
+ dialog->setSaveMode(true);
+ savegameId = dialog->runModal(plugin, ConfMan.getActiveDomainName());
+ game_description = dialog->getResultString();
+ delete dialog;
+ g_sci->_soundCmd->pauseAll(false); // unpause music ( we can't have it paused during save)
+ if (savegameId < 0)
return NULL_REG;
- } else if (virtualId < SAVEGAMEID_OFFICIALRANGE_START) {
- // virtualId is low, we assume that scripts expect us to create new slot
- if (virtualId == s->_lastSaveVirtualId) {
- // if last virtual id is the same as this one, we assume that caller wants to overwrite last save
- savegameId = s->_lastSaveNewId;
- } else {
- uint savegameNr;
- // savegameId is in lower range, scripts expect us to create a new slot
- for (savegameId = 0; savegameId < SAVEGAMEID_OFFICIALRANGE_START; savegameId++) {
- for (savegameNr = 0; savegameNr < saves.size(); savegameNr++) {
- if (savegameId == saves[savegameNr].id)
+
+ } else {
+ // Real call from script
+ game_id = s->_segMan->getString(argv[0]);
+ if (argv[2].isNull())
+ error("kSaveGame: called with description being NULL");
+ game_description = s->_segMan->getString(argv[2]);
+
+ debug(3, "kSaveGame(%s,%d,%s,%s)", game_id.c_str(), virtualId, game_description.c_str(), version.c_str());
+
+ Common::Array<SavegameDesc> saves;
+ listSavegames(saves);
+
+ if ((virtualId >= SAVEGAMEID_OFFICIALRANGE_START) && (virtualId <= SAVEGAMEID_OFFICIALRANGE_END)) {
+ // savegameId is an actual Id, so search for it just to make sure
+ savegameId = virtualId - SAVEGAMEID_OFFICIALRANGE_START;
+ if (findSavegame(saves, savegameId) == -1)
+ return NULL_REG;
+ } else if (virtualId < SAVEGAMEID_OFFICIALRANGE_START) {
+ // virtualId is low, we assume that scripts expect us to create new slot
+ if (virtualId == s->_lastSaveVirtualId) {
+ // if last virtual id is the same as this one, we assume that caller wants to overwrite last save
+ savegameId = s->_lastSaveNewId;
+ } else {
+ uint savegameNr;
+ // savegameId is in lower range, scripts expect us to create a new slot
+ for (savegameId = 0; savegameId < SAVEGAMEID_OFFICIALRANGE_START; savegameId++) {
+ for (savegameNr = 0; savegameNr < saves.size(); savegameNr++) {
+ if (savegameId == saves[savegameNr].id)
+ break;
+ }
+ if (savegameNr == saves.size())
break;
}
- if (savegameNr == saves.size())
- break;
+ if (savegameId == SAVEGAMEID_OFFICIALRANGE_START)
+ error("kSavegame: no more savegame slots available");
}
- if (savegameId == SAVEGAMEID_OFFICIALRANGE_START)
- error("kSavegame: no more savegame slots available");
+ } else {
+ error("kSaveGame: invalid savegameId used");
}
- } else {
- error("kSaveGame: invalid savegameId used");
+
+ // Save in case caller wants to overwrite last newly created save
+ s->_lastSaveVirtualId = virtualId;
+ s->_lastSaveNewId = savegameId;
}
- // Save in case caller wants to overwrite last newly created save
- s->_lastSaveVirtualId = virtualId;
- s->_lastSaveNewId = savegameId;
+ s->r_acc = NULL_REG;
Common::String filename = g_sci->getSavegameName(savegameId);
Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
Common::OutSaveFile *out;
if (!(out = saveFileMan->openForSaving(filename))) {
warning("Error opening savegame \"%s\" for writing", filename.c_str());
- s->r_acc = NULL_REG;
- return NULL_REG;
- }
-
- if (!gamestate_save(s, out, game_description.c_str(), version.c_str())) {
- warning("Saving the game failed.");
- s->r_acc = NULL_REG;
} else {
- out->finalize();
- if (out->err()) {
- delete out;
- warning("Writing the savegame failed.");
- s->r_acc = NULL_REG;
+ if (!gamestate_save(s, out, game_description.c_str(), version.c_str())) {
+ warning("Saving the game failed.");
} else {
+ out->finalize();
+ if (out->err()) {
+ warning("Writing the savegame failed.");
+ } else {
+ s->r_acc = TRUE_REG; // success
+ }
delete out;
- s->r_acc = make_reg(0, 1);
}
}
@@ -628,41 +653,75 @@ reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) {
reg_t kRestoreGame(EngineState *s, int argc, reg_t *argv) {
Common::String game_id = !argv[0].isNull() ? s->_segMan->getString(argv[0]) : "";
- uint savegameId = argv[1].toUint16();
+ int16 savegameId = argv[1].toSint16();
+ bool pausedMusic = false;
debug(3, "kRestoreGame(%s,%d)", game_id.c_str(), savegameId);
if (argv[0].isNull()) {
- // Loading from the launcher, don't adjust the ID of the saved game
+ // Direct call, either from launcher or from a patched Game::restore
+ if (savegameId == -1) {
+ // we are supposed to show a dialog for the user and let him choose a saved game
+ g_sci->_soundCmd->pauseAll(true); // pause music
+ const EnginePlugin *plugin = NULL;
+ EngineMan.findGame(g_sci->getGameIdStr(), &plugin);
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Restore game:", "Restore");
+ dialog->setSaveMode(false);
+ savegameId = dialog->runModal(plugin, ConfMan.getActiveDomainName());
+ delete dialog;
+ if (savegameId < 0) {
+ g_sci->_soundCmd->pauseAll(false); // unpause music
+ return s->r_acc;
+ }
+ pausedMusic = true;
+ }
+ // don't adjust ID of the saved game, it's already correct
} else {
- if ((savegameId < 1000) || (savegameId > 1999)) {
+ if (argv[2].isNull())
+ error("kRestoreGame: called with parameter 2 being NULL");
+ // Real call from script, we need to adjust ID
+ if ((savegameId < SAVEGAMEID_OFFICIALRANGE_START) || (savegameId > SAVEGAMEID_OFFICIALRANGE_END)) {
warning("Savegame ID %d is not allowed", savegameId);
return TRUE_REG;
}
- savegameId -= 1000;
+ savegameId -= SAVEGAMEID_OFFICIALRANGE_START;
}
+ s->r_acc = NULL_REG; // signals success
+
Common::Array<SavegameDesc> saves;
listSavegames(saves);
if (findSavegame(saves, savegameId) == -1) {
+ s->r_acc = TRUE_REG;
warning("Savegame ID %d not found", savegameId);
- return TRUE_REG;
- }
-
- Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
- Common::String filename = g_sci->getSavegameName(savegameId);
- Common::SeekableReadStream *in;
- if ((in = saveFileMan->openForLoading(filename))) {
- // found a savegame file
+ } else {
+ Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
+ Common::String filename = g_sci->getSavegameName(savegameId);
+ Common::SeekableReadStream *in;
+ if ((in = saveFileMan->openForLoading(filename))) {
+ // found a savegame file
- gamestate_restore(s, in);
- delete in;
+ gamestate_restore(s, in);
+ delete in;
- return s->r_acc;
+ if (g_sci->getGameId() == GID_MOTHERGOOSE256) {
+ // WORKAROUND: Mother Goose SCI1/SCI1.1 does some weird things for
+ // saving a previously restored game.
+ // We set the current savedgame-id directly and remove the script
+ // code concerning this via script patch.
+ s->variables[VAR_GLOBAL][0xB3].offset = SAVEGAMEID_OFFICIALRANGE_START + savegameId;
+ }
+ } else {
+ s->r_acc = TRUE_REG;
+ warning("Savegame #%d not found", savegameId);
+ }
}
- s->r_acc = TRUE_REG;
- warning("Savegame #%d not found", savegameId);
+ if (!s->r_acc.isNull()) {
+ // no success?
+ if (pausedMusic)
+ g_sci->_soundCmd->pauseAll(false); // unpause music
+ }
return s->r_acc;
}
@@ -676,45 +735,6 @@ reg_t kValidPath(EngineState *s, int argc, reg_t *argv) {
return make_reg(0, 1);
}
-reg_t DirSeeker::firstFile(const Common::String &mask, reg_t buffer, SegManager *segMan) {
- // Verify that we are given a valid buffer
- if (!buffer.segment) {
- error("DirSeeker::firstFile('%s') invoked with invalid buffer", mask.c_str());
- return NULL_REG;
- }
- _outbuffer = buffer;
-
- // Prefix the mask
- const Common::String wrappedMask = g_sci->wrapFilename(mask);
-
- // Obtain a list of all savefiles matching the given mask
- Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
- _savefiles = saveFileMan->listSavefiles(wrappedMask);
-
- // Reset the list iterator and write the first match to the output buffer,
- // if any.
- _iter = _savefiles.begin();
- return nextFile(segMan);
-}
-
-reg_t DirSeeker::nextFile(SegManager *segMan) {
- if (_iter == _savefiles.end()) {
- return NULL_REG;
- }
-
- const Common::String wrappedString = *_iter;
-
- // Strip the prefix
- Common::String string = g_sci->unwrapFilename(wrappedString);
- if (string.size() > 12)
- string = Common::String(string.c_str(), 12);
- segMan->strcpy(_outbuffer, string.c_str());
-
- // Return the result and advance the list iterator :)
- ++_iter;
- return _outbuffer;
-}
-
reg_t kFileIO(EngineState *s, int argc, reg_t *argv) {
if (!s)
return make_reg(0, getSciVersion());
@@ -727,6 +747,7 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) {
// SCI32 can call K_FILEIO_OPEN with only one argument. It seems to
// just be checking if it exists.
int mode = (argc < 2) ? (int)_K_FILE_MODE_OPEN_OR_FAIL : argv[1].toUint16();
+ bool unwrapFilename = true;
// SQ4 floppy prepends /\ to the filenames
if (name.hasPrefix("/\\")) {
@@ -744,11 +765,21 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) {
}
if (name.empty()) {
- warning("Attempted to open a file with an empty filename");
+ // Happens many times during KQ1 (e.g. when typing something)
+ debugC(2, kDebugLevelFile, "Attempted to open a file with an empty filename");
return SIGNAL_REG;
}
debugC(2, kDebugLevelFile, "kFileIO(open): %s, 0x%x", name.c_str(), mode);
- return file_open(s, name.c_str(), mode);
+
+ // QFG import rooms get a virtual filelisting instead of an actual one
+ if (g_sci->inQfGImportRoom()) {
+ // we need to find out what the user actually selected, "savedHeroes" is already destroyed
+ // when we get here. That's why we need to remember selection via kDrawControl
+ name = s->_dirseeker.getVirtualFilename(s->_chosenQfGImportItem);
+ unwrapFilename = false;
+ }
+
+ return file_open(s, name.c_str(), mode, unwrapFilename);
}
reg_t kFileIOClose(EngineState *s, int argc, reg_t *argv) {
@@ -840,10 +871,10 @@ reg_t kFileIOReadString(EngineState *s, int argc, reg_t *argv) {
int handle = argv[2].toUint16();
debugC(2, kDebugLevelFile, "kFileIO(readString): %d, %d", handle, size);
- fgets_wrapper(s, buf, size, handle);
+ int readBytes = fgets_wrapper(s, buf, size, handle);
s->_segMan->memcpy(argv[0], (const byte*)buf, size);
delete[] buf;
- return argv[0];
+ return readBytes ? argv[0] : NULL_REG;
}
reg_t kFileIOWriteString(EngineState *s, int argc, reg_t *argv) {
@@ -852,9 +883,12 @@ reg_t kFileIOWriteString(EngineState *s, int argc, reg_t *argv) {
debugC(2, kDebugLevelFile, "kFileIO(writeString): %d", handle);
FileHandle *f = getFileFromHandle(s, handle);
- if (f)
+
+ if (f) {
f->_out->write(str.c_str(), str.size());
return NULL_REG;
+ }
+
return make_reg(0, 6); // DOS - invalid handle
}
@@ -865,23 +899,117 @@ reg_t kFileIOSeek(EngineState *s, int argc, reg_t *argv) {
debugC(2, kDebugLevelFile, "kFileIO(seek): %d, %d, %d", handle, offset, whence);
FileHandle *f = getFileFromHandle(s, handle);
+
if (f)
s->r_acc = make_reg(0, f->_in->seek(offset, whence));
+
return SIGNAL_REG;
}
+void DirSeeker::addAsVirtualFiles(Common::String title, Common::String fileMask) {
+ Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
+ Common::StringArray foundFiles = saveFileMan->listSavefiles(fileMask);
+ if (!foundFiles.empty()) {
+ _files.push_back(title);
+ _virtualFiles.push_back("");
+ Common::StringArray::iterator it;
+ Common::StringArray::iterator it_end = foundFiles.end();
+
+ for (it = foundFiles.begin(); it != it_end; it++) {
+ Common::String regularFilename = *it;
+ Common::String wrappedFilename = Common::String(regularFilename.c_str() + fileMask.size() - 1);
+
+ Common::SeekableReadStream *testfile = saveFileMan->openForLoading(regularFilename);
+ int32 testfileSize = testfile->size();
+ delete testfile;
+ if (testfileSize > 1024) // check, if larger than 1k. in that case its a saved game.
+ continue; // and we dont want to have those in the list
+ // We need to remove the prefix for display purposes
+ _files.push_back(wrappedFilename);
+ // but remember the actual name as well
+ _virtualFiles.push_back(regularFilename);
+ }
+ }
+}
+
+Common::String DirSeeker::getVirtualFilename(uint fileNumber) {
+ if (fileNumber >= _virtualFiles.size())
+ error("invalid virtual filename access");
+ return _virtualFiles[fileNumber];
+}
+
+reg_t DirSeeker::firstFile(const Common::String &mask, reg_t buffer, SegManager *segMan) {
+ // Verify that we are given a valid buffer
+ if (!buffer.segment) {
+ error("DirSeeker::firstFile('%s') invoked with invalid buffer", mask.c_str());
+ return NULL_REG;
+ }
+ _outbuffer = buffer;
+ _files.clear();
+ _virtualFiles.clear();
+
+ int QfGImport = g_sci->inQfGImportRoom();
+ if (QfGImport) {
+ _files.clear();
+ addAsVirtualFiles("-QfG1-", "qfg1-*");
+ addAsVirtualFiles("-QfG1VGA-", "qfg1vga-*");
+ if (QfGImport > 2)
+ addAsVirtualFiles("-QfG2-", "qfg2-*");
+ if (QfGImport > 3)
+ addAsVirtualFiles("-QfG3-", "qfg3-*");
+
+ if (QfGImport == 3) {
+ // QfG3 sorts the filelisting itself, we can't let that happen otherwise our
+ // virtual list would go out-of-sync
+ reg_t savedHeros = segMan->findObjectByName("savedHeros");
+ if (!savedHeros.isNull())
+ writeSelectorValue(segMan, savedHeros, SELECTOR(sort), 0);
+ }
+
+ } else {
+ // Prefix the mask
+ const Common::String wrappedMask = g_sci->wrapFilename(mask);
+
+ // Obtain a list of all files matching the given mask
+ Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
+ _files = saveFileMan->listSavefiles(wrappedMask);
+ }
+
+ // Reset the list iterator and write the first match to the output buffer,
+ // if any.
+ _iter = _files.begin();
+ return nextFile(segMan);
+}
+
+reg_t DirSeeker::nextFile(SegManager *segMan) {
+ if (_iter == _files.end()) {
+ return NULL_REG;
+ }
+
+ Common::String string;
+
+ if (_virtualFiles.empty()) {
+ // Strip the prefix, if we don't got a virtual filelisting
+ const Common::String wrappedString = *_iter;
+ string = g_sci->unwrapFilename(wrappedString);
+ } else {
+ string = *_iter;
+ }
+ if (string.size() > 12)
+ string = Common::String(string.c_str(), 12);
+ segMan->strcpy(_outbuffer, string.c_str());
+
+ // Return the result and advance the list iterator :)
+ ++_iter;
+ return _outbuffer;
+}
+
reg_t kFileIOFindFirst(EngineState *s, int argc, reg_t *argv) {
Common::String mask = s->_segMan->getString(argv[0]);
reg_t buf = argv[1];
int attr = argv[2].toUint16(); // We won't use this, Win32 might, though...
debugC(2, kDebugLevelFile, "kFileIO(findFirst): %s, 0x%x", mask.c_str(), attr);
- // QfG3 uses "/\*.*" for the character import, QfG4 uses "/\*"
- if (mask.hasPrefix("/\\")) {
- mask.deleteChar(0);
- mask.deleteChar(0);
- }
-
// We remove ".*". mask will get prefixed, so we will return all additional files for that gameid
if (mask == "*.*")
mask = "*";
@@ -960,7 +1088,7 @@ reg_t kFileIOWriteByte(EngineState *s, int argc, reg_t *argv) {
FileHandle *f = getFileFromHandle(s, argv[0].toUint16());
if (f)
f->_out->writeByte(argv[1].toUint16() & 0xff);
- return s->r_acc; // FIXME: does this really doesn't return anything?
+ return s->r_acc; // FIXME: does this really not return anything?
}
reg_t kFileIOReadWord(EngineState *s, int argc, reg_t *argv) {
@@ -974,7 +1102,7 @@ reg_t kFileIOWriteWord(EngineState *s, int argc, reg_t *argv) {
FileHandle *f = getFileFromHandle(s, argv[0].toUint16());
if (f)
f->_out->writeUint16LE(argv[1].toUint16());
- return s->r_acc; // FIXME: does this really doesn't return anything?
+ return s->r_acc; // FIXME: does this really not return anything?
}
reg_t kCD(EngineState *s, int argc, reg_t *argv) {
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index e1e92b1cf9..02891dde9e 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -57,48 +57,46 @@
namespace Sci {
-void _k_dirloop(reg_t object, uint16 angle, EngineState *s, int argc, reg_t *argv) {
+void showScummVMDialog(const Common::String &message) {
+ GUI::MessageDialog dialog(message, "OK");
+ dialog.runModal();
+}
+
+void kDirLoopWorker(reg_t object, uint16 angle, EngineState *s, int argc, reg_t *argv) {
GuiResourceId viewId = readSelectorValue(s->_segMan, object, SELECTOR(view));
uint16 signal = readSelectorValue(s->_segMan, object, SELECTOR(signal));
- int16 loopNo;
- int16 maxLoops;
- bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
if (signal & kSignalDoesntTurn)
return;
- angle %= 360;
-
- if (!oldScriptHeader) {
- if (angle < 45)
- loopNo = 3;
- else if (angle < 136)
- loopNo = 0;
- else if (angle < 225)
- loopNo = 2;
- else if (angle < 316)
- loopNo = 1;
- else
- loopNo = 3;
+ int16 useLoop = -1;
+ if (getSciVersion() > SCI_VERSION_0_EARLY) {
+ if ((angle > 315) || (angle < 45)) {
+ useLoop = 3;
+ } else if ((angle > 135) && (angle < 225)) {
+ useLoop = 2;
+ }
} else {
- if (angle >= 330 || angle <= 30)
- loopNo = 3;
- else if (angle <= 150)
- loopNo = 0;
- else if (angle <= 210)
- loopNo = 2;
- else if (angle < 330)
- loopNo = 1;
- else loopNo = -1;
+ // SCI0EARLY
+ if ((angle > 330) || (angle < 30)) {
+ useLoop = 3;
+ } else if ((angle > 150) && (angle < 210)) {
+ useLoop = 2;
+ }
+ }
+ if (useLoop == -1) {
+ if (angle >= 180) {
+ useLoop = 1;
+ } else {
+ useLoop = 0;
+ }
+ } else {
+ int16 loopCount = g_sci->_gfxCache->kernelViewGetLoopCount(viewId);
+ if (loopCount < 4)
+ return;
}
- maxLoops = g_sci->_gfxCache->kernelViewGetLoopCount(viewId);
-
-
- if ((loopNo > 1) && (maxLoops < 4))
- return;
-
- writeSelectorValue(s->_segMan, object, SELECTOR(loop), loopNo);
+ writeSelectorValue(s->_segMan, object, SELECTOR(loop), useLoop);
}
static reg_t kSetCursorSci0(EngineState *s, int argc, reg_t *argv) {
@@ -264,7 +262,9 @@ reg_t kGraphDrawLine(EngineState *s, int argc, reg_t *argv) {
int16 priority = (argc > 5) ? argv[5].toSint16() : -1;
int16 control = (argc > 6) ? argv[6].toSint16() : -1;
- // TODO: Find out why we get >15 for color in EGA
+ // TODO: Find out why we get > 15 for color in EGA
+ // FIXME: EGA? Which EGA? SCI0 or SCI1? Check the
+ // workarounds inside kGraphFillBoxAny and kNewWindow
if (!g_sci->getResMan()->isVGA() && !g_sci->getResMan()->isAmiga32color())
color &= 0x0F;
@@ -300,8 +300,15 @@ reg_t kGraphFillBoxAny(EngineState *s, int argc, reg_t *argv) {
Common::Rect rect = getGraphRect(argv);
int16 colorMask = argv[4].toUint16();
int16 color = argv[5].toSint16();
- int16 priority = (argc > 6) ? argv[6].toSint16() : -1;
- int16 control = (argc > 7) ? argv[7].toSint16() : -1;
+ int16 priority = argv[6].toSint16(); // yes, we may read from stack sometimes here
+ int16 control = argv[7].toSint16(); // sierra did the same
+
+ // WORKAROUND: PQ3 EGA is setting invalid colors (above 0 - 15).
+ // Colors above 15 are all white in SCI1 EGA games, which is why this was never
+ // observed. We clip them all to (0, 15) instead, as colors above 15 are used
+ // for the undithering algorithm in EGA games - bug #3048908.
+ if (g_sci->getResMan()->getViewType() == kViewEga && getSciVersion() >= SCI_VERSION_1_EARLY)
+ color &= 0x0F;
g_sci->_gfxPaint16->kernelGraphFillBox(rect, colorMask, color, priority, control);
return s->r_acc;
@@ -397,7 +404,7 @@ reg_t kPriCoord(EngineState *s, int argc, reg_t *argv) {
}
reg_t kDirLoop(EngineState *s, int argc, reg_t *argv) {
- _k_dirloop(argv[0], argv[1].toUint16(), s, argc, argv);
+ kDirLoopWorker(argv[0], argv[1].toUint16(), s, argc, argv);
return s->r_acc;
}
@@ -922,16 +929,15 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) {
if (!changeDirButton.isNull()) {
// check if checkDirButton is still enabled, in that case we are called the first time during that room
if (!(readSelectorValue(s->_segMan, changeDirButton, SELECTOR(state)) & SCI_CONTROLS_STYLE_DISABLED)) {
- GUI::MessageDialog dialog("Characters saved inside ScummVM are shown "
+ showScummVMDialog("Characters saved inside ScummVM are shown "
"automatically. Character files saved in the original "
"interpreter need to be put inside ScummVM's saved games "
"directory and a prefix needs to be added depending on which "
"game it was saved in: 'qfg1-' for Quest for Glory 1, 'qfg2-' "
- "for Quest for Glory 2. Example: 'qfg2-thief.sav'.",
- "OK");
- dialog.runModal();
+ "for Quest for Glory 2. Example: 'qfg2-thief.sav'.");
}
}
+ s->_chosenQfGImportItem = readSelectorValue(s->_segMan, controlObject, SELECTOR(mark));
}
_k_GenericDrawControl(s, controlObject, false);
@@ -1078,6 +1084,15 @@ reg_t kNewWindow(EngineState *s, int argc, reg_t *argv) {
int colorPen = (argc > 7 + argextra) ? argv[7 + argextra].toSint16() : 0;
int colorBack = (argc > 8 + argextra) ? argv[8 + argextra].toSint16() : 255;
+ // WORKAROUND: PQ3 EGA is setting invalid colors (above 0 - 15).
+ // Colors above 15 are all white in SCI1 EGA games, which is why this was never
+ // observed. We clip them all to (0, 15) instead, as colors above 15 are used
+ // for the undithering algorithm in EGA games - bug #3048908.
+ if (g_sci->getResMan()->getViewType() == kViewEga && getSciVersion() >= SCI_VERSION_1_EARLY) {
+ colorPen &= 0x0F;
+ colorBack &= 0x0F;
+ }
+
// const char *title = argv[4 + argextra].segment ? kernel_dereference_char_pointer(s, argv[4 + argextra], 0) : NULL;
if (argc>=13) {
rect2 = Common::Rect (argv[5].toSint16(), argv[4].toSint16(), argv[7].toSint16(), argv[6].toSint16());
@@ -1152,6 +1167,30 @@ reg_t kTextColors(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
+/**
+ * Debug command, used by the SCI builtin debugger
+ */
+reg_t kShow(EngineState *s, int argc, reg_t *argv) {
+ uint16 map = argv[0].toUint16();
+
+ switch (map) {
+ case 1: // Visual, substituted by display for us
+ g_sci->_gfxScreen->debugShowMap(3);
+ break;
+ case 2: // Priority
+ g_sci->_gfxScreen->debugShowMap(1);
+ break;
+ case 3: // Control
+ case 4: // Control
+ g_sci->_gfxScreen->debugShowMap(2);
+ break;
+ default:
+ warning("Map %d is not available", map);
+ }
+
+ return s->r_acc;
+}
+
#ifdef ENABLE_SCI32
reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv) {
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp
index 93e95099f5..2188087b8c 100644
--- a/engines/sci/engine/klists.cpp
+++ b/engines/sci/engine/klists.cpp
@@ -40,6 +40,9 @@ static bool isSaneNodePointer(SegManager *segMan, reg_t addr) {
if ((g_sci->getGameId() == GID_ICEMAN) && (g_sci->getEngineState()->currentRoomNumber() == 40)) {
// ICEMAN: when plotting course, unDrawLast is called by startPlot::changeState
// there is no previous entry so we get 0 in here
+ } else if ((g_sci->getGameId() == GID_HOYLE1) && (g_sci->getEngineState()->currentRoomNumber() == 3)) {
+ // HOYLE1: after sorting cards in hearts, in the next round
+ // we get an invalid node - bug #3038433
} else {
error("isSaneNodePointer: Node at %04x:%04x wasn't found", PRINT_REG(addr));
}
diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp
index f3769b653b..792181b832 100644
--- a/engines/sci/engine/kmath.cpp
+++ b/engines/sci/engine/kmath.cpp
@@ -35,19 +35,21 @@ reg_t kRandom(EngineState *s, int argc, reg_t *argv) {
return NULL_REG;
case 2: { // get random number
- int fromNumber = argv[0].toUint16();
- int toNumber = argv[1].toUint16();
-
- // TODO/CHECKME: It is propbably not required to check whether
- // toNumber is greater than fromNumber, at least not when one
- // goes by their names, but let us be on the safe side and
- // allow toNumber to be smaller than fromNumber too.
- if (fromNumber > toNumber)
- SWAP(fromNumber, toNumber);
-
- const uint diff = (uint)(toNumber - fromNumber);
-
- const int randomNumber = fromNumber + (int)g_sci->getRNG().getRandomNumber(diff);
+ // numbers are definitely unsigned, for example lsl5 door code in k rap radio is random
+ // and 5-digit - we get called kRandom(10000, 65000)
+ // some codes in sq4 are also random and 5 digit (if i remember correctly)
+ const uint16 fromNumber = argv[0].toUint16();
+ const uint16 toNumber = argv[1].toUint16();
+ uint16 range = toNumber - fromNumber + 1;
+ // calculating range is exactly how sierra sci did it and is required for hoyle 4
+ // where we get called with kRandom(0, -1) and we are supposed to give back values from 0 to 0
+ // the returned value will be used as displace-offset for a background cel
+ // note: i assume that the hoyle4 code is actually buggy and it was never fixed because of
+ // the way sierra sci handled it - "it just worked". It should have called kRandom(0, 0)
+ if (range)
+ range--; // the range value was never returned, our random generator gets 0->range, so fix it
+
+ const int randomNumber = fromNumber + (int)g_sci->getRNG().getRandomNumber(range);
return make_reg(0, randomNumber);
}
@@ -63,37 +65,31 @@ reg_t kRandom(EngineState *s, int argc, reg_t *argv) {
}
reg_t kAbs(EngineState *s, int argc, reg_t *argv) {
- return make_reg(0, abs(argv[0].toSint16()));
+ return make_reg(0, ABS(argv[0].toSint16()));
}
reg_t kSqrt(EngineState *s, int argc, reg_t *argv) {
- return make_reg(0, (int16) sqrt((float) abs(argv[0].toSint16())));
+ return make_reg(0, (int16) sqrt((float) ABS(argv[0].toSint16())));
}
-reg_t kGetAngle(EngineState *s, int argc, reg_t *argv) {
- // Based on behavior observed with a test program created with
- // SCI Studio.
- int x1 = argv[0].toSint16();
- int y1 = argv[1].toSint16();
- int x2 = argv[2].toSint16();
- int y2 = argv[3].toSint16();
- int xrel = x2 - x1;
- int yrel = y1 - y2; // y-axis is mirrored.
- int angle;
+uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) {
+ int16 xRel = x2 - x1;
+ int16 yRel = y1 - y2; // y-axis is mirrored.
+ int16 angle;
// Move (xrel, yrel) to first quadrant.
if (y1 < y2)
- yrel = -yrel;
+ yRel = -yRel;
if (x2 < x1)
- xrel = -xrel;
+ xRel = -xRel;
// Compute angle in grads.
- if (yrel == 0 && xrel == 0)
- angle = 0;
+ if (yRel == 0 && xRel == 0)
+ return 0;
else
- angle = 100 * xrel / (xrel + yrel);
+ angle = 100 * xRel / (xRel + yRel);
- // Fix up angle for actual quadrant of (xrel, yrel).
+ // Fix up angle for actual quadrant of (xRel, yRel).
if (y1 < y2)
angle = 200 - angle;
if (x2 < x1)
@@ -103,8 +99,18 @@ reg_t kGetAngle(EngineState *s, int argc, reg_t *argv) {
// grad 10 with grad 11, grad 20 with grad 21, etc. This leads to
// "degrees" that equal either one or two grads.
angle -= (angle + 9) / 10;
+ return angle;
+}
+
+reg_t kGetAngle(EngineState *s, int argc, reg_t *argv) {
+ // Based on behavior observed with a test program created with
+ // SCI Studio.
+ int x1 = argv[0].toSint16();
+ int y1 = argv[1].toSint16();
+ int x2 = argv[2].toSint16();
+ int y2 = argv[3].toSint16();
- return make_reg(0, angle);
+ return make_reg(0, kGetAngleWorker(x1, y1, x2, y2));
}
reg_t kGetDistance(EngineState *s, int argc, reg_t *argv) {
diff --git a/engines/sci/engine/kmenu.cpp b/engines/sci/engine/kmenu.cpp
index c8a6e03556..428c27ca73 100644
--- a/engines/sci/engine/kmenu.cpp
+++ b/engines/sci/engine/kmenu.cpp
@@ -46,12 +46,13 @@ reg_t kSetMenu(EngineState *s, int argc, reg_t *argv) {
uint16 itemId = argv[0].toUint16() & 0xFF;
uint16 attributeId;
int argPos = 1;
+ reg_t value;
while (argPos < argc) {
attributeId = argv[argPos].toUint16();
- if ((argPos + 1) >= argc)
- error("Too few parameters for kSetMenu");
- g_sci->_gfxMenu->kernelSetAttribute(menuId, itemId, attributeId, argv[argPos + 1]);
+ // Happens in the fanmade game Cascade Quest when loading - bug #3038767
+ value = (argPos + 1 < argc) ? argv[argPos + 1] : NULL_REG;
+ g_sci->_gfxMenu->kernelSetAttribute(menuId, itemId, attributeId, value);
argPos += 2;
}
return s->r_acc;
@@ -76,6 +77,11 @@ reg_t kDrawStatus(EngineState *s, int argc, reg_t *argv) {
// Sometimes this is called without giving text, if thats the case dont process it.
text = s->_segMan->getString(textReference);
+ if (text == "Replaying sound") {
+ // Happens in the fanmade game Cascade Quest when loading - ignore it
+ return s->r_acc;
+ }
+
g_sci->_gfxMenu->kernelDrawStatus(g_sci->strSplit(text.c_str(), NULL).c_str(), colorPen, colorBack);
}
return s->r_acc;
diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp
index 5c23539bf8..db54705694 100644
--- a/engines/sci/engine/kmovement.cpp
+++ b/engines/sci/engine/kmovement.cpp
@@ -86,7 +86,7 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) {
int vy = 0; // y velocity
int dxWasNegative = (dx < 0);
- dx = abs(dx);
+ dx = ABS(dx);
assert(gy >= 0);
@@ -104,8 +104,8 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) {
// we ensure vx will be less than sqrt(gy * dx)).
if (dx + dy < 0) {
// dy is negative and |dy| > |dx|
- c = (2 * abs(dy)) / dx;
- //tmp = abs(dy); // ALMOST the resulting value, except for obvious rounding issues
+ c = (2 * ABS(dy)) / dx;
+ //tmp = ABS(dy); // ALMOST the resulting value, except for obvious rounding issues
} else {
// dy is either positive, or |dy| <= |dx|
c = (dx * 3 / 2 - dy) / dx;
@@ -122,14 +122,14 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) {
}
// POST: c >= 1
tmp = c * dx + dy;
- // POST: (dx != 0) ==> abs(tmp) > abs(dx)
- // POST: (dx != 0) ==> abs(tmp) ~>=~ abs(dy)
+ // POST: (dx != 0) ==> ABS(tmp) > ABS(dx)
+ // POST: (dx != 0) ==> ABS(tmp) ~>=~ ABS(dy)
debugC(2, kDebugLevelBresen, "c: %d, tmp: %d", c, tmp);
// Compute x step
if (tmp != 0)
- vx = (int)(dx * sqrt(gy / (2.0 * tmp)));
+ vx = (int16)((float)(dx * sqrt(gy / (2.0 * tmp))));
else
vx = 0;
@@ -145,7 +145,7 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) {
// FIXME: This choice of vy makes t roughly (2+sqrt(2))/gy * sqrt(dy);
// so if gy==3, then t is roughly sqrt(dy)...
- vy = (int)sqrt((double)gy * abs(2 * dy)) + 1;
+ vy = (int)sqrt((float)gy * ABS(2 * dy)) + 1;
} else {
// As stated above, the vertical direction is correlated to the horizontal by the
// (non-zero) factor c.
@@ -155,7 +155,7 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) {
}
// Always force vy to be upwards
- vy = -abs(vy);
+ vy = -ABS(vy);
debugC(2, kDebugLevelBresen, "SetJump for object at %04x:%04x", PRINT_REG(object));
debugC(2, kDebugLevelBresen, "xStep: %d, yStep: %d", vx, vy);
@@ -166,230 +166,345 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
-#define _K_BRESEN_AXIS_X 0
-#define _K_BRESEN_AXIS_Y 1
-
-static void initialize_bresen(SegManager *segMan, int argc, reg_t *argv, reg_t mover, int step_factor, int deltax, int deltay) {
- reg_t client = readSelector(segMan, mover, SELECTOR(client));
- int stepx = (int16)readSelectorValue(segMan, client, SELECTOR(xStep)) * step_factor;
- int stepy = (int16)readSelectorValue(segMan, client, SELECTOR(yStep)) * step_factor;
- int numsteps_x = stepx ? (abs(deltax) + stepx - 1) / stepx : 0;
- int numsteps_y = stepy ? (abs(deltay) + stepy - 1) / stepy : 0;
- int bdi, i1;
- int numsteps;
- int deltax_step;
- int deltay_step;
-
- if (numsteps_x > numsteps_y) {
- numsteps = numsteps_x;
- deltax_step = (deltax < 0) ? -stepx : stepx;
- deltay_step = numsteps ? deltay / numsteps : deltay;
- } else { // numsteps_x <= numsteps_y
- numsteps = numsteps_y;
- deltay_step = (deltay < 0) ? -stepy : stepy;
- deltax_step = numsteps ? deltax / numsteps : deltax;
- }
-
-/* if (abs(deltax) > abs(deltay)) {*/ // Bresenham on y
- if (numsteps_y < numsteps_x) {
-
- writeSelectorValue(segMan, mover, SELECTOR(b_xAxis), _K_BRESEN_AXIS_Y);
- writeSelectorValue(segMan, mover, SELECTOR(b_incr), (deltay < 0) ? -1 : 1);
- //i1 = 2 * (abs(deltay) - abs(deltay_step * numsteps)) * abs(deltax_step);
- //bdi = -abs(deltax);
- i1 = 2 * (abs(deltay) - abs(deltay_step * (numsteps - 1))) * abs(deltax_step);
- bdi = -abs(deltax);
- } else { // Bresenham on x
- writeSelectorValue(segMan, mover, SELECTOR(b_xAxis), _K_BRESEN_AXIS_X);
- writeSelectorValue(segMan, mover, SELECTOR(b_incr), (deltax < 0) ? -1 : 1);
- //i1= 2 * (abs(deltax) - abs(deltax_step * numsteps)) * abs(deltay_step);
- //bdi = -abs(deltay);
- i1 = 2 * (abs(deltax) - abs(deltax_step * (numsteps - 1))) * abs(deltay_step);
- bdi = -abs(deltay);
-
- }
-
- writeSelectorValue(segMan, mover, SELECTOR(dx), deltax_step);
- writeSelectorValue(segMan, mover, SELECTOR(dy), deltay_step);
-
- debugC(2, kDebugLevelBresen, "Init bresen for mover %04x:%04x: d=(%d,%d)", PRINT_REG(mover), deltax, deltay);
- debugC(2, kDebugLevelBresen, " steps=%d, mv=(%d, %d), i1= %d, i2=%d",
- numsteps, deltax_step, deltay_step, i1, bdi*2);
-
- //writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), numsteps); // Needed for HQ1/Ogre?
- writeSelectorValue(segMan, mover, SELECTOR(b_di), bdi);
- writeSelectorValue(segMan, mover, SELECTOR(b_i1), i1);
- writeSelectorValue(segMan, mover, SELECTOR(b_i2), bdi * 2);
-}
-
reg_t kInitBresen(EngineState *s, int argc, reg_t *argv) {
SegManager *segMan = s->_segMan;
reg_t mover = argv[0];
reg_t client = readSelector(segMan, mover, SELECTOR(client));
+ int16 stepFactor = (argc >= 2) ? argv[1].toUint16() : 1;
+ int16 mover_x = readSelectorValue(segMan, mover, SELECTOR(x));
+ int16 mover_y = readSelectorValue(segMan, mover, SELECTOR(y));
+ int16 client_xStep = readSelectorValue(segMan, client, SELECTOR(xStep)) * stepFactor;
+ int16 client_yStep = readSelectorValue(segMan, client, SELECTOR(yStep)) * stepFactor;
+
+ int16 client_step;
+ if (client_xStep < client_yStep)
+ client_step = client_yStep * 2;
+ else
+ client_step = client_xStep * 2;
+
+ int16 deltaX = mover_x - readSelectorValue(segMan, client, SELECTOR(x));
+ int16 deltaY = mover_y - readSelectorValue(segMan, client, SELECTOR(y));
+ int16 mover_dx = 0;
+ int16 mover_dy = 0;
+ int16 mover_i1 = 0;
+ int16 mover_i2 = 0;
+ int16 mover_di = 0;
+ int16 mover_incr = 0;
+ int16 mover_xAxis = 0;
+
+ while (1) {
+ mover_dx = client_xStep;
+ mover_dy = client_yStep;
+ mover_incr = 1;
+
+ if (ABS(deltaX) >= ABS(deltaY)) {
+ mover_xAxis = 1;
+ if (deltaX < 0)
+ mover_dx = -mover_dx;
+ mover_dy = deltaX ? mover_dx * deltaY / deltaX : 0;
+ mover_i1 = ((mover_dx * deltaY) - (mover_dy * deltaX)) * 2;
+ if (deltaY < 0) {
+ mover_incr = -1;
+ mover_i1 = -mover_i1;
+ }
+ mover_i2 = mover_i1 - (deltaX * 2);
+ mover_di = mover_i1 - deltaX;
+ if (deltaX < 0) {
+ mover_i1 = -mover_i1;
+ mover_i2 = -mover_i2;
+ mover_di = -mover_di;
+ }
+ } else {
+ mover_xAxis = 0;
+ if (deltaY < 0)
+ mover_dy = -mover_dy;
+ mover_dx = deltaY ? mover_dy * deltaX / deltaY : 0;
+ mover_i1 = ((mover_dy * deltaX) - (mover_dx * deltaY)) * 2;
+ if (deltaX < 0) {
+ mover_incr = -1;
+ mover_i1 = -mover_i1;
+ }
+ mover_i2 = mover_i1 - (deltaY * 2);
+ mover_di = mover_i1 - deltaY;
+ if (deltaY < 0) {
+ mover_i1 = -mover_i1;
+ mover_i2 = -mover_i2;
+ mover_di = -mover_di;
+ }
+ break;
+ }
+ if (client_xStep <= client_yStep)
+ break;
+ if (!client_xStep)
+ break;
+ if (client_yStep >= ABS(mover_dy + mover_incr))
+ break;
+
+ client_step--;
+ if (!client_step)
+ error("kInitBresen failed");
+ client_xStep--;
+ }
- int deltax = (int16)readSelectorValue(segMan, mover, SELECTOR(x)) - (int16)readSelectorValue(segMan, client, SELECTOR(x));
- int deltay = (int16)readSelectorValue(segMan, mover, SELECTOR(y)) - (int16)readSelectorValue(segMan, client, SELECTOR(y));
- int step_factor = (argc < 1) ? argv[1].toUint16() : 1;
-
- initialize_bresen(s->_segMan, argc, argv, mover, step_factor, deltax, deltay);
-
+ // set mover
+ writeSelectorValue(segMan, mover, SELECTOR(dx), mover_dx);
+ writeSelectorValue(segMan, mover, SELECTOR(dy), mover_dy);
+ writeSelectorValue(segMan, mover, SELECTOR(b_i1), mover_i1);
+ writeSelectorValue(segMan, mover, SELECTOR(b_i2), mover_i2);
+ writeSelectorValue(segMan, mover, SELECTOR(b_di), mover_di);
+ writeSelectorValue(segMan, mover, SELECTOR(b_incr), mover_incr);
+ writeSelectorValue(segMan, mover, SELECTOR(b_xAxis), mover_xAxis);
return s->r_acc;
}
-#define MOVING_ON_X (((axis == _K_BRESEN_AXIS_X)&&bi1) || dx)
-#define MOVING_ON_Y (((axis == _K_BRESEN_AXIS_Y)&&bi1) || dy)
-
reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) {
SegManager *segMan = s->_segMan;
reg_t mover = argv[0];
reg_t client = readSelector(segMan, mover, SELECTOR(client));
+ bool completed = false;
+ bool handleMoveCount = g_sci->_features->handleMoveCount();
- int x = (int16)readSelectorValue(segMan, client, SELECTOR(x));
- int y = (int16)readSelectorValue(segMan, client, SELECTOR(y));
- int oldx, oldy, destx, desty, dx, dy, bdi, bi1, bi2, movcnt, bdelta, axis;
- uint16 signal = readSelectorValue(segMan, client, SELECTOR(signal));
- int completed = 0;
- int max_movcnt = readSelectorValue(segMan, client, SELECTOR(moveSpeed));
-
- if (getSciVersion() > SCI_VERSION_01)
- signal &= ~kSignalHitObstacle;
-
- writeSelector(segMan, client, SELECTOR(signal), make_reg(0, signal)); // This is a NOP for SCI0
- oldx = x;
- oldy = y;
- destx = (int16)readSelectorValue(segMan, mover, SELECTOR(x));
- desty = (int16)readSelectorValue(segMan, mover, SELECTOR(y));
- dx = (int16)readSelectorValue(segMan, mover, SELECTOR(dx));
- dy = (int16)readSelectorValue(segMan, mover, SELECTOR(dy));
- bdi = (int16)readSelectorValue(segMan, mover, SELECTOR(b_di));
- bi1 = (int16)readSelectorValue(segMan, mover, SELECTOR(b_i1));
- bi2 = (int16)readSelectorValue(segMan, mover, SELECTOR(b_i2));
- movcnt = readSelectorValue(segMan, mover, SELECTOR(b_movCnt));
- bdelta = (int16)readSelectorValue(segMan, mover, SELECTOR(b_incr));
- axis = (int16)readSelectorValue(segMan, mover, SELECTOR(b_xAxis));
-
- if ((getSciVersion() >= SCI_VERSION_1_LATE)) {
- // Mixed-Up Fairy Tales has no xLast/yLast selectors
- if (SELECTOR(xLast) != -1) {
- // save last position into mover
- writeSelectorValue(segMan, mover, SELECTOR(xLast), x);
- writeSelectorValue(segMan, mover, SELECTOR(yLast), y);
- }
+ if (getSciVersion() >= SCI_VERSION_1_EGA) {
+ uint client_signal = readSelectorValue(segMan, client, SELECTOR(signal));
+ writeSelectorValue(segMan, client, SELECTOR(signal), client_signal & ~kSignalHitObstacle);
+ }
+
+ int16 mover_moveCnt = 1;
+ int16 client_moveSpeed = 0;
+ if (handleMoveCount) {
+ mover_moveCnt = readSelectorValue(segMan, mover, SELECTOR(b_movCnt));
+ client_moveSpeed = readSelectorValue(segMan, client, SELECTOR(moveSpeed));
+ mover_moveCnt++;
}
- //printf("movecnt %d, move speed %d\n", movcnt, max_movcnt);
+ if (client_moveSpeed < mover_moveCnt) {
+ mover_moveCnt = 0;
+ int16 client_x = readSelectorValue(segMan, client, SELECTOR(x));
+ int16 client_y = readSelectorValue(segMan, client, SELECTOR(y));
+ int16 client_org_x = client_x;
+ int16 client_org_y = client_y;
+ int16 mover_x = readSelectorValue(segMan, mover, SELECTOR(x));
+ int16 mover_y = readSelectorValue(segMan, mover, SELECTOR(y));
+ int16 mover_xAxis = readSelectorValue(segMan, mover, SELECTOR(b_xAxis));
+ int16 mover_dx = readSelectorValue(segMan, mover, SELECTOR(dx));
+ int16 mover_dy = readSelectorValue(segMan, mover, SELECTOR(dy));
+ int16 mover_incr = readSelectorValue(segMan, mover, SELECTOR(b_incr));
+ int16 mover_i1 = readSelectorValue(segMan, mover, SELECTOR(b_i1));
+ int16 mover_i2 = readSelectorValue(segMan, mover, SELECTOR(b_i2));
+ int16 mover_di = readSelectorValue(segMan, mover, SELECTOR(b_di));
+ int16 mover_org_i1 = mover_i1;
+ int16 mover_org_i2 = mover_i2;
+ int16 mover_org_di = mover_di;
+
+ if ((getSciVersion() >= SCI_VERSION_1_EGA)) {
+ // save current position into mover
+ writeSelectorValue(segMan, mover, SELECTOR(xLast), client_x);
+ writeSelectorValue(segMan, mover, SELECTOR(yLast), client_y);
+ }
+ // sierra sci saves full client selector variables here
- if (g_sci->_features->handleMoveCount()) {
- if (max_movcnt > movcnt) {
- ++movcnt;
- writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), movcnt); // Needed for HQ1/Ogre?
- return NULL_REG;
+ if (mover_xAxis) {
+ if (ABS(mover_x - client_x) < ABS(mover_dx))
+ completed = true;
} else {
- movcnt = 0;
- writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), movcnt); // Needed for HQ1/Ogre?
+ if (ABS(mover_y - client_y) < ABS(mover_dy))
+ completed = true;
+ }
+ if (completed) {
+ client_x = mover_x;
+ client_y = mover_y;
+ } else {
+ client_x += mover_dx;
+ client_y += mover_dy;
+ if (mover_di < 0) {
+ mover_di += mover_i1;
+ } else {
+ mover_di += mover_i2;
+ if (mover_xAxis == 0) {
+ client_x += mover_incr;
+ } else {
+ client_y += mover_incr;
+ }
+ }
+ }
+ writeSelectorValue(segMan, client, SELECTOR(x), client_x);
+ writeSelectorValue(segMan, client, SELECTOR(y), client_y);
+
+ // Now call client::canBeHere/client::cantBehere to check for collisions
+ bool collision = false;
+ reg_t cantBeHere = NULL_REG;
+
+ if (SELECTOR(cantBeHere) != -1) {
+ // adding this here for hoyle 3 to get happy. CantBeHere is a dummy in hoyle 3 and acc is != 0 so we would
+ // get a collision otherwise
+ s->r_acc = NULL_REG;
+ invokeSelector(s, client, SELECTOR(cantBeHere), argc, argv);
+ if (!s->r_acc.isNull())
+ collision = true;
+ cantBeHere = s->r_acc;
+ } else {
+ invokeSelector(s, client, SELECTOR(canBeHere), argc, argv);
+ if (s->r_acc.isNull())
+ collision = true;
}
- }
- if ((bdi += bi1) > 0) {
- bdi += bi2;
+ if (collision) {
+ // sierra restores full client variables here, seems that restoring x/y is enough
+ writeSelectorValue(segMan, client, SELECTOR(x), client_org_x);
+ writeSelectorValue(segMan, client, SELECTOR(y), client_org_y);
+ mover_i1 = mover_org_i1;
+ mover_i2 = mover_org_i2;
+ mover_di = mover_org_di;
- if (axis == _K_BRESEN_AXIS_X)
- dx += bdelta;
+ uint16 client_signal = readSelectorValue(segMan, client, SELECTOR(signal));
+ writeSelectorValue(segMan, client, SELECTOR(signal), client_signal | kSignalHitObstacle);
+ }
+ writeSelectorValue(segMan, mover, SELECTOR(b_i1), mover_i1);
+ writeSelectorValue(segMan, mover, SELECTOR(b_i2), mover_i2);
+ writeSelectorValue(segMan, mover, SELECTOR(b_di), mover_di);
+
+ if ((getSciVersion() >= SCI_VERSION_1_EGA)) {
+ // this calling code here was right before the last return in
+ // sci1ega and got changed to this position since sci1early
+ // this was an uninitialized issue in sierra sci
+ if ((handleMoveCount) && (getSciVersion() >= SCI_VERSION_1_EARLY))
+ writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), mover_moveCnt);
+ // We need to compare directly in here, complete may have happened during
+ // the current move
+ if ((client_x == mover_x) && (client_y == mover_y))
+ invokeSelector(s, mover, SELECTOR(moveDone), argc, argv);
+ if (getSciVersion() >= SCI_VERSION_1_EARLY)
+ return s->r_acc;
+ }
+ }
+ if (handleMoveCount) {
+ if (getSciVersion() <= SCI_VERSION_1_EGA)
+ writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), mover_moveCnt);
else
- dy += bdelta;
+ writeSelectorValue(segMan, mover, SELECTOR(b_movCnt), client_moveSpeed);
}
+ return s->r_acc;
+}
- writeSelectorValue(segMan, mover, SELECTOR(b_di), bdi);
+extern void kDirLoopWorker(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv);
+extern uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2);
- x += dx;
- y += dy;
+reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) {
+ SegManager *segMan = s->_segMan;
+ reg_t avoider = argv[0];
+ int16 timesStep = argc > 1 ? argv[1].toUint16() : 1;
- if ((MOVING_ON_X && (((x < destx) && (oldx >= destx)) // Moving left, exceeded?
- || ((x > destx) && (oldx <= destx)) // Moving right, exceeded?
- || ((x == destx) && (abs(dx) > abs(dy))) // Moving fast, reached?
- // Treat this last case specially- when doing sub-pixel movements
- // on the other axis, we could still be far away from the destination
- )) || (MOVING_ON_Y && (((y < desty) && (oldy >= desty)) /* Moving upwards, exceeded? */
- || ((y > desty) && (oldy <= desty)) /* Moving downwards, exceeded? */
- || ((y == desty) && (abs(dy) >= abs(dx))) /* Moving fast, reached? */
- ))) {
- // Whew... in short: If we have reached or passed our target position
+ if (!s->_segMan->isHeapObject(avoider)) {
+ error("DoAvoider() where avoider %04x:%04x is not an object", PRINT_REG(avoider));
+ return SIGNAL_REG;
+ }
- x = destx;
- y = desty;
- completed = 1;
+ reg_t client = readSelector(segMan, avoider, SELECTOR(client));
+ reg_t mover = readSelector(segMan, client, SELECTOR(mover));
+ if (mover.isNull())
+ return SIGNAL_REG;
- debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x", PRINT_REG(mover));
- }
+ // call mover::doit
+ invokeSelector(s, mover, SELECTOR(doit), argc, argv);
- writeSelectorValue(segMan, client, SELECTOR(x), x);
- writeSelectorValue(segMan, client, SELECTOR(y), y);
+ // Read mover again
+ mover = readSelector(segMan, client, SELECTOR(mover));
+ if (mover.isNull())
+ return SIGNAL_REG;
- debugC(2, kDebugLevelBresen, "New data: (x,y)=(%d,%d), di=%d", x, y, bdi);
+ int16 clientX = readSelectorValue(segMan, client, SELECTOR(x));
+ int16 clientY = readSelectorValue(segMan, client, SELECTOR(y));
+ int16 moverX = readSelectorValue(segMan, mover, SELECTOR(x));
+ int16 moverY = readSelectorValue(segMan, mover, SELECTOR(y));
+ int16 avoiderHeading = readSelectorValue(segMan, avoider, SELECTOR(heading));
- bool collision = false;
- reg_t cantBeHere = NULL_REG;
+ // call client::isBlocked
+ invokeSelector(s, client, SELECTOR(isBlocked), argc, argv);
- if (SELECTOR(cantBeHere) != -1) {
- // adding this here for hoyle 3 to get happy. CantBeHere is a dummy in hoyle 3 and acc is != 0 so we would
- // get a collision otherwise
- s->r_acc = NULL_REG;
- invokeSelector(s, client, SELECTOR(cantBeHere), argc, argv);
- if (!s->r_acc.isNull())
- collision = true;
- cantBeHere = s->r_acc;
- } else {
- invokeSelector(s, client, SELECTOR(canBeHere), argc, argv);
- if (s->r_acc.isNull())
- collision = true;
- }
+ if (s->r_acc.isNull()) {
+ // not blocked
+ if (avoiderHeading == -1)
+ return SIGNAL_REG;
+ avoiderHeading = -1;
- if (collision) {
- signal = readSelectorValue(segMan, client, SELECTOR(signal));
+ uint16 angle = kGetAngleWorker(clientX, clientY, moverX, moverY);
- writeSelectorValue(segMan, client, SELECTOR(x), oldx);
- writeSelectorValue(segMan, client, SELECTOR(y), oldy);
- writeSelectorValue(segMan, client, SELECTOR(signal), (signal | kSignalHitObstacle));
+ reg_t clientLooper = readSelector(segMan, client, SELECTOR(looper));
+ if (clientLooper.isNull()) {
+ kDirLoopWorker(client, angle, s, argc, argv);
+ } else {
+ // call looper::doit
+ reg_t params[2] = { make_reg(0, angle), client };
+ invokeSelector(s, clientLooper, SELECTOR(doit), argc, argv, 2, params);
+ }
+ s->r_acc = SIGNAL_REG;
+
+ } else {
+ // is blocked
+ if (avoiderHeading == -1)
+ avoiderHeading = g_sci->getRNG().getRandomBit() ? 45 : -45;
+ int16 clientHeading = readSelectorValue(segMan, client, SELECTOR(heading));
+ clientHeading = (clientHeading / 45) * 45;
+
+ int16 clientXstep = readSelectorValue(segMan, client, SELECTOR(xStep)) * timesStep;
+ int16 clientYstep = readSelectorValue(segMan, client, SELECTOR(yStep)) * timesStep;
+ int16 newHeading = clientHeading;
+
+ while (1) {
+ int16 newX = clientX;
+ int16 newY = clientY;
+ switch (newHeading) {
+ case 45:
+ case 90:
+ case 135:
+ newX += clientXstep;
+ break;
+ case 225:
+ case 270:
+ case 315:
+ newX -= clientXstep;
+ }
- debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x by collision", PRINT_REG(mover));
- // We shall not set completed in this case, sierra sci also doesn't do it
- // if we set call .moveDone in those cases qfg1 vga gate at the castle and lsl1 casino door will not work
- }
+ switch (newHeading) {
+ case 0:
+ case 45:
+ case 315:
+ newY -= clientYstep;
+ break;
+ case 135:
+ case 180:
+ case 225:
+ newY += clientYstep;
+ }
+ writeSelectorValue(segMan, client, SELECTOR(x), newX);
+ writeSelectorValue(segMan, client, SELECTOR(y), newY);
- if ((getSciVersion() >= SCI_VERSION_1_EGA))
- if (completed)
- invokeSelector(s, mover, SELECTOR(moveDone), argc, argv);
+ // call client::canBeHere
+ invokeSelector(s, client, SELECTOR(canBeHere), argc, argv);
- if (SELECTOR(cantBeHere) != -1)
- return cantBeHere;
- return make_reg(0, completed);
-}
+ if (!s->r_acc.isNull()) {
+ s->r_acc = make_reg(0, newHeading);
+ break; // break out
+ }
-extern void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv);
-
-int getAngle(int xrel, int yrel) {
- if ((xrel == 0) && (yrel == 0))
- return 0;
- else {
- int val = (int)(180.0 / PI * atan2((double)xrel, (double) - yrel));
- if (val < 0)
- val += 360;
-
- // Take care of OB1 differences between SSCI and
- // FSCI. SCI games sometimes check for equality with
- // "round" angles
- if (val % 45 == 44)
- val++;
- else if (val % 45 == 1)
- val--;
-
- return val;
+ newHeading += avoiderHeading;
+ if (newHeading >= 360)
+ newHeading -= 360;
+ if (newHeading < 0)
+ newHeading += 360;
+ if (newHeading == clientHeading) {
+ // tried everything
+ writeSelectorValue(segMan, client, SELECTOR(x), clientX);
+ writeSelectorValue(segMan, client, SELECTOR(y), clientY);
+ s->r_acc = SIGNAL_REG;
+ break; // break out
+ }
+ }
}
-}
+ writeSelectorValue(segMan, avoider, SELECTOR(heading), avoiderHeading);
+ return s->r_acc;
-reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) {
- SegManager *segMan = s->_segMan;
- reg_t avoider = argv[0];
+#if 0
reg_t client, looper, mover;
int angle;
int dx, dy;
@@ -486,18 +601,18 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) {
s->r_acc = make_reg(0, angle);
- reg_t params[2] = { make_reg(0, angle), client };
-
if (looper.segment) {
+ reg_t params[2] = { make_reg(0, angle), client };
invokeSelector(s, looper, SELECTOR(doit), argc, argv, 2, params);
return s->r_acc;
} else {
// No looper? Fall back to DirLoop
- _k_dirloop(client, (uint16)angle, s, argc, argv);
+ kDirLoopWorker(client, (uint16)angle, s, argc, argv);
}
}
return s->r_acc;
+#endif
}
} // End of namespace Sci
diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp
index 552e425906..be32b340bb 100644
--- a/engines/sci/engine/kparse.cpp
+++ b/engines/sci/engine/kparse.cpp
@@ -138,6 +138,15 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) {
} else {
s->r_acc = make_reg(0, 0);
+ // FIXME: When typing something wrong in the fanmade game Demo Quest,
+ // after the error dialog, the game checks for claimed to be 0 before
+ // showing a subsequent dialog. The following selector change causes
+ // it to be 1, thus causing the game to hang in an endless loop (bug
+ // #3038870. Thus, this seems to be wrong (since fanmade games use
+ // the original SCI interpreter), but we need to check against
+ // dissassembly. Since kParse is in the process of being dissassembled
+ // again, I'm leaving this FIXME in for now, so that it won't be
+ // forgotten :)
writeSelectorValue(segMan, event, SELECTOR(claimed), 1);
if (error) {
s->_segMan->strcpy(voc->parser_base, error);
diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp
index 07d0a31f0b..faf966af92 100644
--- a/engines/sci/engine/kpathing.cpp
+++ b/engines/sci/engine/kpathing.cpp
@@ -261,13 +261,7 @@ struct PathfindingState {
int findNearPoint(const Common::Point &p, Polygon *polygon, Common::Point *ret);
};
-
-static Common::Point read_point(SegManager *segMan, reg_t list, int offset) {
- SegmentRef list_r = segMan->dereference(list);
- if (!list_r.isValid() || list_r.skipByte) {
- // If this happens, then the code below will probably go OOB and crash
- error("read_point(): Attempt to dereference invalid pointer %04x:%04x", PRINT_REG(list));
- }
+static Common::Point readPoint(SegmentRef list_r, int offset) {
Common::Point point;
if (list_r.isRaw) {
@@ -350,10 +344,16 @@ static void draw_polygon(EngineState *s, reg_t polygon, int width, int height) {
Common::Point first, prev;
int i;
- prev = first = read_point(segMan, points, 0);
+ SegmentRef pointList = segMan->dereference(points);
+ if (!pointList.isValid() || pointList.skipByte) {
+ warning("draw_polygon: Polygon data pointer is invalid, skipping polygon");
+ return;
+ }
+
+ prev = first = readPoint(pointList, 0);
for (i = 1; i < size; i++) {
- Common::Point point = read_point(segMan, points, i);
+ Common::Point point = readPoint(pointList, i);
draw_line(s, prev, point, type, width, height);
prev = point;
}
@@ -401,12 +401,18 @@ static void print_polygon(SegManager *segMan, reg_t polygon) {
debugN(-1, "%i:", type);
+ SegmentRef pointList = segMan->dereference(points);
+ if (!pointList.isValid() || pointList.skipByte) {
+ warning("print_polygon: Polygon data pointer is invalid, skipping polygon");
+ return;
+ }
+
for (i = 0; i < size; i++) {
- point = read_point(segMan, points, i);
+ point = readPoint(pointList, i);
debugN(-1, " (%i, %i)", point.x, point.y);
}
- point = read_point(segMan, points, 0);
+ point = readPoint(pointList, 0);
debug(" (%i, %i);", point.x, point.y);
}
@@ -1092,7 +1098,22 @@ static Polygon *convert_polygon(EngineState *s, reg_t polygon) {
return NULL;
}
- Polygon *poly = new Polygon(readSelectorValue(segMan, polygon, SELECTOR(type)));
+ SegmentRef pointList = segMan->dereference(points);
+ // Check if the target polygon is still valid. It may have been released
+ // in the meantime (e.g. in LSL6, room 700, when using the elevator).
+ // Refer to bug #3034501.
+ if (!pointList.isValid() || pointList.skipByte) {
+ warning("convert_polygon: Polygon data pointer is invalid, skipping polygon");
+ return NULL;
+ }
+
+ // Make sure that we have enough points
+ if (pointList.maxSize < size * POLY_POINT_SIZE) {
+ warning("convert_polygon: Not enough memory allocated for polygon points. "
+ "Expected %d, got %d. Skipping polygon",
+ size * POLY_POINT_SIZE, pointList.maxSize);
+ return NULL;
+ }
int skip = 0;
@@ -1100,14 +1121,16 @@ static Polygon *convert_polygon(EngineState *s, reg_t polygon) {
// Polygon has 17 points but size is set to 19
if ((size == 19) && g_sci->getGameId() == GID_LSL1) {
if ((s->currentRoomNumber() == 350)
- && (read_point(segMan, points, 18) == Common::Point(108, 137))) {
+ && (readPoint(pointList, 18) == Common::Point(108, 137))) {
debug(1, "Applying fix for broken polygon in lsl1sci, room 350");
size = 17;
}
}
+ Polygon *poly = new Polygon(readSelectorValue(segMan, polygon, SELECTOR(type)));
+
for (i = skip; i < size; i++) {
- Vertex *vertex = new Vertex(read_point(segMan, points, i));
+ Vertex *vertex = new Vertex(readPoint(pointList, i));
poly->vertices.insertHead(vertex);
}
@@ -1163,7 +1186,9 @@ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Co
Node *node = s->_segMan->lookupNode(list->first);
while (node) {
- polygon = convert_polygon(s, node->value);
+ // The node value might be null, in which case there's no polygon to parse.
+ // Happens in LB2 floppy - refer to bug #3041232
+ polygon = !node->value.isNull() ? convert_polygon(s, node->value) : NULL;
if (polygon) {
pf_s->polygons.push_back(polygon);
@@ -1402,8 +1427,15 @@ static reg_t output_path(PathfindingState *p, EngineState *s) {
if (DebugMan.isDebugChannelEnabled(kDebugLevelAvoidPath)) {
debug("\nReturning path:");
+
+ SegmentRef outputList = s->_segMan->dereference(output);
+ if (!outputList.isValid() || outputList.skipByte) {
+ warning("output_path: Polygon data pointer is invalid, skipping polygon");
+ return output;
+ }
+
for (int i = 0; i < offset; i++) {
- Common::Point pt = read_point(s->_segMan, output, i);
+ Common::Point pt = readPoint(outputList, i);
debugN(-1, " (%i, %i)", pt.x, pt.y);
}
debug(";\n");
diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp
index a5501c160f..ef99c4cc85 100644
--- a/engines/sci/engine/kscripts.cpp
+++ b/engines/sci/engine/kscripts.cpp
@@ -145,6 +145,7 @@ reg_t kResCheck(EngineState *s, int argc, reg_t *argv) {
reg_t kClone(EngineState *s, int argc, reg_t *argv) {
reg_t parent_addr = argv[0];
const Object *parent_obj = s->_segMan->getObject(parent_addr);
+ const bool parentIsClone = parent_obj->isClone();
reg_t clone_addr;
Clone *clone_obj; // same as Object*
@@ -162,10 +163,22 @@ reg_t kClone(EngineState *s, int argc, reg_t *argv) {
return NULL_REG;
}
+ // In case the parent object is a clone itself we need to refresh our
+ // pointer to it here. This is because calling allocateClone might
+ // invalidate all pointers, references and iterators to data in the clones
+ // segment.
+ //
+ // The reason why it might invalidate those is, that the segement code
+ // (Table) uses Common::Array for internal storage. Common::Array now
+ // might invalidate references to its contained data, when it has to
+ // extend the internal storage size.
+ if (parentIsClone)
+ parent_obj = s->_segMan->getObject(parent_addr);
+
*clone_obj = *parent_obj;
// Mark as clone
- clone_obj->markAsClone();
+ clone_obj->markAsClone(); // sets bit 0 of -info- selector
clone_obj->setSpeciesSelector(clone_obj->getPos());
if (parent_obj->isClass())
clone_obj->setSuperClassSelector(parent_obj->getPos());
@@ -178,21 +191,22 @@ reg_t kClone(EngineState *s, int argc, reg_t *argv) {
extern void _k_view_list_mark_free(EngineState *s, reg_t off);
reg_t kDisposeClone(EngineState *s, int argc, reg_t *argv) {
- reg_t victim_addr = argv[0];
- Clone *victim_obj = s->_segMan->getObject(victim_addr);
+ reg_t obj = argv[0];
+ Clone *object = s->_segMan->getObject(obj);
- if (!victim_obj) {
+ if (!object) {
error("Attempt to dispose non-class/object at %04x:%04x",
- PRINT_REG(victim_addr));
- return s->r_acc;
- }
-
- if (!victim_obj->isClone()) {
- // SCI silently ignores this behaviour; some games actually depend on it
+ PRINT_REG(obj));
return s->r_acc;
}
- victim_obj->markAsFreed();
+ // SCI uses this technique to find out, if it's a clone and if it's supposed to get freed
+ // At least kq4early relies on this behaviour. The scripts clone "Sound", then set bit 1 manually
+ // and call kDisposeClone later. In that case we may not free it, otherwise we will run into issues
+ // later, because kIsObject would then return false and Sound object wouldn't get checked.
+ uint16 infoSelector = readSelectorValue(s->_segMan, obj, SELECTOR(_info_));
+ if ((infoSelector & 3) == kInfoFlagClone)
+ object->markAsFreed();
return s->r_acc;
}
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index dfc41cc56a..88f5d29920 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -45,8 +45,6 @@
#include "sci/sound/audio.h"
#include "sci/sound/music.h"
-#include "gui/message.h"
-
namespace Sci {
@@ -701,6 +699,8 @@ bool gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savenam
return true;
}
+extern void showScummVMDialog(const Common::String &message);
+
void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
SavegameMetadata meta;
@@ -708,7 +708,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
sync_SavegameMetadata(ser, meta);
if (fh->eos()) {
- s->r_acc = make_reg(0, 1); // signal failure
+ s->r_acc = TRUE_REG; // signal failure
return;
}
@@ -721,10 +721,9 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
warning("Savegame version is %d, maximum supported is %0d", meta.savegame_version, CURRENT_SAVEGAME_VERSION);
*/
- GUI::MessageDialog dialog("The format of this saved game is obsolete, unable to load it", "OK");
- dialog.runModal();
+ showScummVMDialog("The format of this saved game is obsolete, unable to load it");
- s->r_acc = make_reg(0, 1); // signal failure
+ s->r_acc = TRUE_REG; // signal failure
return;
}
@@ -733,10 +732,9 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
if (script0->size != meta.script0_size || g_sci->getGameObject().offset != meta.game_object_offset) {
//warning("This saved game was created with a different version of the game, unable to load it");
- GUI::MessageDialog dialog("This saved game was created with a different version of the game, unable to load it", "OK");
- dialog.runModal();
+ showScummVMDialog("This saved game was created with a different version of the game, unable to load it");
- s->r_acc = make_reg(0, 1); // signal failure
+ s->r_acc = TRUE_REG; // signal failure
return;
}
}
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index 4c940804b8..9561d337ef 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -69,6 +69,9 @@ void Script::freeScript() {
void Script::init(int script_nr, ResourceManager *resMan) {
Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, script_nr), 0);
+ if (!script)
+ error("Script %d not found\n", script_nr);
+
_localsOffset = 0;
_localsBlock = NULL;
_localsCount = 0;
@@ -288,7 +291,8 @@ void Script::relocate(reg_t block) {
// code blocks. In SCI1.1 and newer versions, only locals and objects
// are relocated.
if (!relocateLocal(block.segment, pos)) {
- // Not a local? It's probably an object or code block. If it's an object, relocate it.
+ // Not a local? It's probably an object or code block. If it's an
+ // object, relocate it.
const ObjMap::iterator end = _objects.end();
for (ObjMap::iterator it = _objects.begin(); it != end; ++it)
if (it->_value.relocate(block.segment, pos, _scriptSize))
@@ -329,11 +333,13 @@ uint16 Script::validateExportFunc(int pubfunct) {
uint16 offset = READ_SCI11ENDIAN_UINT16(_exportTable + pubfunct);
VERIFY(offset < _bufSize, "invalid export function pointer");
- if (offset == 0) {
- // Check if the game has a second export table (e.g. script 912 in Camelot)
- // Fixes bug #3039785
- if (g_sci->getGameId() == GID_ECOQUEST) // cheap fix in here for eco quest 1, [md5] plz look into this TODO FIXME
- return offset;
+ // Check if the offset found points to a second export table (e.g. script 912
+ // in Camelot and script 306 in KQ4). Such offsets are usually small (i.e. < 10),
+ // thus easily distinguished from actual code offsets.
+ // This only makes sense for SCI0-SCI1, as the export table in SCI1.1+ games
+ // is located at a specific address, thus findBlock() won't work.
+ // Fixes bugs #3039785 and #3037595.
+ if (offset < 10 && getSciVersion() <= SCI_VERSION_1_LATE) {
const uint16 *secondExportTable = (const uint16 *)findBlock(SCI_OBJ_EXPORTS, 0);
if (secondExportTable) {
@@ -530,7 +536,7 @@ void Script::initialiseObjectsSci11(SegManager *segMan, SegmentId segmentId) {
// If object is instance, get -propDict- from class and set it for this
// object. This is needed for ::isMemberOf() to work.
- // Example testcase - room 381 of sq4cd - if isMemberOf() doesn't work,
+ // Example test case - room 381 of sq4cd - if isMemberOf() doesn't work,
// talk-clicks on the robot will act like clicking on ego
if (!obj->isClass()) {
reg_t classObject = obj->getSuperClassSelector();
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 5fc93421cd..fbd58cf20c 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -25,6 +25,7 @@
#include "sci/sci.h"
#include "sci/engine/script.h"
+#include "sci/engine/state.h"
#include "common/util.h"
@@ -44,6 +45,8 @@ struct SciScriptSignature {
const uint16 *patch;
};
+#define SCI_SIGNATUREENTRY_TERMINATOR { 0, NULL, 0, 0, NULL, NULL }
+
// signatures are built like this:
// - first a counter of the bytes that follow
// - then the actual bytes that need to get matched
@@ -51,6 +54,7 @@ struct SciScriptSignature {
// - if not EOS, an adjust offset and the actual bytes
// - rinse and repeat
+// ===========================================================================
// stayAndHelp::changeState (0) is called when ego swims to the left or right
// boundaries of room 660. Normally a textbox is supposed to get on screen
// but the call is wrong, so not only do we get an error message the script
@@ -72,7 +76,7 @@ const byte ecoquest1SignatureStayAndHelp[] = {
0x78, // push1
0x76, // push0
0x81, 0x00, // lag global[0]
- 0x4a, 0x06, // send 06 - ego::setMotion(0)
+ 0x4a, 0x06, // send 06 - call ego::setMotion(0)
0x39, 0x6e, // pushi 6e (selector init)
0x39, 0x04, // pushi 04
0x76, // push0
@@ -80,7 +84,7 @@ const byte ecoquest1SignatureStayAndHelp[] = {
0x39, 0x17, // pushi 17
0x7c, // pushSelf
0x51, 0x82, // class EcoNarrator
- 0x4a, 0x0c, // send 0c - EcoNarrator::init(0, 0, 23, self) (BADLY BROKEN!)
+ 0x4a, 0x0c, // send 0c - call EcoNarrator::init(0, 0, 23, self) (BADLY BROKEN!)
0x33, // jmp [end]
0
};
@@ -96,7 +100,7 @@ const uint16 ecoquest1PatchStayAndHelp[] = {
0x78, // push1
0x76, // push0
0x81, 0x00, // lag global[0]
- 0x4a, 0x06, // send 06 - ego::setMotion(0)
+ 0x4a, 0x06, // send 06 - call ego::setMotion(0)
0x39, 0x6e, // pushi 6e (selector init)
0x39, 0x06, // pushi 06
0x39, 0x02, // pushi 02 (additional 2 bytes)
@@ -106,16 +110,122 @@ const uint16 ecoquest1PatchStayAndHelp[] = {
0x7c, // pushSelf
0x38, 0x80, 0x02, // pushi 280 (additional 3 bytes)
0x51, 0x82, // class EcoNarrator
- 0x4a, 0x10, // send 10 - EcoNarrator::init(2, 0, 0, 23, self, 640)
+ 0x4a, 0x10, // send 10 - call EcoNarrator::init(2, 0, 0, 23, self, 640)
PATCH_END
};
// script, description, magic DWORD, adjust
const SciScriptSignature ecoquest1Signatures[] = {
{ 660, "CD: bad messagebox and freeze", PATCH_MAGICDWORD(0x38, 0x22, 0x01, 0x78), -17, ecoquest1SignatureStayAndHelp, ecoquest1PatchStayAndHelp },
- { 0, NULL, 0, 0, NULL, NULL }
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
+// doMyThing::changeState (2) is supposed to remove the initial text on the
+// ecorder. This is done by reusing temp-space, that was filled on state 1.
+// this worked in sierra sci just by accident. In our sci, the temp space
+// is resetted every time, which means the previous text isn't available
+// anymore. We have to patch the code because of that ffs. bug #3035386
+const byte ecoquest2SignatureEcorder[] = {
+ 35,
+ 0x31, 0x22, // bnt [next state]
+ 0x39, 0x0a, // pushi 0a
+ 0x5b, 0x04, 0x1e, // lea temp[1e]
+ 0x36, // push
+ 0x39, 0x64, // pushi 64
+ 0x39, 0x7d, // pushi 7d
+ 0x39, 0x32, // pushi 32
+ 0x39, 0x66, // pushi 66
+ 0x39, 0x17, // pushi 17
+ 0x39, 0x69, // pushi 69
+ 0x38, 0x31, 0x26, // pushi 2631
+ 0x39, 0x6a, // pushi 6a
+ 0x39, 0x64, // pushi 64
+ 0x43, 0x1b, 0x14, // call kDisplay
+ 0x35, 0x0a, // ldi 0a
+ 0x65, 0x20, // aTop ticks
+ 0x33, // jmp [end]
+ +1, 5, // [skip 1 byte]
+ 0x3c, // dup
+ 0x35, 0x03, // ldi 03
+ 0x1a, // eq?
+ 0x31, // bnt [end]
+ 0
+};
+
+const uint16 ecoquest2PatchEcorder[] = {
+ 0x2f, 0x02, // bt [to pushi 07]
+ 0x3a, // toss
+ 0x48, // ret
+ 0x38, 0x07, 0x00, // pushi 07 (parameter count) (waste 1 byte)
+ 0x39, 0x0b, // push (FillBoxAny)
+ 0x39, 0x1d, // pushi 29d
+ 0x39, 0x73, // pushi 115d
+ 0x39, 0x5e, // pushi 94d
+ 0x38, 0xd7, 0x00, // pushi 215d
+ 0x78, // push1 (visual screen)
+ 0x38, 0x17, 0x00, // pushi 17 (color) (waste 1 byte)
+ 0x43, 0x6c, 0x0e, // call kGraph
+ 0x38, 0x05, 0x00, // pushi 05 (parameter count) (waste 1 byte)
+ 0x39, 0x0c, // pushi 12d (UpdateBox)
+ 0x39, 0x1d, // pushi 29d
+ 0x39, 0x73, // pushi 115d
+ 0x39, 0x5e, // pushi 94d
+ 0x38, 0xd7, 0x00, // pushi 215d
+ 0x43, 0x6c, 0x0a, // call kGraph
+ PATCH_END
+};
+
+// script, description, magic DWORD, adjust
+const SciScriptSignature ecoquest2Signatures[] = {
+ { 50, "initial text not removed on ecorder", PATCH_MAGICDWORD(0x39, 0x64, 0x39, 0x7d), -8, ecoquest2SignatureEcorder, ecoquest2PatchEcorder },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
+// script 215 of freddy pharkas lowerLadder::doit and highLadder::doit actually
+// process keyboard-presses when the ladder is on the screen in that room.
+// They strangely also call kGetEvent. Because the main User::doit also calls
+// kGetEvent, it's pure luck, where the event will hit. It's the same issue
+// as in QfG1VGA and if you turn dos-box to max cycles, and click around for
+// ego, sometimes clicks also won't get registered. Strangely it's not nearly
+// as bad as in our sci, but these differences may be caused by timing.
+// We just reuse the active event, thus removing the duplicate kGetEvent call.
+const byte freddypharkasSignatureLadderEvent[] = {
+ 21,
+ 0x39, 0x6d, // pushi 6d (selector new)
+ 0x76, // push0
+ 0x38, 0xf5, 0x00, // pushi f5 (selector curEvent)
+ 0x76, // push0
+ 0x81, 0x50, // lag global[50]
+ 0x4a, 0x04, // send 04 - read User::curEvent
+ 0x4a, 0x04, // send 04 - call curEvent::new
+ 0xa5, 0x00, // sat temp[0]
+ 0x38, 0x94, 0x00, // pushi 94 (selector localize)
+ 0x76, // push0
+ 0x4a, 0x04, // send 04 - call curEvent::localize
+ 0
+};
+
+const uint16 freddypharkasPatchLadderEvent[] = {
+ 0x34, 0x00, 0x00, // ldi 0000 (waste 3 bytes, overwrites first 2 pushes)
+ PATCH_ADDTOOFFSET | +8,
+ 0xa5, 0x00, // sat temp[0] (waste 2 bytes, overwrites 2nd send)
+ PATCH_ADDTOOFFSET | +2,
+ 0x34, 0x00, 0x00, // ldi 0000
+ 0x34, 0x00, 0x00, // ldi 0000 (waste 6 bytes, overwrites last 3 opcodes)
+ PATCH_END
+};
+
+// script, description, magic DWORD, adjust
+const SciScriptSignature freddypharkasSignatures[] = {
+ // this is not a typo, both lowerLadder::doit and highLadder::doit have the same event code
+ { 320, "lower ladder event issue", PATCH_MAGICDWORD(0x6d, 0x76, 0x38, 0xf5), -1, freddypharkasSignatureLadderEvent, freddypharkasPatchLadderEvent },
+ { 320, "high ladder event issue", PATCH_MAGICDWORD(0x6d, 0x76, 0x38, 0xf5), -1, freddypharkasSignatureLadderEvent, freddypharkasPatchLadderEvent },
+ SCI_SIGNATUREENTRY_TERMINATOR
};
+// ===========================================================================
// daySixBeignet::changeState (4) is called when the cop goes out and sets cycles to 220.
// this is not enough time to get to the door, so we patch that to 23 seconds
const byte gk1SignatureDay6PoliceBeignet[] = {
@@ -186,73 +296,130 @@ const SciScriptSignature gk1Signatures[] = {
{ 212, "day 5 phone freeze", PATCH_MAGICDWORD(0x35, 0x03, 0x65, 0x1a), 0, gk1SignatureDay5PhoneFreeze, gk1PatchDay5PhoneFreeze },
{ 230, "day 6 police beignet timer issue", PATCH_MAGICDWORD(0x34, 0xdc, 0x00, 0x65), -16, gk1SignatureDay6PoliceBeignet, gk1PatchDay6PoliceBeignet },
{ 230, "day 6 police sleep timer issue", PATCH_MAGICDWORD(0x34, 0xdc, 0x00, 0x65), -5, gk1SignatureDay6PoliceSleep, gk1PatchDay6PoliceSleep },
- { 0, NULL, 0, 0, NULL, NULL }
+ SCI_SIGNATUREENTRY_TERMINATOR
};
+// ===========================================================================
// this here gets called on entry and when going out of game windows
// uEvt::port will not get changed after kDisposeWindow but a bit later, so
// we would get an invalid port handle to a kSetPort call. We just patch in
// resetting of the port selector. We destroy the stop/fade code in there,
// it seems it isn't used at all in the game.
-const byte hoyle4SignaturePortFix[] = {
- 28,
- 0x39, 0x09, // pushi 09
- 0x89, 0x0b, // lsg 0b
- 0x39, 0x64, // pushi 64
- 0x38, 0xc8, 0x00, // pushi 00c8
- 0x38, 0x2c, 0x01, // pushi 012c
- 0x38, 0x90, 0x01, // pushi 0190
- 0x38, 0xf4, 0x01, // pushi 01f4
- 0x38, 0x58, 0x02, // pushi 0258
- 0x38, 0xbc, 0x02, // pushi 02bc
- 0x38, 0x20, 0x03, // pushi 0320
- 0x46, // calle [xxxx] [xxxx] [xx]
- +5, 43, // [skip 5 bytes]
- 0x30, 0x27, 0x00, // bnt 0027 -> end of routine
- 0x87, 0x00, // lap 00
- 0x30, 0x19, 0x00, // bnt 0019 -> fade out
- 0x87, 0x01, // lap 01
- 0x30, 0x14, 0x00, // bnt 0014 -> fade out
- 0x38, 0xa7, 0x00, // pushi 00a7
+//const byte hoyle4SignaturePortFix[] = {
+// 28,
+// 0x39, 0x09, // pushi 09
+// 0x89, 0x0b, // lsg 0b
+// 0x39, 0x64, // pushi 64
+// 0x38, 0xc8, 0x00, // pushi 00c8
+// 0x38, 0x2c, 0x01, // pushi 012c
+// 0x38, 0x90, 0x01, // pushi 0190
+// 0x38, 0xf4, 0x01, // pushi 01f4
+// 0x38, 0x58, 0x02, // pushi 0258
+// 0x38, 0xbc, 0x02, // pushi 02bc
+// 0x38, 0x20, 0x03, // pushi 0320
+// 0x46, // calle [xxxx] [xxxx] [xx]
+// +5, 43, // [skip 5 bytes]
+// 0x30, 0x27, 0x00, // bnt 0027 -> end of routine
+// 0x87, 0x00, // lap 00
+// 0x30, 0x19, 0x00, // bnt 0019 -> fade out
+// 0x87, 0x01, // lap 01
+// 0x30, 0x14, 0x00, // bnt 0014 -> fade out
+// 0x38, 0xa7, 0x00, // pushi 00a7
+// 0x76, // push0
+// 0x80, 0x29, 0x01, // lag 0129
+// 0x4a, 0x04, // send 04 - call song::stop
+// 0x39, 0x27, // pushi 27
+// 0x78, // push1
+// 0x8f, 0x01, // lsp 01
+// 0x51, 0x54, // class 54
+// 0x4a, 0x06, // send 06 - call PlaySong::play
+// 0x33, 0x09, // jmp 09 -> end of routine
+// 0x38, 0xaa, 0x00, // pushi 00aa
+// 0x76, // push0
+// 0x80, 0x29, 0x01, // lag 0129
+// 0x4a, 0x04, // send 04
+// 0x48, // ret
+// 0
+//};
+
+//const uint16 hoyle4PatchPortFix[] = {
+// PATCH_ADDTOOFFSET | +33,
+// 0x38, 0x31, 0x01, // pushi 0131 (selector curEvent)
+// 0x76, // push0
+// 0x80, 0x50, 0x00, // lag 0050 (global var 80h, "User")
+// 0x4a, 0x04, // send 04 - read User::curEvent
+//
+// 0x38, 0x93, 0x00, // pushi 0093 (selector port)
+// 0x78, // push1
+// 0x76, // push0
+// 0x4a, 0x06, // send 06 - write 0 to that object::port
+// 0x48, // ret
+// PATCH_END
+//};
+
+// script, description, magic DWORD, adjust
+//const SciScriptSignature hoyle4Signatures[] = {
+// { 0, "port fix when disposing windows", PATCH_MAGICDWORD(0x64, 0x38, 0xC8, 0x00), -5, hoyle4SignaturePortFix, hoyle4PatchPortFix },
+// { 0, NULL, 0, 0, NULL, NULL }
+//};
+
+// ===========================================================================
+// at least during harpy scene export 29 of script 0 is called in kq5cd and
+// has an issue for those calls, where temp 3 won't get inititialized, but
+// is later used to set master volume. This issue makes sierra sci set
+// the volume to max. We fix the export, so volume won't get modified in
+// those cases.
+const byte kq5SignatureCdHarpyVolume[] = {
+ 34,
+ 0x80, 0x91, 0x01, // lag global[191h]
+ 0x18, // not
+ 0x30, 0x2c, 0x00, // bnt [jump further] (jumping, if global 191h is 1)
+ 0x35, 0x01, // ldi 01
+ 0xa0, 0x91, 0x01, // sag global[191h] (setting global 191h to 1)
+ 0x38, 0x7b, 0x01, // pushi 017b
0x76, // push0
- 0x80, 0x29, 0x01, // lag 0129
- 0x4a, 0x04, // send 04 (song::stop)
- 0x39, 0x27, // pushi 27
- 0x78, // push1
- 0x8f, 0x01, // lsp 01
- 0x51, 0x54, // class 54
- 0x4a, 0x06, // send 06 (PlaySong::play)
- 0x33, 0x09, // jmp 09 -> end of routine
- 0x38, 0xaa, 0x00, // pushi 00aa
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x04, // send 04 - read KQ5::masterVolume
+ 0xa5, 0x03, // sat temp[3] (store volume in temp 3)
+ 0x38, 0x7b, 0x01, // pushi 017b
0x76, // push0
- 0x80, 0x29, 0x01, // lag 0129
- 0x4a, 0x04, // send 04
- 0x48, // ret
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x04, // send 04 - read KQ5::masterVolume
+ 0x36, // push
+ 0x35, 0x04, // ldi 04
+ 0x20, // ge? (followed by bnt)
0
};
-const uint16 hoyle4PatchPortFix[] = {
- PATCH_ADDTOOFFSET | +33,
- 0x38, 0x31, 0x01, // pushi 0131 (selector curEvent)
- 0x76, // push0
- 0x80, 0x50, 0x00, // lag 0050 (global var 80h, "User")
- 0x4a, 0x04, // send 04 (read User::curEvent)
-
- 0x38, 0x93, 0x00, // pushi 0093 (selector port)
- 0x78, // push1
+const uint16 kq5PatchCdHarpyVolume[] = {
+ 0x38, 0x2f, 0x02, // pushi 022f (selector theVol) (3 new bytes)
+ 0x76, // push0 (1 new byte)
+ 0x51, 0x88, // class SpeakTimer (2 new bytes)
+ 0x4a, 0x04, // send 04 (2 new bytes) -> read SpeakTimer::theVol
+ 0xa5, 0x03, // sat temp[3] (2 new bytes) -> write to temp 3
+ 0x80, 0x91, 0x01, // lag global[191h]
+ // saving 1 byte due optimization
+ 0x2e, 0x23, 0x00, // bt [jump further] (jumping, if global 191h is 1)
+ 0x35, 0x01, // ldi 01
+ 0xa0, 0x91, 0x01, // sag global[191h] (setting global 191h to 1)
+ 0x38, 0x7b, 0x01, // pushi 017b
0x76, // push0
- 0x4a, 0x06, // send 06 (write 0 to that object::port)
- 0x48, // ret
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x04, // send 04 - read KQ5::masterVolume
+ 0xa5, 0x03, // sat temp[3] (store volume in temp 3)
+ // saving 8 bytes due removing of duplicate code
+ 0x39, 0x04, // pushi 04 (saving 1 byte due swapping)
+ 0x22, // lt? (because we switched values)
PATCH_END
};
// script, description, magic DWORD, adjust
-const SciScriptSignature hoyle4Signatures[] = {
- { 0, "port fix when disposing windows", PATCH_MAGICDWORD(0x64, 0x38, 0xC8, 0x00), -5, hoyle4SignaturePortFix, hoyle4PatchPortFix },
- { 0, NULL, 0, 0, NULL, NULL }
+const SciScriptSignature kq5Signatures[] = {
+ { 0, "CD: harpy volume change", PATCH_MAGICDWORD(0x80, 0x91, 0x01, 0x18), 0, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume },
+ SCI_SIGNATUREENTRY_TERMINATOR
};
-
+// ===========================================================================
// this is called on every death dialog. Problem is at least the german
// version of lsl6 gets title text that is far too long for the
// available temp space resulting in temp space corruption
@@ -300,9 +467,170 @@ const uint16 larry6PatchDeathDialog[] = {
// script, description, magic DWORD, adjust
const SciScriptSignature larry6Signatures[] = {
{ 82, "death dialog memory corruption", PATCH_MAGICDWORD(0x3e, 0x33, 0x01, 0x35), 0, larry6SignatureDeathDialog, larry6PatchDeathDialog },
- { 0, NULL, 0, 0, NULL, NULL }
+ SCI_SIGNATUREENTRY_TERMINATOR
};
+// ===========================================================================
+// rm560::doit was supposed to close the painting, when heimlich enters the
+// room. The code is buggy, so it actually closes the painting, when heimlich
+// is not in the room. We fix that.
+const byte laurabow2SignaturePaintingClosing[] = {
+ 17,
+ 0x4a, 0x04, // send 04 - read aHeimlich::room
+ 0x36, // push
+ 0x81, 0x0b, // lag global[11d] -> current room
+ 0x1c, // ne?
+ 0x31, 0x0e, // bnt [don't close]
+ 0x35, 0x00, // ldi 00
+ 0xa3, 0x00, // sal local[0]
+ 0x38, 0x92, 0x00, // pushi 0092
+ 0x78, // push1
+ 0x72, // lofsa sDumpSafe
+ 0
+};
+
+const uint16 laurabow2PatchPaintingClosing[] = {
+ PATCH_ADDTOOFFSET | +6,
+ 0x2f, 0x0e, // bt [don't close]
+ PATCH_END
+};
+
+// script, description, magic DWORD, adjust
+const SciScriptSignature laurabow2Signatures[] = {
+ { 560, "painting closing immediately", PATCH_MAGICDWORD(0x36, 0x81, 0x0b, 0x1c), -2, laurabow2SignaturePaintingClosing, laurabow2PatchPaintingClosing },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
+// Mother Goose SCI1/SCI1.1
+// MG::replay somewhat calculates the savedgame-id used when saving again
+// this doesn't work right and we remove the code completely.
+// We set the savedgame-id directly right after restoring in kRestoreGame.
+const byte mothergoose256SignatureReplay[] = {
+ 6,
+ 0x36, // push
+ 0x35, 0x20, // ldi 20
+ 0x04, // sub
+ 0xa1, 0xb3, // sag global[b3]
+ 0
+};
+
+const uint16 mothergoose256PatchReplay[] = {
+ 0x34, 0x00, 0x00, // ldi 0000 (dummy)
+ 0x34, 0x00, 0x00, // ldi 0000 (dummy)
+ PATCH_END
+};
+
+// when saving, it also checks if the savegame-id is below 13.
+// we change this to check if below 113 instead
+const byte mothergoose256SignatureSaveLimit[] = {
+ 5,
+ 0x89, 0xb3, // lsg global[b3]
+ 0x35, 0x0d, // ldi 0d
+ 0x20, // ge?
+ 0
+};
+
+const uint16 mothergoose256PatchSaveLimit[] = {
+ PATCH_ADDTOOFFSET | +2,
+ 0x35, 0x0d + SAVEGAMEID_OFFICIALRANGE_START, // ldi 113d
+ PATCH_END
+};
+
+// script, description, magic DWORD, adjust
+const SciScriptSignature mothergoose256Signatures[] = {
+ { 0, "replay save issue", PATCH_MAGICDWORD(0x20, 0x04, 0xa1, 0xb3), -2, mothergoose256SignatureReplay, mothergoose256PatchReplay },
+ { 0, "save limit dialog (SCI1.1)", PATCH_MAGICDWORD(0xb3, 0x35, 0x0d, 0x20), -1, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit },
+ { 994, "save limit dialog (SCI1)", PATCH_MAGICDWORD(0xb3, 0x35, 0x0d, 0x20), -1, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
+// script 215 of qfg1vga pointBox::doit actually processes button-presses
+// during fighting with monsters. It strangely also calls kGetEvent. Because
+// the main User::doit also calls kGetEvent it's pure luck, where the event
+// will hit. It's the same issue as in freddy pharkas and if you turn dos-box
+// to max cycles, sometimes clicks also won't get registered. Strangely it's
+// not nearly as bad as in our sci, but these differences may be caused by
+// timing.
+// We just reuse the active event, thus removing the duplicate kGetEvent call.
+const byte qfg1vgaSignatureFightEvents[] = {
+ 25,
+ 0x39, 0x6d, // pushi 6d (selector new)
+ 0x76, // push0
+ 0x51, 0x07, // class Event
+ 0x4a, 0x04, // send 04 - call Event::new
+ 0xa5, 0x00, // sat temp[0]
+ 0x78, // push1
+ 0x76, // push0
+ 0x4a, 0x04, // send 04 - read Event::x
+ 0xa5, 0x03, // sat temp[3]
+ 0x76, // push0 (selector y)
+ 0x76, // push0
+ 0x85, 0x00, // lat temp[0]
+ 0x4a, 0x04, // send 04 - read Event::y
+ 0x36, // push
+ 0x35, 0x0a, // ldi 0a
+ 0x04, // sub (poor mans localization) ;-)
+ 0
+};
+
+const uint16 qfg1vgaPatchFightEvents[] = {
+ 0x38, 0x5a, 0x01, // pushi 15a (selector curEvent)
+ 0x76, // push0
+ 0x81, 0x50, // lag global[50]
+ 0x4a, 0x04, // send 04 - read User::curEvent -> needs one byte more than previous code
+ 0xa5, 0x00, // sat temp[0]
+ 0x78, // push1
+ 0x76, // push0
+ 0x4a, 0x04, // send 04 - read Event::x
+ 0xa5, 0x03, // sat temp[3]
+ 0x76, // push0 (selector y)
+ 0x76, // push0
+ 0x85, 0x00, // lat temp[0]
+ 0x4a, 0x04, // send 04 - read Event::y
+ 0x39, 0x00, // pushi 00
+ 0x02, // add (waste 3 bytes) - we don't need localization, User::doit has already done it
+ PATCH_END
+};
+
+// script, description, magic DWORD, adjust
+const SciScriptSignature qfg1vgaSignatures[] = {
+ { 215, "fight event issue", PATCH_MAGICDWORD(0x6d, 0x76, 0x51, 0x07), -1, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents },
+ { 216, "weapon master event issue", PATCH_MAGICDWORD(0x6d, 0x76, 0x51, 0x07), -1, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
+// script 298 of sq4/floppy has an issue. object "nest" uses another property
+// which isn't included in property count. We return 0 in that case, the game
+// adds it to nest::x. The problem is that the script also checks if x exceeds
+// we never reach that of course, so the pterodactyl-flight will go endlessly
+// we could either calculate property count differently somehow fixing this
+// but I think just patching it out is cleaner (ffs. bug #3037938)
+const byte sq4FloppySignatureEndlessFlight[] = {
+ 8,
+ 0x39, 0x04, // pushi 04 (selector x)
+ 0x78, // push1
+ 0x67, 0x08, // pTos 08 (property x)
+ 0x63, 0x44, // pToa 44 (invalid property)
+ 0x02, // add
+ 0
+};
+
+const uint16 sq4FloppyPatchEndlessFlight[] = {
+ PATCH_ADDTOOFFSET | +5,
+ 0x35, 0x03, // ldi 03 (which would be the content of the property)
+ PATCH_END
+};
+
+// script, description, magic DWORD, adjust
+const SciScriptSignature sq4Signatures[] = {
+ { 298, "Floppy: endless flight", PATCH_MAGICDWORD(0x67, 0x08, 0x63, 0x44), -3, sq4FloppySignatureEndlessFlight, sq4FloppyPatchEndlessFlight },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
// It seems to scripts warp ego outside the screen somehow (or maybe kDoBresen?)
// ego::mover is set to 0 and rm119::doit will crash in that case. This here
// fixes part of the problem and actually checks ego::mover to be 0 and skips
@@ -319,8 +647,8 @@ const byte sq5SignatureScrubbing[] = {
0x39, 0x38, // pushi 38 (selector mover)
0x76, // push0
0x81, 0x00, // lag 00
- 0x4a, 0x04, // send 04 (read ego::mover)
- 0x4a, 0x04, // send 04 (read ego::mover::x)
+ 0x4a, 0x04, // send 04 - read ego::mover
+ 0x4a, 0x04, // send 04 - read ego::mover::x
0x36, // push
0x34, 0xa0, 0x00, // ldi 00a0
0x1c, // ne?
@@ -334,11 +662,11 @@ const uint16 sq5PatchScrubbing[] = {
0x39, 0x38, // pushi 38 (selector mover)
0x76, // push0
0x81, 0x00, // lag 00
- 0x4a, 0x04, // send 04 (read ego::mover)
+ 0x4a, 0x04, // send 04 - read ego::mover
0x31, 0x2e, // bnt 2e (jump if ego::mover is 0)
0x78, // push1 (selector x)
0x76, // push0
- 0x4a, 0x04, // send 04 (read ego::mover::x)
+ 0x4a, 0x04, // send 04 - read ego::mover::x
0x39, 0xa0, // pushi a0 (saving 2 bytes)
0x1c, // ne?
PATCH_END
@@ -347,7 +675,7 @@ const uint16 sq5PatchScrubbing[] = {
// script, description, magic DWORD, adjust
const SciScriptSignature sq5Signatures[] = {
{ 119, "scrubbing send crash", PATCH_MAGICDWORD(0x18, 0x31, 0x37, 0x78), 0, sq5SignatureScrubbing, sq5PatchScrubbing },
- { 0, NULL, 0, 0, NULL, NULL }
+ SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -361,6 +689,7 @@ void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scri
offset += patchWord & ~PATCH_ADDTOOFFSET;
} else if (patchWord & PATCH_GETORIGINALBYTE) {
// TODO: implement this
+ // Can be used to patch in some bytes from the original script into another location
} else {
scriptData[offset] = patchWord & 0xFF;
offset++;
@@ -380,7 +709,7 @@ int32 Script::findSignature(const SciScriptSignature *signature, const byte *scr
uint32 DWordOffset = 0;
// first search for the magic DWORD
while (DWordOffset < searchLimit) {
- if (magicDWord == *(const uint32 *)(scriptData + DWordOffset)) {
+ if (magicDWord == READ_UINT32(scriptData + DWordOffset)) {
// magic DWORD found, check if actual signature matches
uint32 offset = DWordOffset + signature->magicOffset;
uint32 byteOffset = offset;
@@ -410,17 +739,47 @@ int32 Script::findSignature(const SciScriptSignature *signature, const byte *scr
void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize) {
const SciScriptSignature *signatureTable = NULL;
- if (g_sci->getGameId() == GID_ECOQUEST)
+ switch (g_sci->getGameId()) {
+ case GID_ECOQUEST:
signatureTable = ecoquest1Signatures;
- if (g_sci->getGameId() == GID_GK1)
+ break;
+ case GID_ECOQUEST2:
+ signatureTable = ecoquest2Signatures;
+ break;
+ case GID_FREDDYPHARKAS:
+ signatureTable = freddypharkasSignatures;
+ break;
+ case GID_GK1:
signatureTable = gk1Signatures;
-// hoyle4 now works due workaround inside GfxPorts
-// if (g_sci->getGameId() == GID_HOYLE4)
-// signatureTable = hoyle4Signatures;
- if (g_sci->getGameId() == GID_LSL6)
+ break;
+ // hoyle4 now works due to workaround inside GfxPorts
+ //case GID_HOYLE4:
+ // signatureTable = hoyle4Signatures;
+ // break;
+ case GID_KQ5:
+ signatureTable = kq5Signatures;
+ break;
+ case GID_LAURABOW2:
+ signatureTable = laurabow2Signatures;
+ break;
+ case GID_LSL6:
signatureTable = larry6Signatures;
- if (g_sci->getGameId() == GID_SQ5)
+ break;
+ case GID_MOTHERGOOSE256:
+ signatureTable = mothergoose256Signatures;
+ break;
+ case GID_QFG1VGA:
+ signatureTable = qfg1vgaSignatures;
+ break;
+ case GID_SQ4:
+ signatureTable = sq4Signatures;
+ break;
+ case GID_SQ5:
signatureTable = sq5Signatures;
+ break;
+ default:
+ break;
+ }
if (signatureTable) {
while (signatureTable->data) {
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index 1fb37f458d..7fdd2d25ac 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -1052,7 +1052,7 @@ void SegManager::uninstantiateScriptSci0(int script_nr) {
reg_t reg = make_reg(segmentId, oldScriptHeader ? 2 : 0);
int objType, objLength = 0;
- // Make a pass over the object in order uninstantiate all superclasses
+ // Make a pass over the object in order to uninstantiate all superclasses
do {
reg.offset += objLength; // Step over the last checked object
diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h
index c8cb4cd203..3c7addfab2 100644
--- a/engines/sci/engine/segment.h
+++ b/engines/sci/engine/segment.h
@@ -227,8 +227,12 @@ enum ObjectOffsets {
class Object {
public:
Object() {
- _flags = 0;
_offset = getSciVersion() < SCI_VERSION_1_1 ? 0 : 5;
+ _flags = 0;
+ _baseObj = 0;
+ _baseVars = 0;
+ _baseMethod = 0;
+ _methodCount = 0;
}
~Object() { }
@@ -286,7 +290,7 @@ public:
bool isClass() const { return (getInfoSelector().offset & kInfoFlagClass); }
const Object *getClass(SegManager *segMan) const;
- void markAsClone() { setInfoSelector(make_reg(0, kInfoFlagClone)); }
+ void markAsClone() { setInfoSelector(make_reg(0, getInfoSelector().offset | kInfoFlagClone)); }
bool isClone() const { return (getInfoSelector().offset & kInfoFlagClone); }
void markAsFreed() { _flags |= OBJECT_FLAG_FREED; }
diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp
index f99a41e088..b31f52aa13 100644
--- a/engines/sci/engine/selector.cpp
+++ b/engines/sci/engine/selector.cpp
@@ -50,7 +50,7 @@ namespace Sci {
void Kernel::mapSelectors() {
// species
// superClass
- // -info-
+ FIND_SELECTOR2(_info_, "-info-");
FIND_SELECTOR(y);
FIND_SELECTOR(x);
FIND_SELECTOR(view);
@@ -86,7 +86,8 @@ void Kernel::mapSelectors() {
// window
FIND_SELECTOR(cursor);
FIND_SELECTOR(max);
- // mark
+ FIND_SELECTOR(mark);
+ FIND_SELECTOR(sort);
// who
FIND_SELECTOR(message);
// edit
@@ -164,7 +165,6 @@ void Kernel::mapSelectors() {
FIND_SELECTOR(vanishingX);
FIND_SELECTOR(vanishingY);
FIND_SELECTOR(iconIndex);
- FIND_SELECTOR(port);
#ifdef ENABLE_SCI32
FIND_SELECTOR(data);
diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h
index 00e795c1b9..98157c3eaf 100644
--- a/engines/sci/engine/selector.h
+++ b/engines/sci/engine/selector.h
@@ -40,6 +40,7 @@ struct SelectorCache {
}
// Statically defined selectors, (almost the) same in all SCI versions
+ Selector _info_;
Selector y;
Selector x;
Selector view, loop, cel; ///< Description of a specific image
@@ -58,7 +59,9 @@ struct SelectorCache {
Selector state, font, type;///< Used by controls
// window
Selector cursor, max; ///< Used by EditControl
- // mark, who
+ Selector mark; //< Used by list controls
+ Selector sort; //< Used by list controls (script internal, is needed by us for QfG3 import room)
+ // who
Selector message; ///< Used by GetEvent
// edit
Selector play; ///< Play function (first function to be called)
@@ -127,8 +130,6 @@ struct SelectorCache {
// SCI1.1 Mac icon bar selectors
Selector iconIndex; ///< Used to index icon bar objects
- Selector port; // used by a hoyle 4 workaround
-
#ifdef ENABLE_SCI32
Selector data; // Used by Array()/String()
Selector picture; // Used to hold the picture ID for SCI32 pictures
diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp
index a069344d61..732f075257 100644
--- a/engines/sci/engine/state.cpp
+++ b/engines/sci/engine/state.cpp
@@ -110,6 +110,10 @@ void EngineState::reset(bool isRestoring) {
_lastSaveVirtualId = SAVEGAMEID_OFFICIALRANGE_START;
_lastSaveNewId = 0;
+ _chosenQfGImportItem = 0;
+
+ _cursorWorkaroundActive = false;
+
scriptStepCounter = 0;
scriptGCInterval = GC_INTERVAL;
}
@@ -251,7 +255,7 @@ kLanguage SciEngine::getSciLanguage() {
lang = K_LANG_ENGLISH;
if (SELECTOR(printLang) != -1) {
- lang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(printLang));
+ lang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gameObjectAddress, SELECTOR(printLang));
if ((getSciVersion() >= SCI_VERSION_1_1) || (lang == K_LANG_NONE)) {
// If language is set to none, we use the language from the game detector.
@@ -292,7 +296,7 @@ kLanguage SciEngine::getSciLanguage() {
void SciEngine::setSciLanguage(kLanguage lang) {
if (SELECTOR(printLang) != -1)
- writeSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(printLang), lang);
+ writeSelectorValue(_gamestate->_segMan, _gameObjectAddress, SELECTOR(printLang), lang);
}
void SciEngine::setSciLanguage() {
@@ -304,7 +308,7 @@ Common::String SciEngine::strSplit(const char *str, const char *sep) {
kLanguage subLang = K_LANG_NONE;
if (SELECTOR(subtitleLang) != -1) {
- subLang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(subtitleLang));
+ subLang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gameObjectAddress, SELECTOR(subtitleLang));
}
kLanguage secondLang;
@@ -327,7 +331,7 @@ Common::String SciEngine::strSplit(const char *str, const char *sep) {
void SciEngine::checkVocabularySwitch() {
uint16 parserLanguage = 1;
if (SELECTOR(parseLang) != -1)
- parserLanguage = readSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(parseLang));
+ parserLanguage = readSelectorValue(_gamestate->_segMan, _gameObjectAddress, SELECTOR(parseLang));
if (parserLanguage != _vocabularyLanguage) {
delete _vocabulary;
diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h
index 4f1d686b17..d0ddd5ca06 100644
--- a/engines/sci/engine/state.h
+++ b/engines/sci/engine/state.h
@@ -59,17 +59,23 @@ enum AbortGameState {
class DirSeeker {
protected:
reg_t _outbuffer;
- Common::StringArray _savefiles;
+ Common::StringArray _files;
+ Common::StringArray _virtualFiles;
Common::StringArray::const_iterator _iter;
public:
DirSeeker() {
_outbuffer = NULL_REG;
- _iter = _savefiles.begin();
+ _iter = _files.begin();
}
reg_t firstFile(const Common::String &mask, reg_t buffer, SegManager *segMan);
reg_t nextFile(SegManager *segMan);
+
+ Common::String getVirtualFilename(uint fileNumber);
+
+private:
+ void addAsVirtualFiles(Common::String title, Common::String fileMask);
};
enum {
@@ -80,11 +86,11 @@ enum {
MAX_SAVEGAME_NR = 20 /**< Maximum number of savegames */
};
-// We assume that scripts give us savegameId 0->999 for creating a new save slot
-// and savegameId 1000->1999 for existing save slots ffs. kfile.cpp
+// We assume that scripts give us savegameId 0->99 for creating a new save slot
+// and savegameId 100->199 for existing save slots ffs. kfile.cpp
enum {
- SAVEGAMEID_OFFICIALRANGE_START = 1000,
- SAVEGAMEID_OFFICIALRANGE_END = 1999
+ SAVEGAMEID_OFFICIALRANGE_START = 100,
+ SAVEGAMEID_OFFICIALRANGE_END = 199
};
enum {
@@ -136,8 +142,14 @@ public:
DirSeeker _dirseeker;
- uint _lastSaveVirtualId; // last virtual id fed to kSaveGame, if no kGetSaveFiles was called inbetween
- uint _lastSaveNewId; // last newly created filename-id by kSaveGame
+ int16 _lastSaveVirtualId; // last virtual id fed to kSaveGame, if no kGetSaveFiles was called inbetween
+ int16 _lastSaveNewId; // last newly created filename-id by kSaveGame
+
+ uint _chosenQfGImportItem; // Remembers the item selected in QfG import rooms
+
+ bool _cursorWorkaroundActive; // ffs. GfxCursor::setPosition()
+ Common::Point _cursorWorkaroundPoint;
+ Common::Rect _cursorWorkaroundRect;
public:
/* VM Information */
diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp
index aae6de01f1..a65c35b69c 100644
--- a/engines/sci/engine/static_selectors.cpp
+++ b/engines/sci/engine/static_selectors.cpp
@@ -27,6 +27,7 @@
// them. This includes the King's Quest IV Demo and LSL3 Demo.
#include "sci/engine/kernel.h"
+#include "sci/engine/seg_manager.h"
namespace Sci {
@@ -118,6 +119,7 @@ static const SelectorRemap sciSelectorRemap[] = {
{ SCI_VERSION_1_1, SCI_VERSION_1_1, "maxScale", 106 },
{ SCI_VERSION_1_1, SCI_VERSION_1_1, "vanishingX", 107 },
{ SCI_VERSION_1_1, SCI_VERSION_1_1, "vanishingY", 108 },
+ { SCI_VERSION_1_1, SCI_VERSION_2_1, "-info-",4103 },
{ SCI_VERSION_NONE, SCI_VERSION_NONE, 0, 0 }
};
@@ -133,8 +135,12 @@ Common::StringArray Kernel::checkStaticSelectorNames() {
// Resize the list of selector names and fill in the SCI 0 names.
names.resize(count);
- for (int i = 0; i < offset; i++)
- names[i].clear();
+ if (getSciVersion() < SCI_VERSION_1_1) {
+ // Fill selectors 0 - 2 for SCI0 - SCI1 late
+ names[0] = "species";
+ names[1] = "superClass";
+ names[2] = "-info-";
+ }
if (getSciVersion() <= SCI_VERSION_1_1) {
// SCI0 - SCI11
@@ -158,6 +164,83 @@ Common::StringArray Kernel::checkStaticSelectorNames() {
}
}
+ // Now, we need to find out selectors which keep changing place...
+ // We do that by dissecting game objects, and looking for selectors at
+ // specified locations.
+
+ // We need to initialize script 0 here, to make sure that it's always
+ // located at segment 1.
+ _segMan->instantiateScript(0);
+
+ // The Actor class contains the init, xLast and yLast selectors, which
+ // we reference directly. It's always in script 998, so we need to
+ // explicitly load it here.
+ if (_resMan->testResource(ResourceId(kResourceTypeScript, 998))) {
+ _segMan->instantiateScript(998);
+
+ const Object *actorClass = _segMan->getObject(_segMan->findObjectByName("Actor"));
+
+ if (actorClass) {
+ // The init selector is always the first function
+ int initSelectorPos = actorClass->getFuncSelector(0);
+
+ if (names.size() < (uint32)initSelectorPos + 1)
+ names.resize((uint32)initSelectorPos + 1);
+
+ names[initSelectorPos] = "init";
+ // dispose comes right after init
+ names[initSelectorPos + 1] = "dispose";
+
+ if ((getSciVersion() >= SCI_VERSION_1_EGA)) {
+ // Find the xLast and yLast selectors, used in kDoBresen
+
+ // xLast and yLast always come between illegalBits and xStep
+ int illegalBitsSelectorPos = actorClass->locateVarSelector(_segMan, 15 + offset); // illegalBits
+ int xStepSelectorPos = actorClass->locateVarSelector(_segMan, 51 + offset); // xStep
+ if (xStepSelectorPos - illegalBitsSelectorPos != 3) {
+ error("illegalBits and xStep selectors aren't found in "
+ "known locations. illegalBits = %d, xStep = %d",
+ illegalBitsSelectorPos, xStepSelectorPos);
+ }
+
+ int xLastSelectorPos = actorClass->getVarSelector(illegalBitsSelectorPos + 1);
+ int yLastSelectorPos = actorClass->getVarSelector(illegalBitsSelectorPos + 2);
+
+ if (names.size() < (uint32)yLastSelectorPos + 1)
+ names.resize((uint32)yLastSelectorPos + 1);
+
+ names[xLastSelectorPos] = "xLast";
+ names[yLastSelectorPos] = "yLast";
+ } // if ((getSciVersion() >= SCI_VERSION_1_EGA))
+ } // if (actorClass)
+
+ _segMan->uninstantiateScript(998);
+ } // if (_resMan->testResource(ResourceId(kResourceTypeScript, 998)))
+
+ if (_resMan->testResource(ResourceId(kResourceTypeScript, 981))) {
+ // The SysWindow class contains the open selectors, which we
+ // reference directly. It's always in script 981, so we need to
+ // explicitly load it here
+ _segMan->instantiateScript(981);
+
+ const Object *sysWindowClass = _segMan->getObject(_segMan->findObjectByName("SysWindow"));
+
+ if (sysWindowClass) {
+ if (sysWindowClass->getMethodCount() < 2)
+ error("The SysWindow class has less than 2 methods");
+
+ // The open selector is always the second function
+ int openSelectorPos = sysWindowClass->getFuncSelector(1);
+
+ if (names.size() < (uint32)openSelectorPos + 1)
+ names.resize((uint32)openSelectorPos + 1);
+
+ names[openSelectorPos] = "open";
+ }
+
+ _segMan->uninstantiateScript(981);
+ } // if (_resMan->testResource(ResourceId(kResourceTypeScript, 981)))
+
if (g_sci->getGameId() == GID_HOYLE4) {
// The demo of Hoyle 4 is one of the few demos with lip syncing and no selector vocabulary.
// This needs two selectors, "syncTime" and "syncCue", which keep changing positions in each
@@ -168,21 +251,20 @@ Common::StringArray Kernel::checkStaticSelectorNames() {
names[274] = "syncTime";
names[275] = "syncCue";
- } else if (g_sci->getGameId() == GID_ISLANDBRAIN) {
- // The demo of Island of Dr. Brain needs the init selector set to match up with the full
- // game's workaround - bug #3035033
- if (names.size() < 111)
- names.resize(111);
+ } else if (g_sci->getGameId() == GID_PEPPER) {
+ // Same as above for the non-interactive demo of Pepper
+ if (names.size() < 265)
+ names.resize(265);
- names[110] = "init";
+ names[263] = "syncTime";
+ names[264] = "syncCue";
} else if (g_sci->getGameId() == GID_LAURABOW2) {
- // The floppy of version needs the open and changeState selectors set to match up with the
- // CD version's workarounds - bugs #3035694 and #3036291
- if (names.size() < 190)
- names.resize(190);
+ // The floppy of version needs the changeState selector set to match up with the
+ // CD version's workarounds.
+ if (names.size() < 251)
+ names.resize(251);
names[144] = "changeState";
- names[189] = "open";
}
#ifdef ENABLE_SCI32
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index 7c989e43f4..b03b1a8f20 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -295,7 +295,7 @@ bool SciEngine::checkExportBreakpoint(uint16 script, uint16 pubfunct) {
_console->DebugPrintf("Break on script %d, export %d\n", script, pubfunct);
_debugState.debugging = true;
_debugState.breakpointWasHit = true;
- return true;;
+ return true;
}
}
}
@@ -366,27 +366,24 @@ struct CallsStruct {
int type; /**< Same as ExecStack.type */
};
-bool SciEngine::checkSelectorBreakpoint(reg_t send_obj, int selector) {
- if (_debugState._activeBreakpointTypes & BREAK_SELECTOR) {
- char method_name[256];
+bool SciEngine::checkSelectorBreakpoint(BreakpointType breakpointType, reg_t send_obj, int selector) {
+ char method_name[256];
- sprintf(method_name, "%s::%s", _gamestate->_segMan->getObjectName(send_obj), getKernel()->getSelectorName(selector).c_str());
+ sprintf(method_name, "%s::%s", _gamestate->_segMan->getObjectName(send_obj), getKernel()->getSelectorName(selector).c_str());
- Common::List<Breakpoint>::const_iterator bp;
- for (bp = _debugState._breakpoints.begin(); bp != _debugState._breakpoints.end(); ++bp) {
- int cmplen = bp->name.size();
- if (bp->name.lastChar() != ':')
- cmplen = 256;
+ Common::List<Breakpoint>::const_iterator bp;
+ for (bp = _debugState._breakpoints.begin(); bp != _debugState._breakpoints.end(); ++bp) {
+ int cmplen = bp->name.size();
+ if (bp->name.lastChar() != ':')
+ cmplen = 256;
- if (bp->type == BREAK_SELECTOR && !strncmp(bp->name.c_str(), method_name, cmplen)) {
- _console->DebugPrintf("Break on %s (in [%04x:%04x])\n", method_name, PRINT_REG(send_obj));
- _debugState.debugging = true;
- _debugState.breakpointWasHit = true;
- return true;
- }
+ if (bp->type == breakpointType && !strncmp(bp->name.c_str(), method_name, cmplen)) {
+ _console->DebugPrintf("Break on %s (in [%04x:%04x])\n", method_name, PRINT_REG(send_obj));
+ _debugState.debugging = true;
+ _debugState.breakpointWasHit = true;
+ return true;
}
}
-
return false;
}
@@ -399,12 +396,13 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt
int selector;
int argc;
int origin = s->_executionStack.size()-1; // Origin: Used for debugging
- bool printSendActions = false;
// We return a pointer to the new active ExecStack
// The selector calls we catch are stored below:
Common::Stack<CallsStruct> sendCalls;
+ int activeBreakpointTypes = g_sci->_debugState._activeBreakpointTypes;
+
while (framesize > 0) {
selector = validate_arithmetic(*argp++);
argc = validate_arithmetic(*argp);
@@ -413,9 +411,6 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt
error("send_selector(): More than 0x800 arguments to function call");
}
- // Check if a breakpoint is set on this method
- printSendActions = g_sci->checkSelectorBreakpoint(send_obj, selector);
-
#ifdef VM_DEBUG_SEND
printf("Send to %04x:%04x (%s), selector %04x (%s):", PRINT_REG(send_obj),
s->_segMan->getObjectName(send_obj), selector,
@@ -439,18 +434,23 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt
// argc == 0: read selector
// argc != 0: write selector
- if (printSendActions && !argc) { // read selector
- debug("[read selector]\n");
- printSendActions = false;
- }
-
- if (printSendActions && argc) {
- reg_t oldReg = *varp.getPointer(s->_segMan);
- reg_t newReg = argp[1];
- warning("[write to selector (%s:%s): change %04x:%04x to %04x:%04x]\n",
- s->_segMan->getObjectName(send_obj), g_sci->getKernel()->getSelectorName(selector).c_str(),
- PRINT_REG(oldReg), PRINT_REG(newReg));
- printSendActions = false;
+ if (!argc) {
+ // read selector
+ if (activeBreakpointTypes & BREAK_SELECTORREAD) {
+ if (g_sci->checkSelectorBreakpoint(BREAK_SELECTORREAD, send_obj, selector))
+ debug("[read selector]\n");
+ }
+ } else {
+ // write selector
+ if (activeBreakpointTypes & BREAK_SELECTORWRITE) {
+ if (g_sci->checkSelectorBreakpoint(BREAK_SELECTORWRITE, send_obj, selector)) {
+ reg_t oldReg = *varp.getPointer(s->_segMan);
+ reg_t newReg = argp[1];
+ warning("[write to selector (%s:%s): change %04x:%04x to %04x:%04x]\n",
+ s->_segMan->getObjectName(send_obj), g_sci->getKernel()->getSelectorName(selector).c_str(),
+ PRINT_REG(oldReg), PRINT_REG(newReg));
+ }
+ }
}
if (argc > 1) {
@@ -482,7 +482,35 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt
case kSelectorMethod:
-#ifdef VM_DEBUG_SEND
+#ifndef VM_DEBUG_SEND
+ if (activeBreakpointTypes & BREAK_SELECTOREXEC) {
+ if (g_sci->checkSelectorBreakpoint(BREAK_SELECTOREXEC, send_obj, selector)) {
+ printf("[execute selector]");
+
+ int displaySize = 0;
+ for (int argNr = 1; argNr <= argc; argNr++) {
+ if (argNr == 1)
+ printf(" - ");
+ reg_t curParam = argp[argNr];
+ if (curParam.segment) {
+ printf("[%04x:%04x] ", PRINT_REG(curParam));
+ displaySize += 12;
+ } else {
+ printf("[%04x] ", curParam.offset);
+ displaySize += 7;
+ }
+ if (displaySize > 50) {
+ if (argNr < argc)
+ printf("...");
+ break;
+ }
+ }
+ printf("\n");
+ }
+ }
+#else // VM_DEBUG_SEND
+ if (activeBreakpointTypes & BREAK_SELECTOREXEC)
+ g_sci->checkSelectorBreakpoint(BREAK_SELECTOREXEC, send_obj, selector);
printf("Funcselector(");
for (int i = 0; i < argc; i++) {
printf("%04x:%04x", PRINT_REG(argp[i+1]));
@@ -491,31 +519,6 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt
}
printf(") at %04x:%04x\n", PRINT_REG(funcp));
#endif // VM_DEBUG_SEND
- if (printSendActions) {
- printf("[invoke selector]");
-#ifndef VM_DEBUG_SEND
- int displaySize = 0;
- for (int argNr = 1; argNr <= argc; argNr++) {
- if (argNr == 1)
- printf(" - ");
- reg_t curParam = argp[argNr];
- if (curParam.segment) {
- printf("[%04x:%04x] ", PRINT_REG(curParam));
- displaySize += 12;
- } else {
- printf("[%04x] ", curParam.offset);
- displaySize += 7;
- }
- if (displaySize > 50) {
- if (argNr < argc)
- printf("...");
- break;
- }
- }
-#endif
- printf("\n");
- printSendActions = false;
- }
{
CallsStruct call;
@@ -817,7 +820,7 @@ int readPMachineInstruction(const byte *src, byte &extOpcode, int16 opparams[4])
for (int i = 0; g_opcode_formats[opcode][i]; ++i) {
//printf("Opcode: 0x%x, Opnumber: 0x%x, temp: %d\n", opcode, opcode, temp);
- assert(i < 4);
+ assert(i < 3);
switch (g_opcode_formats[opcode][i]) {
case Script_Byte:
@@ -911,7 +914,7 @@ void run_vm(EngineState *s) {
g_sci->_debugState.old_pc_offset = s->xs->addr.pc.offset;
g_sci->_debugState.old_sp = s->xs->sp;
- if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit())
+ if (s->abortScriptProcessing != kAbortNone)
return; // Stop processing
if (s->_executionStackPosChanged) {
@@ -942,7 +945,7 @@ void run_vm(EngineState *s) {
s->variables[VAR_PARAM] = s->xs->variables_argp;
}
- if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit())
+ if (s->abortScriptProcessing != kAbortNone)
return; // Stop processing
// Debug if this has been requested:
@@ -1319,7 +1322,7 @@ void run_vm(EngineState *s) {
if (validate_unsignedInteger(r_temp, compare1) && validate_unsignedInteger(s->r_acc, compare2))
s->r_acc = make_reg(0, compare1 < compare2);
else
- s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc);
+ s->r_acc = arithmetic_lookForWorkaround(opcode, opcodeUltWorkarounds, r_temp, s->r_acc);
}
break;
@@ -1442,7 +1445,7 @@ void run_vm(EngineState *s) {
s->_executionStackPosChanged = true;
// If a game is being loaded, stop processing
- if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit())
+ if (s->abortScriptProcessing != kAbortNone)
return; // Stop processing
break;
@@ -1796,13 +1799,17 @@ void run_vm(EngineState *s) {
case op_lagi: // 0x48 (72)
case op_lali: // 0x49 (73)
case op_lati: // 0x4a (74)
- case op_lapi: // 0x4b (75)
+ case op_lapi: { // 0x4b (75)
// Load global, local, temp or param variable into the accumulator,
// using the accumulator as an additional index
var_type = opcode & 0x3; // Gets the variable type: g, l, t or p
- var_number = opparams[0] + signed_validate_arithmetic(s->r_acc);
+ int16 value;
+ if (!validate_signedInteger(s->r_acc, value))
+ value = arithmetic_lookForWorkaround(opcode, opcodeLaiWorkarounds, s->r_acc, NULL_REG).offset;
+ var_number = opparams[0] + value;
s->r_acc = READ_VAR(var_type, var_number);
break;
+ }
case op_lsgi: // 0x4c (76)
case op_lsli: // 0x4d (77)
diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp
index 013858dbcc..8e3640c490 100644
--- a/engines/sci/engine/workarounds.cpp
+++ b/engines/sci/engine/workarounds.cpp
@@ -48,6 +48,8 @@ const SciWorkaroundEntry opcodeDptoaWorkarounds[] = {
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry opcodeGeWorkarounds[] = {
+ { GID_HOYLE1, 5, 213, 0, "", "export 0", -1, 0, { WORKAROUND_FAKE, 1 } }, // happens sometimes during cribbage - bug #3038433
+ { GID_MOTHERGOOSE256, 4, 998, 0, "door", "setCel", -1, 0, { WORKAROUND_FAKE, 1 } }, // after giving the king his pipe back, listening to his song and leaving the castle - bug #3051475
{ GID_PQ3, 31, 31, 0, "rm031", "init", -1, 0, { WORKAROUND_FAKE, 1 } }, // pq3 english: when exiting the car, while morales is making phonecalls - bug #3037565
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -59,6 +61,18 @@ const SciWorkaroundEntry opcodeLeWorkarounds[] = {
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
+const SciWorkaroundEntry opcodeUltWorkarounds[] = {
+ { GID_HOYLE3, 400, 0, 1, "Character", "say", -1, 0, { WORKAROUND_FAKE, 0 } }, // While playing Pachisi, when any character starts to talk - bug #3038837
+ SCI_WORKAROUNDENTRY_TERMINATOR
+};
+
+// gameID, room,script,lvl, object-name, method-name, call,index, workaround
+const SciWorkaroundEntry opcodeLaiWorkarounds[] = {
+ { GID_CAMELOT, 92, 92, 0, "endingCartoon2", "changeState", 0x20d, 0, { WORKAROUND_FAKE, 0 } }, // during the ending, sub gets called with no parameters, uses parameter 1 which is theGrail in this case - bug #3044734
+ SCI_WORKAROUNDENTRY_TERMINATOR
+};
+
+// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry opcodeLsiWorkarounds[] = {
{ GID_QFG2, 200, 200, 0, "astro", "messages", -1, 0, { WORKAROUND_FAKE, 0 } }, // when getting asked for your name by the astrologer bug #3039879
SCI_WORKAROUNDENTRY_TERMINATOR
@@ -72,21 +86,22 @@ const SciWorkaroundEntry opcodeMulWorkarounds[] = {
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry opcodeAndWorkarounds[] = {
- { GID_MOTHERGOOSE, -1, 999, 0, "Event", "new", -1, 0, { WORKAROUND_FAKE, 0 } }, // constantly during the game
+ { GID_MOTHERGOOSE256, -1, 999, 0, "Event", "new", -1, 0, { WORKAROUND_FAKE, 0 } }, // constantly during the game
+ // ^^ TODO: which of the mother goose versions is affected by this? EGA? SCI1? SCI1.1?
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry opcodeOrWorkarounds[] = {
- { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464
+ { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464
+ { GID_MOTHERGOOSE256, -1, 4, 0, "rm004", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // when going north and reaching the castle (rooms 4 and 37) - bug #3038228
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_CASTLEBRAIN, 280, 280, 0, "programmer", "dispatchEvent", -1, 0, { WORKAROUND_FAKE, 0xf } }, // pressing 'q' on the computer screen in the robot room, and closing the help dialog that pops up (bug #3039656). Moves the cursor to the view with the ID returned (in this case, the robot hand)
- { GID_CNICK_KQ, 200, 0, 1, "Character", "<noname446>", -1, 504, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3
- { GID_CNICK_KQ, 200, 0, 1, "Character", "<noname446>", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3
+ { GID_CNICK_KQ, 200, 0, 1, "Character", "<noname446>", -1, -1, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 - temps 504 and 505
{ GID_CNICK_KQ, -1, 700, 0, "gcWindow", "<noname183>", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3
{ GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "<noname110>", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game
{ GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms
@@ -94,32 +109,35 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_FANMADE, 528, 990, 0, "GDialog", "doit", -1, 4, { WORKAROUND_FAKE, 0 } }, // Happens in Cascade Quest when closing the glossary - bug #3038757
{ GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu
{ GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu
+ { GID_FREDDYPHARKAS, 540, 540, 0, "WaverCode", "init", -1, -1, { WORKAROUND_FAKE, 0 } }, // Gun pratice mini-game (bug #3044218)
{ GID_GK1, -1, 64950, -1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking
{ GID_GK2, -1, 11, 0, "", "export 10", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when the game starts
{ GID_GK2, -1, 11, 0, "", "export 10", -1, 4, { WORKAROUND_FAKE, 0 } }, // called during the game
{ GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { WORKAROUND_FAKE, 0 } }, // Gin Rummy / right when the game starts
{ GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { WORKAROUND_FAKE, 0 } }, // Cribbage / during the game
- { GID_HOYLE3, -1, 0, 1, "Character", "say", -1, 504, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something
- { GID_HOYLE3, -1, 0, 1, "Character", "say", -1, 505, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something
+ { GID_HOYLE1, 3, 16, 0, "", "export 0", 0x37c, 3, { WORKAROUND_FAKE, 0 } }, // Hearts / during the game - bug #3052359
+ { GID_HOYLE3, -1, 0, 1, "Character", "say", -1, -1, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something - temps 504 and 505
{ GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu
{ GID_HOYLE3, 100, 100, 0, "dominoHand2", "cue", -1, 1, { WORKAROUND_FAKE, 0 } }, // while playing domino - bug #3036918
{ GID_HOYLE4, -1, 0, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when selecting "Control" from the menu (temp vars 0-3) - bug #3039294
+ { GID_HOYLE4, 910, 18, 0, "Tray", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // during tutorial - bug #3042756
{ GID_HOYLE4, 910, 910, 0, "IconBarList", "setup", -1, 3, { WORKAROUND_FAKE, 0 } }, // when selecting "Tutorial" from the main menu - bug #3039294
+ { GID_ISLANDBRAIN, 100, 937, 0, "IconBar", "dispatchEvent", -1, 58, { WORKAROUND_FAKE, 0 } }, // when using ENTER at the startup menu - bug #3045225
{ GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0
{ GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon
{ GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { WORKAROUND_FAKE, 0 } }, // jones/cd only - gets called during the game
- { GID_JONES, 1, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/cd only - called when a game ends
- { GID_JONES, 1, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/cd only - called when a game ends
- { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts
- { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts
- { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio - bug #3034700
+ { GID_JONES, 1, 255, 0, "", "export 0", -1, -1, { WORKAROUND_FAKE, 0 } }, // jones/cd only - called when a game ends, temps 13 and 14
+ { GID_JONES, 764, 255, 0, "", "export 0", -1, -1, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts, temps 13 and 14
+ //{ GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0xf } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio - bug #3034700
+ // ^^ shouldn't be needed anymore, we got a script patch instead (kq5PatchCdHarpyVolume)
{ GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is
- { GID_KQ5, 55, 55, 0, "helpScript", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // when giving the tambourine to the monster in the labyrinth (only happens at one of the locations) - bug #3041262
+ { GID_KQ5, 55, 55, 0, "helpScript", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // when giving the tambourine to the monster in the labyrinth (only happens at one of the locations) - bug #3041262
{ GID_KQ6, -1, 30, 0, "rats", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs (temps 1 - 5) - bugs #3034597, #3035495, #3035824
{ GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room - bug #3034565
{ GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast
{ GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle
{ GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc)
+ { GID_KQ6, -1, 907, 0, "tomato", "doVerb", -1, 2, { WORKAROUND_FAKE, 0 } }, // when looking at the rotten tomato in the inventory - bug #3059544
{ GID_KQ7, 30, 64996, 0, "User", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key
{ GID_LAURABOW, 37, 0, 0, "CB1", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when going up the stairs (bug #3037694)
{ GID_LAURABOW, -1, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // having any portrait conversation coming up (initial bug #3034985)
@@ -127,6 +145,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0x7fff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #3035068, #3036274
{ GID_LAURABOW2, -1, 90, 1, "MuseumActor", "init", -1, 6, { WORKAROUND_FAKE, 0 } }, // Random actors in museum (bug #3041257)
{ GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291
+ { GID_LONGBOW, -1, 0, 0, "Longbow", "restart", -1, 0, { WORKAROUND_FAKE, 0 } }, // When canceling a restart game - bug #3046200
{ GID_LONGBOW, -1, 213, 0, "clear", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When giving an answer using the druid hand sign code in any room
{ GID_LONGBOW, -1, 213, 0, "letter", "handleEvent", 0xa8, 1, { WORKAROUND_FAKE, 0 } }, // When using the druid hand sign code in any room - bug #3036601
{ GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet
@@ -140,32 +159,38 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup
{ GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area
{ GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game
- { GID_MOTHERGOOSE, 18, 992, 0, "AIPath", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // DEMO: Called when walking north from mother goose's house two screens
+ { GID_MOTHERGOOSE256, -1, 0, 0, "MG", "doit", -1, 5, { WORKAROUND_FAKE, 0 } }, // SCI1.1: When moving the cursor all the way to the left during the game (bug #3043955)
+ { GID_MOTHERGOOSE256, -1, 992, 0, "AIPath", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // Happens in the demo and full version. In the demo, it happens when walking two screens from mother goose's house to the north. In the full version, it happens in rooms 7 and 23 - bug #3049146
+ { GID_MOTHERGOOSE256, 94, 94, 0, "sunrise", "changeState", -1, 367, { WORKAROUND_FAKE, 0 } }, // At the very end, after the game is completed - bug #3051163
{ GID_MOTHERGOOSEHIRES,-1,64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // right when clicking on a child at the start and probably also later
{ GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above
{ GID_PEPPER, -1, 894, 0, "Package", "doVerb", -1, 3, { WORKAROUND_FAKE, 0 } }, // using the hand on the book in the inventory - bug #3040012
+ { GID_PEPPER, 150, 928, 0, "Narrator", "<noname538>", -1, 0, { WORKAROUND_FAKE, 0 } }, // happens during the non-interactive demo of Pepper
{ GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbd0, 0, { WORKAROUND_FAKE, 0 } }, // hq1: going to the brigands hideout
{ GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbe4, 0, { WORKAROUND_FAKE, 0 } }, // qfg1: going to the brigands hideout
+ { GID_QFG1VGA, 16, 16, 0, "lassoFailed", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // qfg1vga: casting the "fetch" spell in the screen with the flowers, temps 0 and 1 - bug #3053268
{ GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory
{ GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367
{ GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when pressing enter in restore dialog w/o any saved games present
{ GID_QFG2, 260, 260, 0, "abdulS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before Abdul is about to enter the house (where you have to hide in the wardrobe), bug #3039891, temps 1 and 2
{ GID_QFG2, 260, 260, 0, "jabbarS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before Jabbar is about to enter the house (where you have to hide in the wardrobe), bug #3040469, temps 1 and 2
+ { GID_QFG3, 510, 510, 0, "awardPrize", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Simbani warrior challenge, after throwing the spears and retrieving the ring - bug #3049435
{ GID_QFG3, 140, 140, 0, "rm140", "init", 0x1008, 0, { WORKAROUND_FAKE, 0 } }, // when importing a character and selecting the previous profession - bug #3040460
{ GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1)
{ GID_QFG3, 700, 700, -1, "monsterIsDead", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // in the jungle, after winning any fight, bug #3040624
{ GID_QFG3, 470, 470, -1, "rm470", "notify", -1, 0, { WORKAROUND_FAKE, 0 } }, // closing the character screen in the Simbani village in the room with the bridge, bug #3040565
{ GID_QFG3, 490, 490, -1, "computersMove", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // when finishing awari game, bug #3040579
+ { GID_QFG3, 851, 32, -1, "ProjObj", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // near the end, when throwing the spear of death, bug #3050122
{ GID_QFG4, -1, 15, -1, "charInitScreen", "dispatchEvent", -1, 5, { WORKAROUND_FAKE, 0 } }, // floppy version, when viewing the character screen
{ GID_QFG4, -1, 64917, -1, "controlPlane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, when entering the game menu
{ GID_QFG4, -1, 64917, -1, "Plane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, happen sometimes in fights
{ GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, -1, { WORKAROUND_FAKE, 0 } }, // Spanish (and maybe early versions?) only: when moving cursor over input pad, temps 1 and 2
{ GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser
{ GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens)
- { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // sq4cd: called when rummaging in Software Excess bargain bin
- { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // sq4cd: method returns this to the caller
+ { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // CD: called when rummaging in Software Excess bargain bin
+ { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // CD: method returns this to the caller
{ GID_SQ5, 201, 201, 0, "buttonPanel", "doVerb", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking at the orange or red button - bug #3038563
- { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // called when the game starts
+ { GID_SQ6, -1, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // Demo and full version: called when the game starts (demo: room 0, full: room 100)
{ GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu
{ GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game
SCI_WORKAROUNDENTRY_TERMINATOR
@@ -185,6 +210,7 @@ const SciWorkaroundEntry kCelHigh_workarounds[] = {
{ GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003
{ GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects
{ GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720
+ { GID_FANMADE, -1, 979, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // In The Gem Scenario and perhaps other fanmade games, this is called with 2nd/3rd parameters as objects - bug #3039679
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -193,6 +219,7 @@ const SciWorkaroundEntry kCelWide_workarounds[] = {
{ GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003
{ GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects
{ GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720
+ { GID_FANMADE, -1, 979, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // In The Gem Scenario and perhaps other fanmade games, this is called with 2nd/3rd parameters as objects - bug #3039679
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -213,13 +240,21 @@ const SciWorkaroundEntry kDeviceInfo_workarounds[] = {
const SciWorkaroundEntry kDisplay_workarounds[] = {
{ GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object
{ GID_PQ2, 23, 23, 0, "rm23Script", "elements", 0x4ae, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the 2nd page of pate's file - 0x75 as id
+ { GID_PQ2, 23, 23, 0, "rm23Script", "elements", 0x4c1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the 2nd page of pate's file - 0x75 as id (another pq2 version, bug #3043904)
{ GID_QFG1, 11, 11, 0, "battle", "<noname90>", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When entering battle, 0x75 as id
- { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // clicking on catalog in roboter sale - a parameter is an object
- { GID_SQ4, 391, 391, 0, "choosePlug", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ordering connector in roboter sale - a parameter is an object
+ { GID_SQ1, -1, 700, 0, "arcadaRegion", "doit", -1, 0, { WORKAROUND_IGNORE, 0 } }, // restoring in some rooms of the arcada (right at the start)
+ { GID_SQ4, 397, 0, 0, "", "export 12", -1, 0, { WORKAROUND_IGNORE, 0 } }, // FLOPPY: when going into the computer store (bug #3044044)
+ { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // CD: clicking on catalog in roboter sale - a parameter is an object
+ { GID_SQ4, 391, 391, 0, "choosePlug", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // CD: ordering connector in roboter sale - a parameter is an object
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
+const SciWorkaroundEntry kDirLoop_workarounds[] = {
+ { GID_KQ4, 4, 992, 0, "Avoid", "doit", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when the ogre catches you in front of his house, second parameter points to the same object as the first parameter, instead of being an integer (the angle) - bug #3042964
+};
+
+// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kDisposeScript_workarounds[] = {
{ GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - bug #3034907
{ GID_QFG1, -1, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object
@@ -278,6 +313,7 @@ const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = {
{ GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time
// ^^ TODO: check, if this is really a script error or an issue with our restore code
{ GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens during the game, gets called with 1 extra parameter
+ { GID_SQ5, 850, 850, 0, "quirksTurn", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens while playing Battle Cruiser (invalid segment) - bug #3056811
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -289,13 +325,14 @@ const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = {
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = {
- { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack
+ { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // CD: game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = {
{ GID_SQ4, 405, 405, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified
+ { GID_SQ4, 406, 406, 0, "egoFollowed", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // FLOPPY: when getting shot by the police - accidental additional parameter specified
{ GID_SQ4, 406, 406, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified
{ GID_SQ4, 410, 410, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified
{ GID_SQ4, 411, 411, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified
@@ -360,6 +397,12 @@ const SciWorkaroundEntry kStrAt_workarounds[] = {
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
+const SciWorkaroundEntry kStrCat_workarounds[] = {
+ { GID_LONGBOW, 210, 210, 0, "giveScroll", "changeState",0x3294, 0, { WORKAROUND_FAKE, 0 } }, // German version, when handing the scroll with the druid hand code to Marion - bug #3048054
+ SCI_WORKAROUNDENTRY_TERMINATOR
+};
+
+// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kUnLoad_workarounds[] = {
{ GID_CAMELOT, 921, 921, 1, "Script", "changeState", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: While showing Camelot (and other places), the reference is invalid - bug #3035000
{ GID_CAMELOT, 921, 921, 1, "Script", "init", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When being attacked by the boar (and other places), the reference is invalid - bug #3035000
@@ -376,6 +419,7 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = {
{ GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident
{ GID_PQ3, 877, 998, 0, "View", "delete", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when getting run over on the freeway, the reference is invalid
{ GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error
+ { GID_SQ3, 2, 998, 0, "View", "delete", -1, 0, { WORKAROUND_IGNORE, 0 } }, // clicking the mouse button during the intro, after the escape pod gets pulled into the garbage freighter, the reference is invalid - bug #3050856
SCI_WORKAROUNDENTRY_TERMINATOR
};
diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h
index 220ffd7fda..bf1ac3a445 100644
--- a/engines/sci/engine/workarounds.h
+++ b/engines/sci/engine/workarounds.h
@@ -72,6 +72,8 @@ extern const SciWorkaroundEntry opcodeDivWorkarounds[];
extern const SciWorkaroundEntry opcodeDptoaWorkarounds[];
extern const SciWorkaroundEntry opcodeGeWorkarounds[];
extern const SciWorkaroundEntry opcodeLeWorkarounds[];
+extern const SciWorkaroundEntry opcodeUltWorkarounds[];
+extern const SciWorkaroundEntry opcodeLaiWorkarounds[];
extern const SciWorkaroundEntry opcodeLsiWorkarounds[];
extern const SciWorkaroundEntry opcodeMulWorkarounds[];
extern const SciWorkaroundEntry opcodeAndWorkarounds[];
@@ -82,6 +84,7 @@ extern const SciWorkaroundEntry kCelHigh_workarounds[];
extern const SciWorkaroundEntry kCelWide_workarounds[];
extern const SciWorkaroundEntry kDeviceInfo_workarounds[];
extern const SciWorkaroundEntry kDisplay_workarounds[];
+extern const SciWorkaroundEntry kDirLoop_workarounds[];
extern const SciWorkaroundEntry kDisposeScript_workarounds[];
extern const SciWorkaroundEntry kDoSoundFade_workarounds[];
extern const SciWorkaroundEntry kFindKey_workarounds[];
@@ -100,6 +103,7 @@ extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[];
extern const SciWorkaroundEntry kSetCursor_workarounds[];
extern const SciWorkaroundEntry kSetPort_workarounds[];
extern const SciWorkaroundEntry kStrAt_workarounds[];
+extern const SciWorkaroundEntry kStrCat_workarounds[];
extern const SciWorkaroundEntry kUnLoad_workarounds[];
extern SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin);
diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp
index 5923e501cf..5d469eda7b 100644
--- a/engines/sci/event.cpp
+++ b/engines/sci/event.cpp
@@ -149,7 +149,7 @@ SciEvent EventManager::getScummVMEvent() {
found = em->pollEvent(ev);
}
- if (found && !ev.synthetic && ev.type != Common::EVENT_MOUSEMOVE) {
+ if (found && ev.type != Common::EVENT_MOUSEMOVE) {
int modifiers = em->getModifierState();
// We add the modifier key status to buckybits
@@ -215,6 +215,11 @@ SciEvent EventManager::getScummVMEvent() {
else
input.character = SCI_KEY_TAB;
}
+ if (input.data == Common::KEYCODE_DELETE) {
+ // Delete key
+ input.type = SCI_EVENT_KEYBOARD;
+ input.data = input.character = SCI_KEY_DELETE;
+ }
} else if ((input.data >= Common::KEYCODE_F1) && input.data <= Common::KEYCODE_F10) {
// F1-F10
input.type = SCI_EVENT_KEYBOARD;
@@ -346,9 +351,17 @@ SciEvent EventManager::getScummVMEvent() {
void EventManager::updateScreen() {
// Update the screen here, since it's called very often.
// Throttle the screen update rate to 60fps.
- if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) {
+ EngineState *s = g_sci->getEngineState();
+ if (g_system->getMillis() - s->_screenUpdateTime >= 1000 / 60) {
g_system->updateScreen();
- g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis();
+ s->_screenUpdateTime = g_system->getMillis();
+ // Throttle the checking of shouldQuit() to 60fps as well, since
+ // Engine::shouldQuit() invokes 2 virtual functions
+ // (EventManager::shouldQuit() and EventManager::shouldRTL()),
+ // which is very expensive to invoke constantly without any
+ // throttling at all.
+ if (g_engine->shouldQuit())
+ s->abortScriptProcessing = kAbortQuitGame;
}
}
diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp
index 913b369790..75fbb3e097 100644
--- a/engines/sci/graphics/animate.cpp
+++ b/engines/sci/graphics/animate.cpp
@@ -96,7 +96,7 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) {
invokeSelector(_s, curObject, SELECTOR(doit), argc, argv, 0);
// If a game is being loaded, stop processing
- if (_s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit())
+ if (_s->abortScriptProcessing != kAbortNone)
return true; // Stop processing
// Lookup node again, since the nodetable it was in may have been reallocated.
@@ -190,7 +190,7 @@ void GfxAnimate::makeSortedList(List *list) {
Common::sort(_list.begin(), _list.end(), sortHelper);
}
-void GfxAnimate::fill(byte &old_picNotValid) {
+void GfxAnimate::fill(byte &old_picNotValid, bool maySetNsRect) {
reg_t curObject;
uint16 signal;
GfxView *view = NULL;
@@ -205,54 +205,69 @@ void GfxAnimate::fill(byte &old_picNotValid) {
view = _cache->getView(it->viewId);
// adjust loop and cel, if any of those is invalid
- if (it->loopNo >= view->getLoopCount()) {
+ // this seems to be completely crazy code
+ // sierra sci checked signed int16 to be above or equal the counts and reseted to 0 in those cases
+ // later during view processing those are compared unsigned again and then set to maximum count - 1
+ // Games rely on this behaviour. For example laura bow 1 has a knight standing around in room 37
+ // which has cel set to 3. This cel does not exist and the actual knight is 0
+ // In kq5 on the other hand during the intro, when the trunk is opened, cel is set to some real
+ // high number, which is negative when considered signed. This actually requires to get fixed to
+ // maximum cel, otherwise the trunk would be closed.
+ int16 viewLoopCount = view->getLoopCount();
+ if (it->loopNo >= viewLoopCount) {
it->loopNo = 0;
writeSelectorValue(_s->_segMan, curObject, SELECTOR(loop), it->loopNo);
+ } else if (it->loopNo < 0) {
+ it->loopNo = viewLoopCount - 1;
+ // not setting selector is right, sierra sci didn't do it during view processing as well
}
- if (it->celNo >= view->getCelCount(it->loopNo)) {
+ int16 viewCelCount = view->getCelCount(it->loopNo);
+ if (it->celNo >= viewCelCount) {
it->celNo = 0;
writeSelectorValue(_s->_segMan, curObject, SELECTOR(cel), it->celNo);
+ } else if (it->celNo < 0) {
+ it->celNo = viewCelCount - 1;
}
- // Process global scaling, if needed
- if (it->scaleSignal & kScaleSignalDoScaling) {
- if (it->scaleSignal & kScaleSignalGlobalScaling) {
- // Global scaling uses global var 2 and some other stuff to calculate scaleX/scaleY
- int16 maxScale = readSelectorValue(_s->_segMan, curObject, SELECTOR(maxScale));
- int16 celHeight = view->getHeight(it->loopNo, it->celNo);
- int16 maxCelHeight = (maxScale * celHeight) >> 7;
- reg_t globalVar2 = _s->variables[VAR_GLOBAL][2]; // current room object
- int16 vanishingY = readSelectorValue(_s->_segMan, globalVar2, SELECTOR(vanishingY));
-
- int16 fixedPortY = _ports->getPort()->rect.bottom - vanishingY;
- int16 fixedEntryY = it->y - vanishingY;
- if (!fixedEntryY)
- fixedEntryY = 1;
-
- if ((celHeight == 0) || (fixedPortY == 0))
- error("global scaling panic");
-
- it->scaleY = ( maxCelHeight * fixedEntryY ) / fixedPortY;
- it->scaleY = (it->scaleY * 128) / celHeight;
-
- it->scaleX = it->scaleY;
-
- // and set objects scale selectors
- writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX), it->scaleX);
- writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY), it->scaleY);
- }
- }
-
- //warning("%s", _s->_segMan->getObjectName(curObject));
-
if (!view->isScaleable()) {
// Laura Bow 2 (especially floppy) depends on this, some views are not supposed to be scaleable
// this "feature" was removed in later versions of SCI1.1
it->scaleSignal = 0;
it->scaleY = it->scaleX = 128;
+ } else {
+ // Process global scaling, if needed
+ if (it->scaleSignal & kScaleSignalDoScaling) {
+ if (it->scaleSignal & kScaleSignalGlobalScaling) {
+ // Global scaling uses global var 2 and some other stuff to calculate scaleX/scaleY
+ int16 maxScale = readSelectorValue(_s->_segMan, curObject, SELECTOR(maxScale));
+ int16 celHeight = view->getHeight(it->loopNo, it->celNo);
+ int16 maxCelHeight = (maxScale * celHeight) >> 7;
+ reg_t globalVar2 = _s->variables[VAR_GLOBAL][2]; // current room object
+ int16 vanishingY = readSelectorValue(_s->_segMan, globalVar2, SELECTOR(vanishingY));
+
+ int16 fixedPortY = _ports->getPort()->rect.bottom - vanishingY;
+ int16 fixedEntryY = it->y - vanishingY;
+ if (!fixedEntryY)
+ fixedEntryY = 1;
+
+ if ((celHeight == 0) || (fixedPortY == 0))
+ error("global scaling panic");
+
+ it->scaleY = ( maxCelHeight * fixedEntryY ) / fixedPortY;
+ it->scaleY = (it->scaleY * 128) / celHeight;
+
+ it->scaleX = it->scaleY;
+
+ // and set objects scale selectors
+ writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX), it->scaleX);
+ writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY), it->scaleY);
+ }
+ }
}
- bool setNsRect = true;
+ //warning("%s view %d, loop %d, cel %d", _s->_segMan->getObjectName(curObject), it->viewId, it->loopNo, it->celNo);
+
+ bool setNsRect = maySetNsRect;
// Create rect according to coordinates and given cel
if (it->scaleSignal & kScaleSignalDoScaling) {
@@ -613,7 +628,7 @@ void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t
disposeLastCast();
makeSortedList(list);
- fill(old_picNotValid);
+ fill(old_picNotValid, true);
if (old_picNotValid) {
// beginUpdate()/endUpdate() were introduced SCI1.
@@ -662,6 +677,7 @@ void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t
int16 onlyWidth = onlyCast->celRect.width();
if (((onlyWidth == 12) && (onlyHeight == 35)) || // regular benchmark view ("fred", "Speedy", "ego")
((onlyWidth == 29) && (onlyHeight == 45)) || // King's Quest 5 french "fred"
+ ((onlyWidth == 1) && (onlyHeight == 5)) || // Freddy Pharkas "fred"
((onlyWidth == 1) && (onlyHeight == 1))) { // Laura Bow 2 Talkie
// check further that there is only one cel in that view
GfxView *onlyView = _cache->getView(onlyCast->viewId);
@@ -698,7 +714,7 @@ void GfxAnimate::kernelAddToPicList(reg_t listReference, int argc, reg_t *argv)
makeSortedList(list);
preprocessAddToPicList();
- fill(tempPicNotValid);
+ fill(tempPicNotValid, getSciVersion() >= SCI_VERSION_1_1 ? true : false);
addToPicDrawCels();
addToPicSetPicNotValid();
diff --git a/engines/sci/graphics/animate.h b/engines/sci/graphics/animate.h
index c2101e5384..f25e54915e 100644
--- a/engines/sci/graphics/animate.h
+++ b/engines/sci/graphics/animate.h
@@ -94,7 +94,7 @@ public:
void disposeLastCast();
bool invoke(List *list, int argc, reg_t *argv);
void makeSortedList(List *list);
- void fill(byte &oldPicNotValid);
+ void fill(byte &oldPicNotValid, bool maySetNsRect);
void update();
void drawCels();
void updateScreen(byte oldPicNotValid);
diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp
index 1c961b2ad6..1991837102 100644
--- a/engines/sci/graphics/compare.cpp
+++ b/engines/sci/graphics/compare.cpp
@@ -185,9 +185,9 @@ reg_t GfxCompare::kernelCanBeHere(reg_t curObject, reg_t listReference) {
checkRect.right = readSelectorValue(_segMan, curObject, SELECTOR(brRight));
checkRect.bottom = readSelectorValue(_segMan, curObject, SELECTOR(brBottom));
- if (!checkRect.isValidRect()) { // can occur in Iceman - HACK? TODO: is this really occuring in sierra sci? check this
+ if (!checkRect.isValidRect()) { // can occur in Iceman and Mother Goose - HACK? TODO: is this really occuring in sierra sci? check this
warning("kCan(t)BeHere - invalid rect %d, %d -> %d, %d", checkRect.left, checkRect.top, checkRect.right, checkRect.bottom);
- return NULL_REG;
+ return NULL_REG; // this means "can be here"
}
adjustedRect = _coordAdjuster->onControl(checkRect);
diff --git a/engines/sci/graphics/controls.cpp b/engines/sci/graphics/controls.cpp
index 5891413be8..1abb8478a1 100644
--- a/engines/sci/graphics/controls.cpp
+++ b/engines/sci/graphics/controls.cpp
@@ -150,7 +150,7 @@ void GfxControls::kernelTexteditChange(reg_t controlObject, reg_t eventObject) {
uint16 maxChars = readSelectorValue(_segMan, controlObject, SELECTOR(max));
reg_t textReference = readSelector(_segMan, controlObject, SELECTOR(text));
Common::String text;
- uint16 textSize, eventType, eventKey = 0;
+ uint16 textSize, eventType, eventKey = 0, modifiers = 0;
bool textChanged = false;
bool textAddChar = false;
Common::Rect rect;
@@ -169,6 +169,7 @@ void GfxControls::kernelTexteditChange(reg_t controlObject, reg_t eventObject) {
break;
case SCI_EVENT_KEYBOARD:
eventKey = readSelectorValue(_segMan, eventObject, SELECTOR(message));
+ modifiers = readSelectorValue(_segMan, eventObject, SELECTOR(modifiers));
switch (eventKey) {
case SCI_KEY_BACKSPACE:
if (cursorPos > 0) {
@@ -177,8 +178,10 @@ void GfxControls::kernelTexteditChange(reg_t controlObject, reg_t eventObject) {
}
break;
case SCI_KEY_DELETE:
- text.deleteChar(cursorPos);
- textChanged = true;
+ if (cursorPos < textSize) {
+ text.deleteChar(cursorPos);
+ textChanged = true;
+ }
break;
case SCI_KEY_HOME: // HOME
cursorPos = 0; textChanged = true;
@@ -196,8 +199,20 @@ void GfxControls::kernelTexteditChange(reg_t controlObject, reg_t eventObject) {
cursorPos++; textChanged = true;
}
break;
+ case 3: // returned in SCI1 late and newer when Control - C is pressed
+ if (modifiers & SCI_KEYMOD_CTRL) {
+ // Control-C erases the whole line
+ cursorPos = 0; text.clear();
+ textChanged = true;
+ }
+ break;
default:
- if (eventKey > 31 && eventKey < 256 && textSize < maxChars) {
+ if ((modifiers & SCI_KEYMOD_CTRL) && eventKey == 99) {
+ // Control-C in earlier SCI games (SCI0 - SCI1 middle)
+ // Control-C erases the whole line
+ cursorPos = 0; text.clear();
+ textChanged = true;
+ } else if (eventKey > 31 && eventKey < 256 && textSize < maxChars) {
// insert pressed character
textAddChar = true;
textChanged = true;
diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp
index f6e2077cb3..8e69d034c8 100644
--- a/engines/sci/graphics/cursor.cpp
+++ b/engines/sci/graphics/cursor.cpp
@@ -23,10 +23,11 @@
*
*/
-#include "graphics/cursorman.h"
-#include "common/util.h"
#include "common/events.h"
+#include "common/macresman.h"
#include "common/system.h"
+#include "common/util.h"
+#include "graphics/cursorman.h"
#include "sci/sci.h"
#include "sci/event.h"
@@ -206,7 +207,7 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu
// See http://developer.apple.com/legacy/mac/library/documentation/mac/QuickDraw/QuickDraw-402.html
// for more information.
- // View 998 seems to be a fake resource used to call for the Mac CURS resources.
+ // View 998 seems to be a fake resource used to call for Mac cursor resources.
// For other resources, they're still in the views, so use them.
if (viewNum != 998) {
kernelSetView(viewNum, loopNum, celNum, hotspot);
@@ -214,47 +215,67 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu
}
// TODO: What about the 2000 resources? Inventory items? How to handle?
- // TODO: What games does this work for? At least it does for KQ6.
- // TODO: Stop asking rhetorical questions.
- // TODO: It was fred all along!
+ // TODO: 1000 + celNum won't work for GK1
Resource *resource = _resMan->findResource(ResourceId(kResourceTypeCursor, 1000 + celNum), false);
if (!resource) {
- warning("CURS %d not found", 1000 + celNum);
+ warning("Mac cursor %d not found", 1000 + celNum);
return;
}
assert(resource);
- byte *cursorBitmap = new byte[16 * 16];
- byte *data = resource->data;
+ if (resource->size == 32 * 2 + 4) {
+ // Mac CURS cursor
+ byte *cursorBitmap = new byte[16 * 16];
+ byte *data = resource->data;
- // Get B&W data
- for (byte i = 0; i < 32; i++) {
- byte imageByte = *data++;
- for (byte b = 0; b < 8; b++)
- cursorBitmap[i * 8 + b] = (byte)((imageByte & (0x80 >> b)) > 0 ? 0x00 : 0xFF);
- }
+ // Get B&W data
+ for (byte i = 0; i < 32; i++) {
+ byte imageByte = *data++;
+ for (byte b = 0; b < 8; b++)
+ cursorBitmap[i * 8 + b] = (byte)((imageByte & (0x80 >> b)) > 0 ? 0x00 : 0xFF);
+ }
- // Apply mask data
- for (byte i = 0; i < 32; i++) {
- byte imageByte = *data++;
- for (byte b = 0; b < 8; b++)
- if ((imageByte & (0x80 >> b)) == 0)
- cursorBitmap[i * 8 + b] = SCI_CURSOR_SCI0_TRANSPARENCYCOLOR; // Doesn't matter, just is transparent
- }
+ // Apply mask data
+ for (byte i = 0; i < 32; i++) {
+ byte imageByte = *data++;
+ for (byte b = 0; b < 8; b++)
+ if ((imageByte & (0x80 >> b)) == 0)
+ cursorBitmap[i * 8 + b] = SCI_CURSOR_SCI0_TRANSPARENCYCOLOR; // Doesn't matter, just is transparent
+ }
- uint16 hotspotX = READ_BE_UINT16(data);
- uint16 hotspotY = READ_BE_UINT16(data + 2);
+ uint16 hotspotX = READ_BE_UINT16(data);
+ uint16 hotspotY = READ_BE_UINT16(data + 2);
- CursorMan.replaceCursor(cursorBitmap, 16, 16, hotspotX, hotspotY, SCI_CURSOR_SCI0_TRANSPARENCYCOLOR);
+ CursorMan.replaceCursor(cursorBitmap, 16, 16, hotspotX, hotspotY, SCI_CURSOR_SCI0_TRANSPARENCYCOLOR);
- delete[] cursorBitmap;
+ delete[] cursorBitmap;
+ } else {
+ // Mac crsr cursor
+ byte *cursorBitmap, *palette;
+ int width, height, hotspotX, hotspotY, palSize, keycolor;
+ Common::MacResManager::convertCrsrCursor(resource->data, resource->size, &cursorBitmap, &width, &height, &hotspotX, &hotspotY, &keycolor, true, &palette, &palSize);
+ CursorMan.replaceCursor(cursorBitmap, width, height, hotspotX, hotspotY, keycolor);
+ CursorMan.replaceCursorPalette(palette, 0, palSize);
+ free(cursorBitmap);
+ free(palette);
+ }
kernelShow();
}
+// this list contains all mandatory set cursor changes, that need special handling
+// ffs. GfxCursor::setPosition (below)
+// Game, newPosition, validRect
+static const SciCursorSetPositionWorkarounds setPositionWorkarounds[] = {
+ { GID_ISLANDBRAIN, 84, 109, 46, 76, 174, 243 }, // island of dr. brain / game menu
+ { GID_LSL5, 23, 171, 0, 0, 26, 320 }, // larry 5 / skip forward helper
+ { GID_QFG1VGA, 64, 174, 40, 37, 74, 284 }, // Quest For Glory 1 VGA / run/walk/sleep sub-menu
+ { (SciGameId)0, -1, -1, -1, -1, -1, -1 }
+};
+
void GfxCursor::setPosition(Common::Point pos) {
// Don't set position, when cursor is not visible.
// This fixes eco quest 1 (floppy) right at the start, which is setting
@@ -271,6 +292,31 @@ void GfxCursor::setPosition(Common::Point pos) {
_screen->adjustToUpscaledCoordinates(pos.y, pos.x);
g_system->warpMouse(pos.x, pos.y);
}
+
+ // Some games display a new menu, set mouse position somewhere within and
+ // expect it to be in there. This is fine for a real mouse, but on wii using
+ // wii-mote or touch interfaces this won't work. In fact on those platforms
+ // the menus will close immediately because of that behaviour.
+ // We identify those cases and set a reaction-rect. If the mouse it outside
+ // of that rect, we won't report the position back to the scripts.
+ // As soon as the mouse was inside once, we will revert to normal behaviour
+ // Currently this code is enabled for all platforms, especially because we can't
+ // differentiate between e.g. Windows used via mouse and Windows used via touchscreen
+ // The workaround won't hurt real-mouse platforms
+ const SciGameId gameId = g_sci->getGameId();
+ const SciCursorSetPositionWorkarounds *workaround;
+ workaround = setPositionWorkarounds;
+ while (workaround->newPositionX != -1) {
+ if (workaround->gameId == gameId
+ && ((workaround->newPositionX == pos.x) && (workaround->newPositionY == pos.y))) {
+ EngineState *s = g_sci->getEngineState();
+ s->_cursorWorkaroundActive = true;
+ s->_cursorWorkaroundPoint = pos;
+ s->_cursorWorkaroundRect = Common::Rect(workaround->rectLeft, workaround->rectTop, workaround->rectRight, workaround->rectBottom);
+ return;
+ }
+ workaround++;
+ }
}
Common::Point GfxCursor::getPosition() {
diff --git a/engines/sci/graphics/cursor.h b/engines/sci/graphics/cursor.h
index 787841f5be..10cd5d8a85 100644
--- a/engines/sci/graphics/cursor.h
+++ b/engines/sci/graphics/cursor.h
@@ -40,6 +40,16 @@ class GfxPalette;
typedef Common::HashMap<int, GfxView *> CursorCache;
+struct SciCursorSetPositionWorkarounds {
+ SciGameId gameId;
+ int16 newPositionY;
+ int16 newPositionX;
+ int16 rectTop;
+ int16 rectLeft;
+ int16 rectBottom;
+ int16 rectRight;
+};
+
class GfxCursor {
public:
GfxCursor(ResourceManager *resMan, GfxPalette *palette, GfxScreen *screen);
diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp
index 4551e9dafc..dbc738e2f7 100644
--- a/engines/sci/graphics/paint16.cpp
+++ b/engines/sci/graphics/paint16.cpp
@@ -221,7 +221,7 @@ void GfxPaint16::paintRect(const Common::Rect &rect) {
fillRect(rect, GFX_SCREEN_MASK_VISUAL, _ports->_curPort->penClr);
}
-void GfxPaint16::fillRect(const Common::Rect &rect, int16 drawFlags, byte clrPen, byte clrBack, byte bControl) {
+void GfxPaint16::fillRect(const Common::Rect &rect, int16 drawFlags, byte color, byte priority, byte control) {
Common::Rect r = rect;
r.clip(_ports->_curPort->rect);
if (r.isEmpty()) // nothing to fill
@@ -238,17 +238,17 @@ void GfxPaint16::fillRect(const Common::Rect &rect, int16 drawFlags, byte clrPen
for (y = r.top; y < r.bottom; y++) {
for (x = r.left; x < r.right; x++) {
curVisual = _screen->getVisual(x, y);
- if (curVisual == clrPen) {
- _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL, clrBack, 0, 0);
- } else if (curVisual == clrBack) {
- _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL, clrPen, 0, 0);
+ if (curVisual == color) {
+ _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL, priority, 0, 0);
+ } else if (curVisual == priority) {
+ _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL, color, 0, 0);
}
}
}
- } else { // just fill rect with ClrPen
+ } else { // just fill rect with color
for (y = r.top; y < r.bottom; y++) {
for (x = r.left; x < r.right; x++) {
- _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL, clrPen, 0, 0);
+ _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL, color, 0, 0);
}
}
}
@@ -258,10 +258,14 @@ void GfxPaint16::fillRect(const Common::Rect &rect, int16 drawFlags, byte clrPen
return;
drawFlags &= GFX_SCREEN_MASK_PRIORITY|GFX_SCREEN_MASK_CONTROL;
+ // we need to isolate the bits, sierra sci saved priority and control inside one byte, we don't
+ priority &= 0x0f;
+ control &= 0x0f;
+
if (oldPenMode != 2) {
for (y = r.top; y < r.bottom; y++) {
for (x = r.left; x < r.right; x++) {
- _screen->putPixel(x, y, drawFlags, 0, clrBack, bControl);
+ _screen->putPixel(x, y, drawFlags, 0, priority, control);
}
}
} else {
@@ -413,6 +417,7 @@ void GfxPaint16::kernelGraphFrameBox(const Common::Rect &rect, int16 color) {
}
void GfxPaint16::kernelGraphDrawLine(Common::Point startPoint, Common::Point endPoint, int16 color, int16 priority, int16 control) {
+ _ports->clipLine(startPoint, endPoint);
_ports->offsetLine(startPoint, endPoint);
_screen->drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y, color, priority, control);
}
diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h
index e944c71bdd..4f709fd7c6 100644
--- a/engines/sci/graphics/paint16.h
+++ b/engines/sci/graphics/paint16.h
@@ -62,7 +62,7 @@ public:
void invertRectViaXOR(const Common::Rect &rect);
void eraseRect(const Common::Rect &rect);
void paintRect(const Common::Rect &rect);
- void fillRect(const Common::Rect &rect, int16 drawFlags, byte clrPen, byte clrBack = 0, byte bControl = 0);
+ void fillRect(const Common::Rect &rect, int16 drawFlags, byte color, byte priority = 0, byte control = 0);
void frameRect(const Common::Rect &rect);
void bitsShow(const Common::Rect &r);
diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp
index 5c17f76558..76b2ed53fc 100644
--- a/engines/sci/graphics/palette.cpp
+++ b/engines/sci/graphics/palette.cpp
@@ -340,7 +340,8 @@ void GfxPalette::drewPicture(GuiResourceId pictureId) {
_sysPalette.timestamp++;
if (_palVaryResourceId != -1) {
- palVaryLoadTargetPalette(pictureId);
+ if (g_sci->getEngineState()->gameIsRestarting == 0) // only if not restored nor restarted
+ palVaryLoadTargetPalette(pictureId);
}
}
@@ -613,9 +614,18 @@ bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint1
_palVaryStepStop = stepStop;
_palVaryDirection = direction;
// if no ticks are given, jump directly to destination
- if (!_palVaryTicks)
+ if (!_palVaryTicks) {
_palVaryDirection = stepStop;
- palVaryInstallTimer();
+ // sierra sci set the timer to 1 tick instead of calling it directly
+ // we have to change this to prevent a race condition to happen in
+ // at least freddy pharkas during nighttime. In that case kPalVary is
+ // called right before a transition and because we load pictures much
+ // faster, the 1 tick won't pass sometimes resulting in the palette
+ // being daytime instead of nighttime during the transition.
+ palVaryProcess(1, true);
+ } else {
+ palVaryInstallTimer();
+ }
return true;
}
return false;
@@ -632,9 +642,14 @@ int16 GfxPalette::kernelPalVaryReverse(int16 ticks, uint16 stepStop, int16 direc
_palVaryStepStop = stepStop;
_palVaryDirection = direction != -1 ? -direction : -_palVaryDirection;
- if (!_palVaryTicks)
+ if (!_palVaryTicks) {
_palVaryDirection = _palVaryStepStop - _palVaryStep;
- palVaryInstallTimer();
+ // ffs. see palVaryInit right above, we fix the code here as well
+ // just in case
+ palVaryProcess(1, true);
+ } else {
+ palVaryInstallTimer();
+ }
return kernelPalVaryGetCurrentStep();
}
diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp
index e568316919..2765663381 100644
--- a/engines/sci/graphics/picture.cpp
+++ b/engines/sci/graphics/picture.cpp
@@ -120,10 +120,6 @@ void GfxPicture::drawSci11Vga() {
// [priorityBandData:WORD] * priorityBandCount
// [priority:BYTE] [unknown:BYTE]
- // Create palette and set it
- _palette->createFromData(inbuffer + palette_data_ptr, size - palette_data_ptr, &palette);
- _palette->set(&palette, true);
-
// priority bands are supposed to be 14 for sci1.1 pictures
assert(priorityBandsCount == 14);
@@ -132,8 +128,13 @@ void GfxPicture::drawSci11Vga() {
}
// display Cel-data
- if (has_cel)
+ if (has_cel) {
+ // Create palette and set it
+ _palette->createFromData(inbuffer + palette_data_ptr, size - palette_data_ptr, &palette);
+ _palette->set(&palette, true);
+
drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, 0, 0, 0);
+ }
// process vector data
drawVectorData(inbuffer + vector_dataPos, vector_size);
diff --git a/engines/sci/graphics/portrait.cpp b/engines/sci/graphics/portrait.cpp
index 8f4fe094a8..f21fa39476 100644
--- a/engines/sci/graphics/portrait.cpp
+++ b/engines/sci/graphics/portrait.cpp
@@ -185,7 +185,7 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint
curEvent = _event->getSciEvent(SCI_EVENT_ANY);
if (curEvent.type == SCI_EVENT_MOUSE_PRESS ||
(curEvent.type == SCI_EVENT_KEYBOARD && curEvent.data == SCI_KEY_ESC) ||
- g_engine->shouldQuit())
+ g_sci->getEngineState()->abortScriptProcessing == kAbortQuitGame)
userAbort = true;
curPosition = _audio->getAudioPosition();
} while ((curPosition != -1) && (curPosition < timerPosition) && (!userAbort));
diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp
index 0a0e49235e..12ac1d2025 100644
--- a/engines/sci/graphics/ports.cpp
+++ b/engines/sci/graphics/ports.cpp
@@ -105,16 +105,9 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te
case GID_CNICK_KQ:
offTop = 0;
break;
- case GID_MOTHERGOOSE:
- // TODO: if mother goose EGA also uses offTop we can simply remove this check altogether
- switch (getSciVersion()) {
- case SCI_VERSION_1_EARLY:
- case SCI_VERSION_1_1:
- offTop = 0;
- break;
- default:
- break;
- }
+ case GID_MOTHERGOOSE256:
+ // only the SCI1 and SCI1.1 (VGA) versions need this
+ offTop = 0;
break;
case GID_FAIRYTALES:
// Mixed-Up Fairy Tales (& its demo) uses -w 26 0 200 320. If we don't
@@ -288,6 +281,16 @@ Window *GfxPorts::addWindow(const Common::Rect &dims, const Common::Rect *restor
// Find an unused window/port id
uint id = PORTS_FIRSTWINDOWID;
while (id < _windowsById.size() && _windowsById[id]) {
+ if (_windowsById[id]->counterTillFree) {
+ // port that is already disposed, but not freed yet
+ freeWindow((Window *)_windowsById[id]);
+ _freeCounter--;
+ break; // reuse the handle
+ // we do this especially for sq4cd. it creates and disposes the
+ // inventory window all the time, but reuses old handles as well
+ // this worked somewhat under the original interpreter, because
+ // it put the new window where the old was.
+ }
++id;
}
if (id == _windowsById.size())
@@ -366,6 +369,20 @@ Window *GfxPorts::addWindow(const Common::Rect &dims, const Common::Rect *restor
if (draw)
drawWindow(pwnd);
setPort((Port *)pwnd);
+
+ // FIXME: changing setOrigin to not clear the rightmost bit fixes the display of windows
+ // in some fanmade games (e.g. New Year's Mystery (Updated)). Since the fanmade games
+ // use an unmodified SCI interpreter, this leads me to believe that there either is some
+ // off-by-one error in the window drawing code, or there is another place where the
+ // rightmost bit should be cleeared. New Year's Mystery is a good test case for this, as
+ // it draws dialogs and then draws cels on top of them, for fancier dialog corners (like,
+ // for example, KQ5). KQ5 has a custom window style, however, whereas New Year's mystery
+ // has a "classic" style with only SCI_WINDOWMGR_STYLE_NOFRAME set. If
+ // SCI_WINDOWMGR_STYLE_NOFRAME is removed, the window is cleared correctly, because it
+ // grows slightly, covering the view pixels on the left. In any case, the views and the
+ // window have a difference of one pixel when they're drawn via kNewWindow and kDrawCel,
+ // which causes the glitch to appear when the window is closed.
+
// All SCI0 games till kq4 .502 (not including) did not adjust against _wmgrPort, we set _wmgrPort->top to 0 in that case
setOrigin(pwnd->rect.left, pwnd->rect.top + _wmgrPort->top);
pwnd->rect.moveTo(0, 0);
@@ -446,14 +463,15 @@ void GfxPorts::removeWindow(Window *pWnd, bool reanimate) {
_paint16->kernelGraphRedrawBox(pWnd->restoreRect);
_windowList.remove(pWnd);
setPort(_windowList.back());
- // We will actually free this window after 10 kSetPort-calls
+ // We will actually free this window after 15 kSetPort-calls
// Sierra sci freed the pointer immediately, but pointer to that port
// still worked till the memory got overwritten. Some games depend
// on this (dispose a window and then kSetPort to it again for once)
// Those are actually script bugs, but patching all of those out
// would be quite a hassle and this just keeps compatibility
// (examples: hoyle 4 game menu and sq4cd inventory)
- pWnd->counterTillFree = 10;
+ // sq4cd gum wrapper requires more than 10
+ pWnd->counterTillFree = 15;
_freeCounter++;
}
@@ -565,6 +583,13 @@ void GfxPorts::offsetLine(Common::Point &start, Common::Point &end) {
end.y += _curPort->top;
}
+void GfxPorts::clipLine(Common::Point &start, Common::Point &end) {
+ start.y = CLIP<int16>(start.y, _curPort->rect.top, _curPort->rect.bottom - 1);
+ start.x = CLIP<int16>(start.x, _curPort->rect.left, _curPort->rect.right - 1);
+ end.y = CLIP<int16>(end.y, _curPort->rect.top, _curPort->rect.bottom - 1);
+ end.x = CLIP<int16>(end.x, _curPort->rect.left, _curPort->rect.right - 1);
+}
+
void GfxPorts::priorityBandsInit(int16 bandCount, int16 top, int16 bottom) {
int16 y;
int32 bandSize;
diff --git a/engines/sci/graphics/ports.h b/engines/sci/graphics/ports.h
index 42a0a5d4b4..453cb50986 100644
--- a/engines/sci/graphics/ports.h
+++ b/engines/sci/graphics/ports.h
@@ -83,6 +83,7 @@ public:
void offsetRect(Common::Rect &r);
void offsetLine(Common::Point &start, Common::Point &end);
+ void clipLine(Common::Point &start, Common::Point &end);
void priorityBandsInit(int16 bandCount, int16 top, int16 bottom);
void priorityBandsInit(byte *data);
diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp
index fc07febe14..f5eb268863 100644
--- a/engines/sci/graphics/text16.cpp
+++ b/engines/sci/graphics/text16.cpp
@@ -92,7 +92,7 @@ int16 GfxText16::CodeProcessing(const char *&text, GuiResourceId orgFontId, int1
const char *textCode = text;
int16 textCodeSize = 0;
char curCode;
- unsigned char curCodeParm;
+ signed char curCodeParm;
// Find the end of the textcode
while ((++textCodeSize) && (*text != 0) && (*text++ != 0x7C)) { }
@@ -105,11 +105,11 @@ int16 GfxText16::CodeProcessing(const char *&text, GuiResourceId orgFontId, int1
if (isdigit(curCodeParm)) {
curCodeParm -= '0';
} else {
- curCodeParm = 0;
+ curCodeParm = -1;
}
switch (curCode) {
case 'c': // set text color
- if (curCodeParm == 0) {
+ if (curCodeParm == -1) {
_ports->_curPort->penClr = orgPenColor;
} else {
if (curCodeParm < _codeColorsCount) {
@@ -117,8 +117,8 @@ int16 GfxText16::CodeProcessing(const char *&text, GuiResourceId orgFontId, int1
}
}
break;
- case 'f':
- if (curCodeParm == 0) {
+ case 'f': // set text font
+ if (curCodeParm == -1) {
SetFont(orgFontId);
} else {
if (curCodeParm < _codeFontsCount) {
@@ -126,6 +126,9 @@ int16 GfxText16::CodeProcessing(const char *&text, GuiResourceId orgFontId, int1
}
}
break;
+ case 'r': // reference?!
+ // Used in Pepper, no idea how this works out
+ break;
}
return textCodeSize;
}
diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp
index abb5e74cbd..bd5e061094 100644
--- a/engines/sci/graphics/transitions.cpp
+++ b/engines/sci/graphics/transitions.cpp
@@ -121,11 +121,24 @@ void GfxTransitions::setup(int16 number, bool blackoutFlag) {
}
}
-void GfxTransitions::updateScreenAndWait(int msec) {
+bool GfxTransitions::doCreateFrame(uint32 shouldBeAtMsec) {
+ uint32 msecPos = g_system->getMillis() - _transitionStartTime;
+
+ if (shouldBeAtMsec > msecPos)
+ return true;
+ return false;
+}
+
+void GfxTransitions::updateScreenAndWait(uint32 shouldBeAtMsec) {
Common::Event ev;
- g_system->updateScreen();
- g_system->delayMillis(msec);
+
while (g_system->getEventManager()->pollEvent(ev)) {} // discard all events
+
+ g_system->updateScreen();
+ // if we have still some time left, delay accordingly
+ uint32 msecPos = g_system->getMillis() - _transitionStartTime;
+ if (shouldBeAtMsec > msecPos)
+ g_system->delayMillis(shouldBeAtMsec - msecPos);
}
// will translate a number and return corresponding translationEntry
@@ -191,6 +204,7 @@ void GfxTransitions::doTransition(int16 number, bool blackoutFlag) {
setNewPalette(blackoutFlag);
}
+ _transitionStartTime = g_system->getMillis();
switch (number) {
case SCI_TRANSITIONS_VERTICALROLL_FROMCENTER:
verticalRollFromCenter(blackoutFlag);
@@ -285,11 +299,14 @@ void GfxTransitions::copyRectToScreen(const Common::Rect rect, bool blackoutFlag
void GfxTransitions::fadeOut() {
byte oldPalette[4 * 256], workPalette[4 * 256];
int16 stepNr, colorNr;
+ // Sierra did not fade in/out color 255 for sci1.1, but they used it in
+ // several pictures (e.g. qfg3 demo/intro), so the fading looked weird
+ int16 tillColorNr = getSciVersion() >= SCI_VERSION_1_1 ? 256 : 255;
g_system->grabPalette(oldPalette, 0, 256);
for (stepNr = 100; stepNr >= 0; stepNr -= 10) {
- for (colorNr = 1; colorNr < 255; colorNr++){
+ for (colorNr = 1; colorNr < tillColorNr; colorNr++){
workPalette[colorNr * 4 + 0] = oldPalette[colorNr * 4] * stepNr / 100;
workPalette[colorNr * 4 + 1] = oldPalette[colorNr * 4 + 1] * stepNr / 100;
workPalette[colorNr * 4 + 2] = oldPalette[colorNr * 4 + 2] * stepNr / 100;
@@ -303,9 +320,12 @@ void GfxTransitions::fadeOut() {
// the load
void GfxTransitions::fadeIn() {
int16 stepNr;
+ // Sierra did not fade in/out color 255 for sci1.1, but they used it in
+ // several pictures (e.g. qfg3 demo/intro), so the fading looked weird
+ int16 tillColorNr = getSciVersion() >= SCI_VERSION_1_1 ? 256 : 255;
for (stepNr = 0; stepNr <= 100; stepNr += 10) {
- _palette->kernelSetIntensity(1, 255, stepNr, true);
+ _palette->kernelSetIntensity(1, tillColorNr, stepNr, true);
g_sci->getEngineState()->wait(2);
}
}
@@ -315,6 +335,7 @@ void GfxTransitions::fadeIn() {
void GfxTransitions::pixelation(bool blackoutFlag) {
uint16 mask = 0x40, stepNr = 0;
Common::Rect pixelRect;
+ uint32 msecCount = 0;
do {
mask = (mask & 1) ? (mask >> 1) ^ 0xB400 : mask >> 1;
@@ -326,7 +347,8 @@ void GfxTransitions::pixelation(bool blackoutFlag) {
if (!pixelRect.isEmpty())
copyRectToScreen(pixelRect, blackoutFlag);
if ((stepNr & 0x3FF) == 0) {
- updateScreenAndWait(5);
+ msecCount += 9;
+ updateScreenAndWait(msecCount);
}
stepNr++;
} while (mask != 0x40);
@@ -337,6 +359,7 @@ void GfxTransitions::pixelation(bool blackoutFlag) {
void GfxTransitions::blocks(bool blackoutFlag) {
uint16 mask = 0x40, stepNr = 0;
Common::Rect blockRect;
+ uint32 msecCount = 0;
do {
mask = (mask & 1) ? (mask >> 1) ^ 0x240 : mask >> 1;
@@ -348,7 +371,8 @@ void GfxTransitions::blocks(bool blackoutFlag) {
if (!blockRect.isEmpty())
copyRectToScreen(blockRect, blackoutFlag);
if ((stepNr & 7) == 0) {
- updateScreenAndWait(4);
+ msecCount += 5;
+ updateScreenAndWait(msecCount);
}
stepNr++;
} while (mask != 0x40);
@@ -359,6 +383,7 @@ void GfxTransitions::blocks(bool blackoutFlag) {
void GfxTransitions::straight(int16 number, bool blackoutFlag) {
int16 stepNr = 0;
Common::Rect newScreenRect = _picRect;
+ uint32 msecCount = 0;
switch (number) {
case SCI_TRANSITIONS_STRAIGHT_FROM_RIGHT:
@@ -366,7 +391,8 @@ void GfxTransitions::straight(int16 number, bool blackoutFlag) {
while (newScreenRect.left >= _picRect.left) {
copyRectToScreen(newScreenRect, blackoutFlag);
if ((stepNr & 1) == 0) {
- updateScreenAndWait(1);
+ msecCount += 2;
+ updateScreenAndWait(msecCount);
}
stepNr++;
newScreenRect.translate(-1, 0);
@@ -378,7 +404,8 @@ void GfxTransitions::straight(int16 number, bool blackoutFlag) {
while (newScreenRect.right <= _picRect.right) {
copyRectToScreen(newScreenRect, blackoutFlag);
if ((stepNr & 1) == 0) {
- updateScreenAndWait(1);
+ msecCount += 2;
+ updateScreenAndWait(msecCount);
}
stepNr++;
newScreenRect.translate(1, 0);
@@ -389,7 +416,8 @@ void GfxTransitions::straight(int16 number, bool blackoutFlag) {
newScreenRect.top = newScreenRect.bottom - 1;
while (newScreenRect.top >= _picRect.top) {
copyRectToScreen(newScreenRect, blackoutFlag);
- updateScreenAndWait(3);
+ msecCount += 4;
+ updateScreenAndWait(msecCount);
stepNr++;
newScreenRect.translate(0, -1);
}
@@ -399,7 +427,8 @@ void GfxTransitions::straight(int16 number, bool blackoutFlag) {
newScreenRect.bottom = newScreenRect.top + 1;
while (newScreenRect.bottom <= _picRect.bottom) {
copyRectToScreen(newScreenRect, blackoutFlag);
- updateScreenAndWait(3);
+ msecCount += 4;
+ updateScreenAndWait(msecCount);
stepNr++;
newScreenRect.translate(0, 1);
}
@@ -428,6 +457,7 @@ void GfxTransitions::scroll(int16 number) {
Common::Rect oldScreenRect = _picRect;
Common::Rect newMoveRect = _picRect;
Common::Rect newScreenRect = _picRect;
+ uint32 msecCount = 0;
_screen->copyFromScreen(_oldScreen);
screenWidth = _screen->getDisplayWidth(); screenHeight = _screen->getDisplayHeight();
@@ -438,42 +468,36 @@ void GfxTransitions::scroll(int16 number) {
newMoveRect.left = newMoveRect.right;
while (oldMoveRect.left < oldMoveRect.right) {
oldMoveRect.right--; oldScreenRect.left++;
- if (oldMoveRect.right > oldMoveRect.left)
- scrollCopyOldToScreen(oldScreenRect, oldMoveRect.left, oldMoveRect.top);
newScreenRect.right++; newMoveRect.left--;
- _screen->copyRectToScreen(newScreenRect, newMoveRect.left, newMoveRect.top);
if ((stepNr & 1) == 0) {
- updateScreenAndWait(1);
+ msecCount += 5;
+ if (doCreateFrame(msecCount)) {
+ if (oldMoveRect.right > oldMoveRect.left)
+ scrollCopyOldToScreen(oldScreenRect, oldMoveRect.left, oldMoveRect.top);
+ _screen->copyRectToScreen(newScreenRect, newMoveRect.left, newMoveRect.top);
+ updateScreenAndWait(msecCount);
+ }
}
stepNr++;
}
- if ((stepNr & 1) == 0) {
- if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) {
- g_system->updateScreen();
- g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis();
- }
- }
break;
case SCI_TRANSITIONS_SCROLL_RIGHT:
newScreenRect.left = newScreenRect.right;
while (oldMoveRect.left < oldMoveRect.right) {
oldMoveRect.left++; oldScreenRect.right--;
- if (oldMoveRect.right > oldMoveRect.left)
- scrollCopyOldToScreen(oldScreenRect, oldMoveRect.left, oldMoveRect.top);
newScreenRect.left--;
- _screen->copyRectToScreen(newScreenRect, newMoveRect.left, newMoveRect.top);
if ((stepNr & 1) == 0) {
- updateScreenAndWait(1);
+ msecCount += 5;
+ if (doCreateFrame(msecCount)) {
+ if (oldMoveRect.right > oldMoveRect.left)
+ scrollCopyOldToScreen(oldScreenRect, oldMoveRect.left, oldMoveRect.top);
+ _screen->copyRectToScreen(newScreenRect, newMoveRect.left, newMoveRect.top);
+ updateScreenAndWait(msecCount);
+ }
}
stepNr++;
}
- if ((stepNr & 1) == 0) {
- if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) {
- g_system->updateScreen();
- g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis();
- }
- }
break;
case SCI_TRANSITIONS_SCROLL_UP:
@@ -481,11 +505,15 @@ void GfxTransitions::scroll(int16 number) {
newMoveRect.top = newMoveRect.bottom;
while (oldMoveRect.top < oldMoveRect.bottom) {
oldMoveRect.top++; oldScreenRect.top++;
- if (oldMoveRect.top < oldMoveRect.bottom)
- scrollCopyOldToScreen(oldScreenRect, _picRect.left, _picRect.top);
newScreenRect.bottom++; newMoveRect.top--;
- _screen->copyRectToScreen(newScreenRect, newMoveRect.left, newMoveRect.top);
- updateScreenAndWait(3);
+
+ msecCount += 5;
+ if (doCreateFrame(msecCount)) {
+ if (oldMoveRect.top < oldMoveRect.bottom)
+ scrollCopyOldToScreen(oldScreenRect, _picRect.left, _picRect.top);
+ _screen->copyRectToScreen(newScreenRect, newMoveRect.left, newMoveRect.top);
+ updateScreenAndWait(msecCount);
+ }
}
break;
@@ -493,14 +521,22 @@ void GfxTransitions::scroll(int16 number) {
newScreenRect.top = newScreenRect.bottom;
while (oldMoveRect.top < oldMoveRect.bottom) {
oldMoveRect.top++; oldScreenRect.bottom--;
- if (oldMoveRect.top < oldMoveRect.bottom)
- scrollCopyOldToScreen(oldScreenRect, oldMoveRect.left, oldMoveRect.top);
newScreenRect.top--;
- _screen->copyRectToScreen(newScreenRect, _picRect.left, _picRect.top);
- updateScreenAndWait(3);
+
+ msecCount += 5;
+ if (doCreateFrame(msecCount)) {
+ if (oldMoveRect.top < oldMoveRect.bottom)
+ scrollCopyOldToScreen(oldScreenRect, oldMoveRect.left, oldMoveRect.top);
+ _screen->copyRectToScreen(newScreenRect, _picRect.left, _picRect.top);
+ updateScreenAndWait(msecCount);
+ }
}
break;
}
+
+ // Copy over final position just in case
+ _screen->copyRectToScreen(newScreenRect);
+ g_system->updateScreen();
}
// Vertically displays new screen starting from center - works on _picRect area
@@ -508,6 +544,7 @@ void GfxTransitions::scroll(int16 number) {
void GfxTransitions::verticalRollFromCenter(bool blackoutFlag) {
Common::Rect leftRect = Common::Rect(_picRect.left + (_picRect.width() / 2) -1, _picRect.top, _picRect.left + (_picRect.width() / 2), _picRect.bottom);
Common::Rect rightRect = Common::Rect(leftRect.right, _picRect.top, leftRect.right + 1, _picRect.bottom);
+ uint32 msecCount = 0;
while ((leftRect.left >= _picRect.left) || (rightRect.right <= _picRect.right)) {
if (leftRect.left < _picRect.left)
@@ -516,7 +553,8 @@ void GfxTransitions::verticalRollFromCenter(bool blackoutFlag) {
rightRect.translate(-1, 0);
copyRectToScreen(leftRect, blackoutFlag); leftRect.translate(-1, 0);
copyRectToScreen(rightRect, blackoutFlag); rightRect.translate(1, 0);
- updateScreenAndWait(2);
+ msecCount += 3;
+ updateScreenAndWait(msecCount);
}
}
@@ -525,11 +563,13 @@ void GfxTransitions::verticalRollFromCenter(bool blackoutFlag) {
void GfxTransitions::verticalRollToCenter(bool blackoutFlag) {
Common::Rect leftRect = Common::Rect(_picRect.left, _picRect.top, _picRect.left + 1, _picRect.bottom);
Common::Rect rightRect = Common::Rect(_picRect.right - 1, _picRect.top, _picRect.right, _picRect.bottom);
+ uint32 msecCount = 0;
while (leftRect.left < rightRect.right) {
copyRectToScreen(leftRect, blackoutFlag); leftRect.translate(1, 0);
copyRectToScreen(rightRect, blackoutFlag); rightRect.translate(-1, 0);
- updateScreenAndWait(2);
+ msecCount += 3;
+ updateScreenAndWait(msecCount);
}
}
@@ -538,6 +578,7 @@ void GfxTransitions::verticalRollToCenter(bool blackoutFlag) {
void GfxTransitions::horizontalRollFromCenter(bool blackoutFlag) {
Common::Rect upperRect = Common::Rect(_picRect.left, _picRect.top + (_picRect.height() / 2) - 1, _picRect.right, _picRect.top + (_picRect.height() / 2));
Common::Rect lowerRect = Common::Rect(upperRect.left, upperRect.bottom, upperRect.right, upperRect.bottom + 1);
+ uint32 msecCount = 0;
while ((upperRect.top >= _picRect.top) || (lowerRect.bottom <= _picRect.bottom)) {
if (upperRect.top < _picRect.top)
@@ -546,7 +587,8 @@ void GfxTransitions::horizontalRollFromCenter(bool blackoutFlag) {
lowerRect.translate(0, -1);
copyRectToScreen(upperRect, blackoutFlag); upperRect.translate(0, -1);
copyRectToScreen(lowerRect, blackoutFlag); lowerRect.translate(0, 1);
- updateScreenAndWait(3);
+ msecCount += 4;
+ updateScreenAndWait(msecCount);
}
}
@@ -555,11 +597,13 @@ void GfxTransitions::horizontalRollFromCenter(bool blackoutFlag) {
void GfxTransitions::horizontalRollToCenter(bool blackoutFlag) {
Common::Rect upperRect = Common::Rect(_picRect.left, _picRect.top, _picRect.right, _picRect.top + 1);
Common::Rect lowerRect = Common::Rect(upperRect.left, _picRect.bottom - 1, upperRect.right, _picRect.bottom);
+ uint32 msecCount = 0;
while (upperRect.top < lowerRect.bottom) {
copyRectToScreen(upperRect, blackoutFlag); upperRect.translate(0, 1);
copyRectToScreen(lowerRect, blackoutFlag); lowerRect.translate(0, -1);
- updateScreenAndWait(3);
+ msecCount += 4;
+ updateScreenAndWait(msecCount);
}
}
@@ -571,6 +615,7 @@ void GfxTransitions::diagonalRollFromCenter(bool blackoutFlag) {
Common::Rect lowerRect(upperRect.left, upperRect.top, upperRect.right, upperRect.bottom);
Common::Rect leftRect(upperRect.left, upperRect.top, upperRect.left + 1, lowerRect.bottom);
Common::Rect rightRect(upperRect.right, upperRect.top, upperRect.right + 1, lowerRect.bottom);
+ uint32 msecCount = 0;
while ((upperRect.top >= _picRect.top) || (lowerRect.bottom <= _picRect.bottom)) {
if (upperRect.top < _picRect.top) {
@@ -589,7 +634,8 @@ void GfxTransitions::diagonalRollFromCenter(bool blackoutFlag) {
copyRectToScreen(lowerRect, blackoutFlag); lowerRect.translate(0, 1); lowerRect.left--; lowerRect.right++;
copyRectToScreen(leftRect, blackoutFlag); leftRect.translate(-1, 0); leftRect.top--; leftRect.bottom++;
copyRectToScreen(rightRect, blackoutFlag); rightRect.translate(1, 0); rightRect.top--; rightRect.bottom++;
- updateScreenAndWait(3);
+ msecCount += 4;
+ updateScreenAndWait(msecCount);
}
}
@@ -600,13 +646,15 @@ void GfxTransitions::diagonalRollToCenter(bool blackoutFlag) {
Common::Rect lowerRect(_picRect.left, _picRect.bottom - 1, _picRect.right, _picRect.bottom);
Common::Rect leftRect(_picRect.left, _picRect.top, _picRect.left + 1, _picRect.bottom);
Common::Rect rightRect(_picRect.right - 1, _picRect.top, _picRect.right, _picRect.bottom);
+ uint32 msecCount = 0;
while (upperRect.top < lowerRect.bottom) {
copyRectToScreen(upperRect, blackoutFlag); upperRect.translate(0, 1); upperRect.left++; upperRect.right--;
copyRectToScreen(lowerRect, blackoutFlag); lowerRect.translate(0, -1); lowerRect.left++; lowerRect.right--;
copyRectToScreen(leftRect, blackoutFlag); leftRect.translate(1, 0);
copyRectToScreen(rightRect, blackoutFlag); rightRect.translate(-1, 0);
- updateScreenAndWait(3);
+ msecCount += 4;
+ updateScreenAndWait(msecCount);
}
}
diff --git a/engines/sci/graphics/transitions.h b/engines/sci/graphics/transitions.h
index 233638ffda..674b7a8173 100644
--- a/engines/sci/graphics/transitions.h
+++ b/engines/sci/graphics/transitions.h
@@ -91,7 +91,8 @@ private:
void horizontalRollToCenter(bool blackoutFlag);
void diagonalRollFromCenter(bool blackoutFlag);
void diagonalRollToCenter(bool blackoutFlag);
- void updateScreenAndWait(int msec);
+ bool doCreateFrame(uint32 shouldBeAtMsec);
+ void updateScreenAndWait(uint32 shouldBeAtMsec);
GfxScreen *_screen;
GfxPalette *_palette;
@@ -102,6 +103,8 @@ private:
bool _blackoutFlag;
Common::Rect _picRect;
byte *_oldScreen; // buffer for saving current active screen data to, has dimenions of _screen->_displayScreen
+
+ uint32 _transitionStartTime; // when the current transition started in milliseconds
};
} // End of namespace Sci
diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp
index 5f48574dcb..6b22ed397e 100644
--- a/engines/sci/graphics/view.cpp
+++ b/engines/sci/graphics/view.cpp
@@ -128,8 +128,11 @@ void GfxView::initData(GuiResourceId resourceId) {
_palette->createFromData(&_resourceData[palOffset], _resourceSize - palOffset, &_viewPalette);
_embeddedPal = true;
} else {
- // Only use the EGA-mapping, when being SCI1
- if (getSciVersion() >= SCI_VERSION_1_EGA) {
+ // Only use the EGA-mapping, when being SCI1 EGA
+ // SCI1 VGA conversion games (which will get detected as SCI1EARLY/MIDDLE/LATE) have some views
+ // with broken mapping tables. I guess those games won't use the mapping, so I rather disable it
+ // for them
+ if (getSciVersion() == SCI_VERSION_1_EGA) {
_EGAmapping = &_resourceData[palOffset];
for (EGAmapNr = 0; EGAmapNr < SCI_VIEW_EGAMAPPING_COUNT; EGAmapNr++) {
if (memcmp(_EGAmapping, EGAmappingStraight, SCI_VIEW_EGAMAPPING_SIZE) != 0)
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp
index 17dc7171dd..46fb0fbf99 100644
--- a/engines/sci/resource.cpp
+++ b/engines/sci/resource.cpp
@@ -365,8 +365,6 @@ Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *sourc
return NULL;
}
-static uint32 resTypeToMacTag(ResourceType type);
-
void ResourceManager::loadResource(Resource *res) {
res->_source->loadResource(this, res);
}
@@ -382,8 +380,14 @@ void PatchResourceSource::loadResource(ResourceManager *resMan, Resource *res) {
}
}
+static Common::Array<uint32> resTypeToMacTags(ResourceType type);
+
void MacResourceForkResourceSource::loadResource(ResourceManager *resMan, Resource *res) {
- Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->getType()), res->getNumber());
+ Common::SeekableReadStream *stream = 0;
+ Common::Array<uint32> tagArray = resTypeToMacTags(res->getType());
+
+ for (uint32 i = 0; i < tagArray.size() && !stream; i++)
+ stream = _macResMan->getResource(tagArray[i], res->getNumber());
if (!stream)
error("Could not get Mac resource fork resource: %s %d", getResourceTypeName(res->getType()), res->getNumber());
@@ -1514,7 +1518,7 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) {
} while (type != 0x1F); // the last entry is FF
// reading each type's offsets
- uint32 off = 0;
+ uint32 fileOffset = 0;
for (type = 0; type < 32; type++) {
if (resMap[type].wOffset == 0) // this resource does not exist in map
continue;
@@ -1524,15 +1528,15 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) {
int volume_nr = 0;
if (_mapVersion == kResVersionSci11) {
// offset stored in 3 bytes
- off = fileStream->readUint16LE();
- off |= fileStream->readByte() << 16;
- off <<= 1;
+ fileOffset = fileStream->readUint16LE();
+ fileOffset |= fileStream->readByte() << 16;
+ fileOffset <<= 1;
} else {
// offset/volume stored in 4 bytes
- off = fileStream->readUint32LE();
+ fileOffset = fileStream->readUint32LE();
if (_mapVersion < kResVersionSci11) {
- volume_nr = off >> 28; // most significant 4 bits
- off &= 0x0FFFFFFF; // least significant 28 bits
+ volume_nr = fileOffset >> 28; // most significant 4 bits
+ fileOffset &= 0x0FFFFFFF; // least significant 28 bits
} else {
// in SCI32 it's a plain offset
}
@@ -1543,19 +1547,30 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) {
return SCI_ERROR_RESMAP_NOT_FOUND;
}
resId = ResourceId(convertResType(type), number);
- // adding new resource only if it does not exist
- if (_resMap.contains(resId) == false) {
- // NOTE: We add the map's volume number here to the specified volume number
- // for SCI2.1 and SCI3 maps that are not resmap.000. The resmap.* files' numbers
- // need to be used in concurrence with the volume specified in the map to get
- // the actual resource file.
- int mapVolumeNr = volume_nr + map->_volumeNumber;
- ResourceSource *source = findVolume(map, mapVolumeNr);
- // FIXME: this code has serious issues with multiple RESMAP.* files (like in unmodified gk2)
- // adding a resource with source == NULL would crash later on
- if (!source)
- error("Unable to find volume for map %s volumeNr %d", map->getLocationName().c_str(), mapVolumeNr);
- addResource(resId, source, off);
+ // NOTE: We add the map's volume number here to the specified volume number
+ // for SCI2.1 and SCI3 maps that are not resmap.000. The resmap.* files' numbers
+ // need to be used in concurrence with the volume specified in the map to get
+ // the actual resource file.
+ int mapVolumeNr = volume_nr + map->_volumeNumber;
+ ResourceSource *source = findVolume(map, mapVolumeNr);
+ // FIXME: this code has serious issues with multiple RESMAP.* files (like in unmodified gk2)
+ // adding a resource with source == NULL would crash later on
+ if (!source)
+ error("Unable to find volume for map %s volumeNr %d", map->getLocationName().c_str(), mapVolumeNr);
+
+ Resource *resource = _resMap.getVal(resId, NULL);
+ if (!resource) {
+ addResource(resId, source, fileOffset);
+ } else {
+ // if resource is already present, change it to new content
+ // this is needed at least for pharkas/german. This version
+ // contains several duplicate resources INSIDE the resource
+ // data files like fonts, views, scripts, etc. And if we use
+ // the first entries, half of the game will be english and
+ // umlauts will also be missing :P
+ resource->_source = source;
+ resource->_fileOffset = fileOffset;
+ resource->size = 0;
}
}
}
@@ -1588,12 +1603,14 @@ struct {
{ MKID_BE('SYN '), kResourceTypeSync }
};
-static uint32 resTypeToMacTag(ResourceType type) {
+static Common::Array<uint32> resTypeToMacTags(ResourceType type) {
+ Common::Array<uint32> tags;
+
for (uint32 i = 0; i < ARRAYSIZE(macResTagMap); i++)
if (macResTagMap[i].type == type)
- return macResTagMap[i].tag;
+ tags.push_back(macResTagMap[i].tag);
- return 0;
+ return tags;
}
void MacResourceForkResourceSource::scanSource(ResourceManager *resMan) {
@@ -2051,6 +2068,15 @@ void ResourceManager::detectSciVersion() {
s_sciVersion = SCI_VERSION_1_1;
return;
}
+ // FIXME: this is really difficult, lsl1 spanish has map/vol sci1late
+ // and the only current detection difference is movecounttype which
+ // is increment here, but ignore for all the regular sci1late games
+ // the problem is, we dont have access to that detection till later
+ // so maybe (part of?) that detection should get moved in here
+ if (g_sci && (g_sci->getGameId() == GID_LSL1) && (g_sci->getLanguage() == Common::ES_ESP)) {
+ s_sciVersion = SCI_VERSION_1_MIDDLE;
+ return;
+ }
s_sciVersion = SCI_VERSION_1_LATE;
return;
case kResVersionSci11:
@@ -2122,6 +2148,19 @@ bool ResourceManager::detectForPaletteMergingForSci11() {
return false;
}
+// is called on SCI0EARLY games to make sure that sound resources are in fact also SCI0EARLY
+bool ResourceManager::detectEarlySound() {
+ Resource *res = findResource(ResourceId(kResourceTypeSound, 1), 0);
+ if (res) {
+ if (res->size >= 0x22) {
+ if (READ_LE_UINT16(res->data + 0x1f) == 0) // channel 15 voice count + play mask is 0 in SCI0LATE
+ if (res->data[0x21] == 0) // last byte right before actual data is 0 as well
+ return false;
+ }
+ }
+ return true;
+}
+
// Functions below are based on PD code by Brian Provinciano (SCI Studio)
bool ResourceManager::hasOldScriptHeader() {
Resource *res = findResource(ResourceId(kResourceTypeScript, 0), 0);
diff --git a/engines/sci/resource.h b/engines/sci/resource.h
index 48210b835f..53c00f6ec0 100644
--- a/engines/sci/resource.h
+++ b/engines/sci/resource.h
@@ -315,6 +315,7 @@ public:
void setAudioLanguage(int language);
int getAudioLanguage() const;
+ bool isGMTrackIncluded();
bool isVGA() const { return (_viewType == kViewVga) || (_viewType == kViewVga11); }
bool isAmiga32color() const { return _viewType == kViewAmiga; }
bool isSci11Mac() const { return _volVersion == kResVersionSci11Mac; }
@@ -344,6 +345,8 @@ public:
bool detectFontExtended();
// Detects, if SCI1.1 game uses palette merging
bool detectForPaletteMergingForSci11();
+ // Detects, if SCI0EARLY game also has SCI0EARLY sound resources
+ bool detectEarlySound();
/**
* Finds the internal Sierra ID of the current game from script 0.
diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp
index a25505fe47..590926dbbd 100644
--- a/engines/sci/resource_audio.cpp
+++ b/engines/sci/resource_audio.cpp
@@ -519,6 +519,41 @@ int ResourceManager::getAudioLanguage() const {
return (_audioMapSCI1 ? _audioMapSCI1->_volumeNumber : 0);
}
+bool ResourceManager::isGMTrackIncluded() {
+ // This check only makes sense for SCI1 and newer games
+ if (getSciVersion() < SCI_VERSION_1_EARLY)
+ return false;
+
+ // SCI2 and newer games always have GM tracks
+ if (getSciVersion() >= SCI_VERSION_2)
+ return true;
+
+ // For the leftover games, we can safely use SCI_VERSION_1_EARLY for the soundVersion
+ const SciVersion soundVersion = SCI_VERSION_1_EARLY;
+
+ // Read the first song and check if it has a GM track
+ bool result = false;
+ Common::List<ResourceId> *resources = listResources(kResourceTypeSound, -1);
+ Common::sort(resources->begin(), resources->end());
+ Common::List<ResourceId>::iterator itr = resources->begin();
+ int firstSongId = itr->getNumber();
+ delete resources;
+
+ SoundResource *song1 = new SoundResource(firstSongId, this, soundVersion);
+ if (!song1) {
+ warning("ResourceManager::isGMTrackIncluded: track 1 not found");
+ return false;
+ }
+
+ SoundResource::Track *gmTrack = song1->getTrackByType(0x07);
+ if (gmTrack)
+ result = true;
+
+ delete song1;
+
+ return result;
+}
+
SoundResource::SoundResource(uint32 resourceNr, ResourceManager *resMan, SciVersion soundVersion) : _resMan(resMan), _soundVersion(soundVersion) {
Resource *resource = _resMan->findResource(ResourceId(kResourceTypeSound, resourceNr), true);
int trackNr, channelNr;
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index 7a9a786121..8fc0f667d3 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -45,6 +45,7 @@
#include "sci/engine/selector.h" // for SELECTOR
#include "sci/sound/audio.h"
+#include "sci/sound/music.h"
#include "sci/sound/soundcmd.h"
#include "sci/graphics/animate.h"
#include "sci/graphics/cache.h"
@@ -173,12 +174,15 @@ SciEngine::~SciEngine() {
g_sci = 0;
}
+extern void showScummVMDialog(const Common::String &message);
+
Common::Error SciEngine::run() {
g_eventRec.registerRandomSource(_rng, "sci");
// Assign default values to the config manager, in case settings are missing
- ConfMan.registerDefault("undither", "true");
- ConfMan.registerDefault("enable_fb01", "false");
+ ConfMan.registerDefault("sci_undither", "true");
+ ConfMan.registerDefault("sci_originalsaveload", "false");
+ ConfMan.registerDefault("native_fb01", "false");
_resMan = new ResourceManager();
assert(_resMan);
@@ -199,17 +203,19 @@ Common::Error SciEngine::run() {
// Add the after market GM patches for the specified game, if they exist
_resMan->addNewGMPatch(_gameId);
- _gameObj = _resMan->findGameObject();
+ _gameObjectAddress = _resMan->findGameObject();
+ _gameSuperClassAddress = NULL_REG;
SegManager *segMan = new SegManager(_resMan);
// Initialize the game screen
_gfxScreen = new GfxScreen(_resMan);
- _gfxScreen->debugUnditherSetState(ConfMan.getBool("undither"));
+ _gfxScreen->debugUnditherSetState(ConfMan.getBool("sci_undither"));
// Create debugger console. It requires GFX to be initialized
_console = new Console(this);
_kernel = new Kernel(_resMan, segMan);
+
_features = new GameFeatures(segMan, _kernel);
// Only SCI0, SCI01 and SCI1 EGA games used a parser
_vocabulary = (getSciVersion() <= SCI_VERSION_1_EGA) ? new Vocabulary(_resMan, false) : NULL;
@@ -229,6 +235,14 @@ Common::Error SciEngine::run() {
return Common::kUnknownError;
}
+ // we try to find the super class address of the game object, we can't do that earlier
+ const Object *gameObject = segMan->getObject(_gameObjectAddress);
+ if (!gameObject) {
+ warning("Could not get game object, aborting...");
+ return Common::kUnknownError;
+ }
+ _gameSuperClassAddress = gameObject->getSuperClassSelector();
+
script_adjust_opcode_formats();
// Must be called after game_init(), as they use _features
@@ -242,52 +256,93 @@ Common::Error SciEngine::run() {
debug("Emulating SCI version %s\n", getSciVersionDesc(getSciVersion()));
+ // Patch in our save/restore code, so that dialogs are replaced
+ patchGameSaveRestore(segMan);
+
if (_gameDescription->flags & ADGF_ADDENGLISH) {
// if game is multilingual
Common::Language selectedLanguage = Common::parseLanguage(ConfMan.get("language"));
if (selectedLanguage == Common::EN_ANY) {
// and english was selected as language
if (SELECTOR(printLang) != -1) // set text language to english
- writeSelectorValue(segMan, _gameObj, SELECTOR(printLang), 1);
+ writeSelectorValue(segMan, _gameObjectAddress, SELECTOR(printLang), 1);
if (SELECTOR(parseLang) != -1) // and set parser language to english as well
- writeSelectorValue(segMan, _gameObj, SELECTOR(parseLang), 1);
+ writeSelectorValue(segMan, _gameObjectAddress, SELECTOR(parseLang), 1);
}
}
// Check whether loading a savestate was requested
- int saveSlot = ConfMan.getInt("save_slot");
- if (saveSlot >= 0) {
- reg_t restoreArgv[2] = { NULL_REG, make_reg(0, saveSlot) }; // special call (argv[0] is NULL)
+ int directSaveSlotLoading = ConfMan.getInt("save_slot");
+ if (directSaveSlotLoading >= 0) {
+ // call GameObject::play (like normally)
+ initStackBaseWithSelector(SELECTOR(play));
+ // We set this, so that the game automatically quit right after init
+ _gamestate->variables[VAR_GLOBAL][4] = TRUE_REG;
+
+ _gamestate->_executionStackPosChanged = false;
+ run_vm(_gamestate);
+
+ // As soon as we get control again, actually restore the game
+ reg_t restoreArgv[2] = { NULL_REG, make_reg(0, directSaveSlotLoading) }; // special call (argv[0] is NULL)
kRestoreGame(_gamestate, 2, restoreArgv);
- // TODO: The best way to do the following would be to invoke Game::init
- // here and stop when the room is about to be changed, otherwise some
- // game initialization won't take place
+ // this indirectly calls GameObject::init, which will setup menu, text font/color codes etc.
+ // without this games would be pretty badly broken
+ }
- // Set audio language for KQ5CD (bug #3039477)
- if (g_sci->getGameId() == GID_KQ5 && Common::File::exists("AUDIO001.002")) {
- reg_t doAudioArgv[2] = { make_reg(0, 9), make_reg(0, 1) };
- kDoAudio(_gamestate, 2, doAudioArgv);
+ // Show any special warnings for buggy scripts with severe game bugs,
+ // which have been patched by Sierra
+ if (getGameId() == GID_LONGBOW) {
+ // Longbow 1.0 has a buggy script which prevents the game
+ // from progressing during the Green Man riddle sequence.
+ // A patch for this buggy script has been released by Sierra,
+ // and is necessary to complete the game without issues.
+ // The patched script is included in Longbow 1.1.
+ // Refer to bug #3036609.
+ Resource *buggyScript = _resMan->findResource(ResourceId(kResourceTypeScript, 180), 0);
+
+ if (buggyScript && (buggyScript->size == 12354 || buggyScript->size == 12362)) {
+ showScummVMDialog("A known buggy game script has been detected, which could "
+ "prevent you from progressing later on in the game, during "
+ "the sequence with the Green Man's riddles. Please, apply "
+ "the latest patch for this game by Sierra to avoid possible "
+ "problems");
}
+ }
- // Initialize the game menu, if there is one.
- // This is not done when loading, so we must do it manually.
- reg_t menuBarObj = _gamestate->_segMan->findObjectByName("MenuBar");
- if (menuBarObj.isNull())
- menuBarObj = _gamestate->_segMan->findObjectByName("TheMenuBar"); // LSL2
- if (menuBarObj.isNull())
- menuBarObj = _gamestate->_segMan->findObjectByName("menuBar"); // LSL6
- if (!menuBarObj.isNull()) {
- // Reset abortScriptProcessing before initializing the game menu, so that the
- // VM call performed by invokeSelector will actually run.
- _gamestate->abortScriptProcessing = kAbortNone;
- Object *menuBar = _gamestate->_segMan->getObject(menuBarObj);
- // Invoke the first method (init) of the menuBar object
- invokeSelector(_gamestate, menuBarObj, menuBar->getFuncSelector(0), 0, _gamestate->stack_base);
- _gamestate->abortScriptProcessing = kAbortLoadGame;
+ // Show a warning if the user has selected a General MIDI device, no GM patch exists
+ // (i.e. patch 4) and the game is one of the known 8 SCI1 games that Sierra has provided
+ // after market patches for in their "General MIDI Utility".
+ if (_soundCmd->getMusicType() == MT_GM) {
+ if (!_resMan->findResource(ResourceId(kResourceTypePatch, 4), 0)) {
+ switch (getGameId()) {
+ case GID_ECOQUEST:
+ case GID_HOYLE3:
+ case GID_LSL1:
+ case GID_LSL5:
+ case GID_LONGBOW:
+ case GID_SQ1:
+ case GID_SQ4:
+ case GID_FAIRYTALES:
+ showScummVMDialog("You have selected General MIDI as a sound device. Sierra "
+ "has provided after-market support for General MIDI for this "
+ "game in their \"General MIDI Utility\". Please, apply this "
+ "patch in order to enjoy MIDI music with this game. Once you "
+ "have obtained it, you can unpack all of the included *.PAT "
+ "files in your ScummVM extras folder and ScummVM will add the "
+ "appropriate patch automatically. Alternatively, you can follow "
+ "the instructions in the READ.ME file included in the patch and "
+ "rename the associated *.PAT file to 4.PAT and place it in the "
+ "game folder. Without this patch, General MIDI music for this "
+ "game will sound badly distorted.");
+ break;
+ default:
+ break;
+ }
}
}
+
runGame();
ConfMan.flushToDisk();
@@ -295,6 +350,99 @@ Common::Error SciEngine::run() {
return Common::kNoError;
}
+static byte patchGameRestoreSave[] = {
+ 0x39, 0x03, // pushi 03
+ 0x76, // push0
+ 0x38, 0xff, 0xff, // pushi -1
+ 0x76, // push0
+ 0x43, 0xff, 0x06, // call kRestoreGame/kSaveGame (will get fixed directly)
+ 0x48, // ret
+};
+
+void SciEngine::patchGameSaveRestore(SegManager *segMan) {
+ const Object *gameObject = segMan->getObject(_gameObjectAddress);
+ const uint16 gameMethodCount = gameObject->getMethodCount();
+ const Object *gameSuperObject = segMan->getObject(_gameSuperClassAddress);
+ const uint16 gameSuperMethodCount = gameSuperObject->getMethodCount();
+ reg_t methodAddress;
+ const uint16 kernelCount = _kernel->getKernelNamesSize();
+ const byte *scriptRestorePtr = NULL;
+ byte kernelIdRestore = 0;
+ const byte *scriptSavePtr = NULL;
+ byte kernelIdSave = 0;
+
+ // this feature is currently not supported on SCI32
+ if (getSciVersion() >= SCI_VERSION_2)
+ return;
+
+ switch (_gameId) {
+ case GID_MOTHERGOOSE256: // mother goose saves/restores directly and has no save/restore dialogs
+ case GID_JONES: // gets confused, when we patch us in, although the game isn't able to save/restore o_O
+ return;
+ default:
+ break;
+ }
+
+ if (ConfMan.getBool("sci_originalsaveload"))
+ return;
+
+ for (uint16 kernelNr = 0; kernelNr < kernelCount; kernelNr++) {
+ Common::String kernelName = _kernel->getKernelName(kernelNr);
+ if (kernelName == "RestoreGame")
+ kernelIdRestore = kernelNr;
+ if (kernelName == "SaveGame")
+ kernelIdSave = kernelNr;
+ }
+
+ // Search for gameobject-superclass ::restore
+ for (uint16 methodNr = 0; methodNr < gameSuperMethodCount; methodNr++) {
+ uint16 selectorId = gameSuperObject->getFuncSelector(methodNr);
+ Common::String methodName = _kernel->getSelectorName(selectorId);
+ if (methodName == "restore") {
+ methodAddress = gameSuperObject->getFunction(methodNr);
+ Script *script = segMan->getScript(methodAddress.segment);
+ scriptRestorePtr = script->getBuf(methodAddress.offset);
+ }
+ if (methodName == "save") {
+ methodAddress = gameSuperObject->getFunction(methodNr);
+ Script *script = segMan->getScript(methodAddress.segment);
+ scriptSavePtr = script->getBuf(methodAddress.offset);
+ }
+ }
+
+ // Search for gameobject ::save, if there is one patch that one instead
+ for (uint16 methodNr = 0; methodNr < gameMethodCount; methodNr++) {
+ uint16 selectorId = gameObject->getFuncSelector(methodNr);
+ Common::String methodName = _kernel->getSelectorName(selectorId);
+ if (methodName == "save") {
+ methodAddress = gameObject->getFunction(methodNr);
+ Script *script = segMan->getScript(methodAddress.segment);
+ scriptSavePtr = script->getBuf(methodAddress.offset);
+ break;
+ }
+ }
+
+ switch (_gameId) {
+ case GID_FAIRYTALES: // fairy tales automatically saves w/o dialog
+ scriptSavePtr = NULL;
+ default:
+ break;
+ }
+
+ if (scriptRestorePtr) {
+ // Now patch in our code
+ byte *patchPtr = const_cast<byte *>(scriptRestorePtr);
+ memcpy(patchPtr, patchGameRestoreSave, sizeof(patchGameRestoreSave));
+ patchPtr[8] = kernelIdRestore;
+ }
+ if (scriptSavePtr) {
+ // Now patch in our code
+ byte *patchPtr = const_cast<byte *>(scriptSavePtr);
+ memcpy(patchPtr, patchGameRestoreSave, sizeof(patchGameRestoreSave));
+ patchPtr[8] = kernelIdSave;
+ }
+}
+
bool SciEngine::initGame() {
// Script 0 needs to be allocated here before anything else!
int script0Segment = _gamestate->_segMan->getScriptSegment(0, SCRIPT_GET_LOCK);
@@ -422,8 +570,8 @@ void SciEngine::initStackBaseWithSelector(Selector selector) {
_gamestate->stack_base[1] = NULL_REG;
// Register the first element on the execution stack
- if (!send_selector(_gamestate, _gameObj, _gameObj, _gamestate->stack_base, 2, _gamestate->stack_base)) {
- _console->printObject(_gameObj);
+ if (!send_selector(_gamestate, _gameObjectAddress, _gameObjectAddress, _gamestate->stack_base, 2, _gamestate->stack_base)) {
+ _console->printObject(_gameObjectAddress);
error("initStackBaseWithSelector: error while registering the first selector in the call stack");
}
@@ -445,6 +593,7 @@ void SciEngine::runGame() {
_gamestate->_segMan->resetSegMan();
initGame();
initStackBaseWithSelector(SELECTOR(play));
+ patchGameSaveRestore(_gamestate->_segMan);
_gamestate->gameIsRestarting = GAMEISRESTARTING_RESTART;
if (_gfxMenu)
_gfxMenu->reset();
@@ -453,6 +602,7 @@ void SciEngine::runGame() {
_gamestate->abortScriptProcessing = kAbortNone;
_gamestate->_executionStack.clear();
initStackBaseWithSelector(SELECTOR(replay));
+ patchGameSaveRestore(_gamestate->_segMan);
_gamestate->shrinkStackToBase();
_gamestate->abortScriptProcessing = kAbortNone;
} else {
@@ -521,20 +671,6 @@ Common::String SciEngine::getSavegamePattern() const {
}
Common::String SciEngine::getFilePrefix() const {
- if (_gameId == GID_QFG2) {
- // Quest for Glory 2 wants to read files from Quest for Glory 1 (EGA/VGA) to import character data
- if (_gamestate->currentRoomNumber() == 805)
- return "qfg1";
- // TODO: Include import-room for qfg1vga
- } else if (_gameId == GID_QFG3) {
- // Quest for Glory 3 wants to read files from Quest for Glory 2 to import character data
- if (_gamestate->currentRoomNumber() == 54)
- return "qfg2";
- } else if (_gameId == GID_QFG4) {
- // Quest for Glory 4 wants to read files from Quest for Glory 3 to import character data
- if (_gamestate->currentRoomNumber() == 54)
- return "qfg3";
- }
return _targetName;
}
@@ -549,6 +685,19 @@ Common::String SciEngine::unwrapFilename(const Common::String &name) const {
return name;
}
+int SciEngine::inQfGImportRoom() const {
+ if (_gameId == GID_QFG2 && _gamestate->currentRoomNumber() == 805) {
+ // QFG2 character import screen
+ return 2;
+ } else if (_gameId == GID_QFG3 && _gamestate->currentRoomNumber() == 54) {
+ // QFG3 character import screen
+ return 3;
+ } else if (_gameId == GID_QFG4 && _gamestate->currentRoomNumber() == 54) {
+ return 4;
+ }
+ return 0;
+}
+
void SciEngine::pauseEngineIntern(bool pause) {
_mixer->pauseAll(pause);
}
@@ -563,7 +712,7 @@ void SciEngine::syncSoundSettings() {
int soundVolumeMusic = (mute ? 0 : ConfMan.getInt("music_volume"));
if (_gamestate && g_sci->_soundCmd) {
- int vol = (soundVolumeMusic + 1) * SoundCommandParser::kMaxSciVolume / Audio::Mixer::kMaxMixerVolume;
+ int vol = (soundVolumeMusic + 1) * MUSIC_MASTERVOLUME_MAX / Audio::Mixer::kMaxMixerVolume;
g_sci->_soundCmd->setMasterVolume(vol);
}
}
diff --git a/engines/sci/sci.h b/engines/sci/sci.h
index 72d6e7e0cb..7239abad17 100644
--- a/engines/sci/sci.h
+++ b/engines/sci/sci.h
@@ -53,6 +53,7 @@ class Console;
class AudioPlayer;
class SoundCommandParser;
class EventManager;
+class SegManager;
class GfxAnimate;
class GfxCache;
@@ -143,8 +144,9 @@ enum SciGameId {
GID_LSL6,
GID_LSL6HIRES, // We have a separate ID for LSL6 SCI32, because it's actually a completely different game
GID_LSL7,
- GID_MOTHERGOOSE,
- GID_MOTHERGOOSEHIRES, // We have a separate ID for Mother Goose SCI32, because it's actually a completely different game
+ GID_MOTHERGOOSE, // this one is the SCI0 version
+ GID_MOTHERGOOSE256, // this one handles SCI1 and SCI1.1 variants, at least those 2 share a bit in common
+ GID_MOTHERGOOSEHIRES, // this one is the SCI2.1 hires version, completely different from the other ones
GID_MSASTROCHICKEN,
GID_PEPPER,
GID_PHANTASMAGORIA,
@@ -232,7 +234,8 @@ public:
inline EngineState *getEngineState() const { return _gamestate; }
inline Vocabulary *getVocabulary() const { return _vocabulary; }
inline EventManager *getEventManager() const { return _eventMan; }
- inline reg_t getGameObject() const { return _gameObj; }
+ inline reg_t getGameObject() const { return _gameObjectAddress; }
+ inline reg_t getGameSuperClassAddress() const { return _gameSuperClassAddress; }
Common::RandomSource &getRNG() { return _rng; }
@@ -247,11 +250,19 @@ public:
/** Remove the 'TARGET-' prefix of the given filename, if present. */
Common::String unwrapFilename(const Common::String &name) const;
+ /**
+ * Checks if we are in a QfG import screen, where special handling
+ * of file-listings is performed.
+ */
+ int inQfGImportRoom() const;
+
void sleep(uint32 msecs);
void scriptDebug();
bool checkExportBreakpoint(uint16 script, uint16 pubfunct);
- bool checkSelectorBreakpoint(reg_t send_obj, int selector);
+ bool checkSelectorBreakpoint(BreakpointType breakpointType, reg_t send_obj, int selector);
+
+ void patchGameSaveRestore(SegManager *segMan);
public:
@@ -341,7 +352,8 @@ private:
Vocabulary *_vocabulary;
int16 _vocabularyLanguage;
EventManager *_eventMan;
- reg_t _gameObj; /**< Pointer to the game object */
+ reg_t _gameObjectAddress; /**< Pointer to the game object */
+ reg_t _gameSuperClassAddress; // Address of the super class of the game object
Console *_console;
Common::RandomSource _rng;
};
diff --git a/engines/sci/sound/drivers/map-mt32-to-gm.h b/engines/sci/sound/drivers/map-mt32-to-gm.h
index a552ef0608..05d1aeba24 100644
--- a/engines/sci/sound/drivers/map-mt32-to-gm.h
+++ b/engines/sci/sound/drivers/map-mt32-to-gm.h
@@ -421,131 +421,131 @@ static const Mt32ToGmMap Mt32MemoryTimbreMaps[] = {
{"Acou SD ", MIDI_MAPPED_TO_RHYTHM, 38}, /* R (PQ2) */
{"AcouPnoKA ", 0, MIDI_UNMAPPED}, /* ++ (KQ1) */
{"BASS ", 32, MIDI_UNMAPPED}, /* + (LSL3) */
- {"BASSOONPCM", 70, MIDI_UNMAPPED}, /* + (CB) */
+ {"BASSOONPCM", 70, MIDI_UNMAPPED}, /* + (LB1) */
{"BEACH WAVE", 122, MIDI_UNMAPPED}, /* + (LSL3) */
{"BagPipes ", 109, MIDI_UNMAPPED},
- {"BassPizzMS", 45, MIDI_UNMAPPED}, /* ++ (HQ) */
+ {"BassPizzMS", 45, MIDI_UNMAPPED}, /* ++ (QFG1) */
{"BassoonKA ", 70, MIDI_UNMAPPED}, /* ++ (KQ1) */
- {"Bell MS", 112, MIDI_UNMAPPED}, /* ++ (iceMan) */
- {"Bells MS", 112, MIDI_UNMAPPED}, /* + (HQ) */
- {"Big Bell ", 14, MIDI_UNMAPPED}, /* + (CB) */
+ {"Bell MS", 112, MIDI_UNMAPPED}, /* ++ (Iceman) */
+ {"Bells MS", 112, MIDI_UNMAPPED}, /* + (QFG1) */
+ {"Big Bell ", 14, MIDI_UNMAPPED}, /* + (LB1) */
{"Bird Tweet", 123, MIDI_UNMAPPED},
- {"BrsSect MS", 61, MIDI_UNMAPPED}, /* +++ (iceMan) */
+ {"BrsSect MS", 61, MIDI_UNMAPPED}, /* +++ (Iceman) */
{"CLAPPING ", 126, MIDI_UNMAPPED}, /* ++ (LSL3) */
- {"Cabasa ", MIDI_MAPPED_TO_RHYTHM, 69}, /* R (HBoG) */
- {"Calliope ", 82, MIDI_UNMAPPED}, /* +++ (HQ) */
- {"CelticHarp", 46, MIDI_UNMAPPED}, /* ++ (CoC) */
- {"Chicago MS", 1, MIDI_UNMAPPED}, /* ++ (iceMan) */
+ {"Cabasa ", MIDI_MAPPED_TO_RHYTHM, 69}, /* R (Hoyle) */
+ {"Calliope ", 82, MIDI_UNMAPPED}, /* +++ (QFG1) */
+ {"CelticHarp", 46, MIDI_UNMAPPED}, /* ++ (Camelot) */
+ {"Chicago MS", 1, MIDI_UNMAPPED}, /* ++ (Iceman) */
{"Chop ", 117, MIDI_UNMAPPED},
- {"Chorale MS", 52, MIDI_UNMAPPED}, /* + (CoC) */
+ {"Chorale MS", 52, MIDI_UNMAPPED}, /* + (Camelot) */
{"ClarinetMS", 71, MIDI_UNMAPPED},
{"Claves ", MIDI_MAPPED_TO_RHYTHM, 75}, /* R (PQ2) */
- {"Claw MS", 118, MIDI_UNMAPPED}, /* + (HQ) */
- {"ClockBell ", 14, MIDI_UNMAPPED}, /* + (CB) */
+ {"Claw MS", 118, MIDI_UNMAPPED}, /* + (QFG1) */
+ {"ClockBell ", 14, MIDI_UNMAPPED}, /* + (LB1) */
{"ConcertCym", MIDI_MAPPED_TO_RHYTHM, 55}, /* R ? (KQ1) */
- {"Conga MS", MIDI_MAPPED_TO_RHYTHM, 64}, /* R (HQ) */
+ {"Conga MS", MIDI_MAPPED_TO_RHYTHM, 64}, /* R (QFG1) */
{"CoolPhone ", 124, MIDI_UNMAPPED}, /* ++ (LSL3) */
- {"CracklesMS", 115, MIDI_UNMAPPED}, /* ? (CoC, HQ) */
+ {"CracklesMS", 115, MIDI_UNMAPPED}, /* ? (Camelot, QFG1) */
{"CreakyD MS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ??? (KQ1) */
- {"Cricket ", 120, MIDI_UNMAPPED}, /* ? (CB) */
- {"CrshCymbMS", MIDI_MAPPED_TO_RHYTHM, 57}, /* R +++ (iceMan) */
- {"CstlGateMS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (HQ) */
- {"CymSwellMS", MIDI_MAPPED_TO_RHYTHM, 55}, /* R ? (CoC, HQ) */
+ {"Cricket ", 120, MIDI_UNMAPPED}, /* ? (LB1) */
+ {"CrshCymbMS", MIDI_MAPPED_TO_RHYTHM, 57}, /* R +++ (Iceman) */
+ {"CstlGateMS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (QFG1) */
+ {"CymSwellMS", MIDI_MAPPED_TO_RHYTHM, 55}, /* R ? (Camelot, QFG1) */
{"CymbRollKA", MIDI_MAPPED_TO_RHYTHM, 57}, /* R ? (KQ1) */
{"Cymbal Lo ", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* R ? (LSL3) */
- {"card ", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (HBoG) */
- {"DirtGtr MS", 30, MIDI_UNMAPPED}, /* + (iceMan) */
- {"DirtGtr2MS", 29, MIDI_UNMAPPED}, /* + (iceMan) */
+ {"card ", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (Hoyle) */
+ {"DirtGtr MS", 30, MIDI_UNMAPPED}, /* + (Iceman) */
+ {"DirtGtr2MS", 29, MIDI_UNMAPPED}, /* + (Iceman) */
{"E Bass MS", 33, MIDI_UNMAPPED}, /* + (SQ3) */
{"ElecBassMS", 33, MIDI_UNMAPPED},
- {"ElecGtr MS", 27, MIDI_UNMAPPED}, /* ++ (iceMan) */
+ {"ElecGtr MS", 27, MIDI_UNMAPPED}, /* ++ (Iceman) */
{"EnglHornMS", 69, MIDI_UNMAPPED},
{"FantasiaKA", 88, MIDI_UNMAPPED},
{"Fantasy ", 99, MIDI_UNMAPPED}, /* + (PQ2) */
- {"Fantasy2MS", 99, MIDI_UNMAPPED}, /* ++ (CoC, HQ) */
- {"Filter MS", 95, MIDI_UNMAPPED}, /* +++ (iceMan) */
- {"Filter2 MS", 95, MIDI_UNMAPPED}, /* ++ (iceMan) */
- {"Flame2 MS", 121, MIDI_UNMAPPED}, /* ? (HQ) */
- {"Flames MS", 121, MIDI_UNMAPPED}, /* ? (HQ) */
- {"Flute MS", 73, MIDI_UNMAPPED}, /* +++ (HQ) */
+ {"Fantasy2MS", 99, MIDI_UNMAPPED}, /* ++ (Camelot, QFG1) */
+ {"Filter MS", 95, MIDI_UNMAPPED}, /* +++ (Iceman) */
+ {"Filter2 MS", 95, MIDI_UNMAPPED}, /* ++ (Iceman) */
+ {"Flame2 MS", 121, MIDI_UNMAPPED}, /* ? (QFG1) */
+ {"Flames MS", 121, MIDI_UNMAPPED}, /* ? (QFG1) */
+ {"Flute MS", 73, MIDI_UNMAPPED}, /* +++ (QFG1) */
{"FogHorn MS", 58, MIDI_UNMAPPED},
- {"FrHorn1 MS", 60, MIDI_UNMAPPED}, /* +++ (HQ) */
- {"FunnyTrmp ", 56, MIDI_UNMAPPED}, /* ++ (CB) */
+ {"FrHorn1 MS", 60, MIDI_UNMAPPED}, /* +++ (QFG1) */
+ {"FunnyTrmp ", 56, MIDI_UNMAPPED}, /* ++ (LB1) */
{"GameSnd MS", 80, MIDI_UNMAPPED},
- {"Glock MS", 9, MIDI_UNMAPPED}, /* +++ (HQ) */
- {"Gunshot ", 127, MIDI_UNMAPPED}, /* +++ (CB) */
- {"Hammer MS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (HQ) */
- {"Harmonica2", 22, MIDI_UNMAPPED}, /* +++ (CB) */
- {"Harpsi 1 ", 6, MIDI_UNMAPPED}, /* + (HBoG) */
- {"Harpsi 2 ", 6, MIDI_UNMAPPED}, /* +++ (CB) */
- {"Heart MS", 116, MIDI_UNMAPPED}, /* ? (iceMan) */
- {"Horse1 MS", 115, MIDI_UNMAPPED}, /* ? (CoC, HQ) */
- {"Horse2 MS", 115, MIDI_UNMAPPED}, /* ? (CoC, HQ) */
- {"InHale MS", 121, MIDI_UNMAPPED}, /* ++ (iceMan) */
+ {"Glock MS", 9, MIDI_UNMAPPED}, /* +++ (QFG1) */
+ {"Gunshot ", 127, MIDI_UNMAPPED}, /* +++ (LB1) */
+ {"Hammer MS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (QFG1) */
+ {"Harmonica2", 22, MIDI_UNMAPPED}, /* +++ (LB1) */
+ {"Harpsi 1 ", 6, MIDI_UNMAPPED}, /* + (Hoyle) */
+ {"Harpsi 2 ", 6, MIDI_UNMAPPED}, /* +++ (LB1) */
+ {"Heart MS", 116, MIDI_UNMAPPED}, /* ? (Iceman) */
+ {"Horse1 MS", 115, MIDI_UNMAPPED}, /* ? (Camelot, QFG1) */
+ {"Horse2 MS", 115, MIDI_UNMAPPED}, /* ? (Camelot, QFG1) */
+ {"InHale MS", 121, MIDI_UNMAPPED}, /* ++ (Iceman) */
{"KNIFE ", 120, MIDI_UNMAPPED}, /* ? (LSL3) */
- {"KenBanjo ", 105, MIDI_UNMAPPED}, /* +++ (CB) */
- {"Kiss MS", 25, MIDI_UNMAPPED}, /* ++ (HQ) */
+ {"KenBanjo ", 105, MIDI_UNMAPPED}, /* +++ (LB1) */
+ {"Kiss MS", 25, MIDI_UNMAPPED}, /* ++ (QFG1) */
{"KongHit ", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ??? (KQ1) */
{"Koto ", 107, MIDI_UNMAPPED}, /* +++ (PQ2) */
- {"Laser MS", 81, MIDI_UNMAPPED}, /* ?? (HQ) */
- {"Meeps MS", 62, MIDI_UNMAPPED}, /* ? (HQ) */
- {"MTrak MS", 62, MIDI_UNMAPPED}, /* ?? (iceMan) */
- {"MachGun MS", 127, MIDI_UNMAPPED}, /* ? (iceMan) */
+ {"Laser MS", 81, MIDI_UNMAPPED}, /* ?? (QFG1) */
+ {"Meeps MS", 62, MIDI_UNMAPPED}, /* ? (QFG1) */
+ {"MTrak MS", 62, MIDI_UNMAPPED}, /* ?? (Iceman) */
+ {"MachGun MS", 127, MIDI_UNMAPPED}, /* ? (Iceman) */
{"OCEANSOUND", 122, MIDI_UNMAPPED}, /* + (LSL3) */
{"Oboe 2001 ", 68, MIDI_UNMAPPED}, /* + (PQ2) */
- {"Ocean MS", 122, MIDI_UNMAPPED}, /* + (iceMan) */
- {"PPG 2.3 MS", 75, MIDI_UNMAPPED}, /* ? (iceMan) */
- {"PianoCrank", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (CB) */
- {"PicSnareMS", MIDI_MAPPED_TO_RHYTHM, 40}, /* R ? (iceMan) */
+ {"Ocean MS", 122, MIDI_UNMAPPED}, /* + (Iceman) */
+ {"PPG 2.3 MS", 75, MIDI_UNMAPPED}, /* ? (Iceman) */
+ {"PianoCrank", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (LB1) */
+ {"PicSnareMS", MIDI_MAPPED_TO_RHYTHM, 40}, /* R ? (Iceman) */
{"PiccoloKA ", 72, MIDI_UNMAPPED}, /* +++ (KQ1) */
{"PinkBassMS", 39, MIDI_UNMAPPED},
- {"Pizz2 ", 45, MIDI_UNMAPPED}, /* ++ (CB) */
+ {"Pizz2 ", 45, MIDI_UNMAPPED}, /* ++ (LB1) */
{"Portcullis", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (KQ1) */
- {"Raspbry MS", 81, MIDI_UNMAPPED}, /* ? (HQ) */
- {"RatSqueek ", 72, MIDI_UNMAPPED}, /* ? (CB, CoC) */
- {"Record78 ", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* +++ (CB) */
- {"RecorderMS", 74, MIDI_UNMAPPED}, /* +++ (CoC) */
- {"Red Baron ", 125, MIDI_UNMAPPED}, /* ? (CB) */
- {"ReedPipMS ", 20, MIDI_UNMAPPED}, /* +++ (Coc) */
+ {"Raspbry MS", 81, MIDI_UNMAPPED}, /* ? (QFG1) */
+ {"RatSqueek ", 72, MIDI_UNMAPPED}, /* ? (LauraBow1, Camelot) */
+ {"Record78 ", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* +++ (LB1) */
+ {"RecorderMS", 74, MIDI_UNMAPPED}, /* +++ (Camelot) */
+ {"Red Baron ", 125, MIDI_UNMAPPED}, /* ? (LB1) */
+ {"ReedPipMS ", 20, MIDI_UNMAPPED}, /* +++ (Camelot) */
{"RevCymb MS", 119, MIDI_UNMAPPED},
- {"RifleShot ", 127, MIDI_UNMAPPED}, /* + (CB) */
+ {"RifleShot ", 127, MIDI_UNMAPPED}, /* + (LB1) */
{"RimShot MS", MIDI_MAPPED_TO_RHYTHM, 37}, /* R */
{"SHOWER ", 52, MIDI_UNMAPPED}, /* ? (LSL3) */
{"SQ Bass MS", 32, MIDI_UNMAPPED}, /* + (SQ3) */
- {"ShakuVibMS", 79, MIDI_UNMAPPED}, /* + (iceMan) */
- {"SlapBassMS", 36, MIDI_UNMAPPED}, /* +++ (iceMan) */
- {"Snare MS", MIDI_MAPPED_TO_RHYTHM, 38}, /* R (HQ) */
- {"Some Birds", 123, MIDI_UNMAPPED}, /* + (CB) */
- {"Sonar MS", 78, MIDI_UNMAPPED}, /* ? (iceMan) */
- {"Soundtrk2 ", 97, MIDI_UNMAPPED}, /* +++ (CB) */
- {"Soundtrack", 97, MIDI_UNMAPPED}, /* ++ (CoC) */
+ {"ShakuVibMS", 79, MIDI_UNMAPPED}, /* + (Iceman) */
+ {"SlapBassMS", 36, MIDI_UNMAPPED}, /* +++ (Iceman) */
+ {"Snare MS", MIDI_MAPPED_TO_RHYTHM, 38}, /* R (QFG1) */
+ {"Some Birds", 123, MIDI_UNMAPPED}, /* + (LB1) */
+ {"Sonar MS", 78, MIDI_UNMAPPED}, /* ? (Iceman) */
+ {"Soundtrk2 ", 97, MIDI_UNMAPPED}, /* +++ (LB1) */
+ {"Soundtrack", 97, MIDI_UNMAPPED}, /* ++ (Camelot) */
{"SqurWaveMS", 80, MIDI_UNMAPPED},
- {"StabBassMS", 34, MIDI_UNMAPPED}, /* + (iceMan) */
- {"SteelDrmMS", 114, MIDI_UNMAPPED}, /* +++ (iceMan) */
- {"StrSect1MS", 48, MIDI_UNMAPPED}, /* ++ (HQ) */
- {"String MS", 45, MIDI_UNMAPPED}, /* + (CoC) */
+ {"StabBassMS", 34, MIDI_UNMAPPED}, /* + (Iceman) */
+ {"SteelDrmMS", 114, MIDI_UNMAPPED}, /* +++ (Iceman) */
+ {"StrSect1MS", 48, MIDI_UNMAPPED}, /* ++ (QFG1) */
+ {"String MS", 45, MIDI_UNMAPPED}, /* + (Camelot) */
{"Syn-Choir ", 91, MIDI_UNMAPPED},
{"Syn Brass4", 63, MIDI_UNMAPPED}, /* ++ (PQ2) */
{"SynBass MS", 38, MIDI_UNMAPPED},
- {"SwmpBackgr", 120, MIDI_UNMAPPED}, /* ?? (CB,HQ) */
- {"T-Bone2 MS", 57, MIDI_UNMAPPED}, /* +++ (HQ) */
- {"Taiko ", 116, 35}, /* +++ (Coc) */
+ {"SwmpBackgr", 120, MIDI_UNMAPPED}, /* ?? (LB1, QFG1) */
+ {"T-Bone2 MS", 57, MIDI_UNMAPPED}, /* +++ (QFG1) */
+ {"Taiko ", 116, 35}, /* +++ (Camelot) */
{"Taiko Rim ", 118, 37}, /* +++ (LSL3) */
- {"Timpani1 ", 47, MIDI_UNMAPPED}, /* +++ (CB) */
- {"Tom MS", 117, 48}, /* +++ (iceMan) */
- {"Toms MS", 117, 48}, /* +++ (CoC, HQ) */
+ {"Timpani1 ", 47, MIDI_UNMAPPED}, /* +++ (LB1) */
+ {"Tom MS", 117, 48}, /* +++ (Iceman) */
+ {"Toms MS", 117, 48}, /* +++ (Camelot, QFG1) */
{"Tpt1prtl ", 56, MIDI_UNMAPPED}, /* +++ (KQ1) */
- {"TriangleMS", 112, 81}, /* R (CoC) */
- {"Trumpet 1 ", 56, MIDI_UNMAPPED}, /* +++ (CoC) */
- {"Type MS", MIDI_MAPPED_TO_RHYTHM, 39}, /* + (iceMan) */
+ {"TriangleMS", 112, 81}, /* R (Camelot) */
+ {"Trumpet 1 ", 56, MIDI_UNMAPPED}, /* +++ (Camelot) */
+ {"Type MS", MIDI_MAPPED_TO_RHYTHM, 39}, /* + (Iceman) */
{"WaterBells", 98, MIDI_UNMAPPED}, /* + (PQ2) */
{"WaterFallK", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (KQ1) */
- {"Whiporill ", 123, MIDI_UNMAPPED}, /* + (CB) */
- {"Wind ", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (CB) */
- {"Wind MS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (HQ, iceMan) */
- {"Wind2 MS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (CoC) */
- {"Woodpecker", 115, MIDI_UNMAPPED}, /* ? (CB) */
- {"WtrFall MS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (CoC, HQ, iceMan) */
+ {"Whiporill ", 123, MIDI_UNMAPPED}, /* + (LB1) */
+ {"Wind ", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (LB1) */
+ {"Wind MS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (QFG1, Iceman) */
+ {"Wind2 MS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (Camelot) */
+ {"Woodpecker", 115, MIDI_UNMAPPED}, /* ? (LB1) */
+ {"WtrFall MS", MIDI_UNMAPPED, MIDI_UNMAPPED}, /* ? (Camelot, QFG1, Iceman) */
{0, 0, 0}
};
diff --git a/engines/sci/sound/drivers/midi.cpp b/engines/sci/sound/drivers/midi.cpp
index 1ef0781906..dc229262c7 100644
--- a/engines/sci/sound/drivers/midi.cpp
+++ b/engines/sci/sound/drivers/midi.cpp
@@ -97,7 +97,7 @@ private:
};
bool _isMt32;
- bool _isOldPatchFormat;
+ bool _useMT32Track;
bool _hasReverb;
bool _playSwitch;
int _masterVolume;
@@ -119,7 +119,7 @@ private:
byte _sysExBuf[kMaxSysExSize];
};
-MidiPlayer_Midi::MidiPlayer_Midi(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _isMt32(false), _hasReverb(false), _isOldPatchFormat(true) {
+MidiPlayer_Midi::MidiPlayer_Midi(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _isMt32(false), _hasReverb(false), _useMT32Track(true) {
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI);
_driver = createMidi(dev);
@@ -139,6 +139,10 @@ MidiPlayer_Midi::~MidiPlayer_Midi() {
void MidiPlayer_Midi::noteOn(int channel, int note, int velocity) {
uint8 patch = _channels[channel].mappedPatch;
+ assert(channel <= 15);
+ assert(note <= 127);
+ assert(velocity <= 127);
+
if (channel == MIDI_RHYTHM_CHANNEL) {
if (_percussionMap[note] == MIDI_UNMAPPED) {
debugC(kDebugLevelSound, "[Midi] Percussion instrument %i is unmapped", note);
@@ -175,6 +179,7 @@ void MidiPlayer_Midi::noteOn(int channel, int note, int velocity) {
// We assume that velocity 0 maps to 0 (for note off)
int mapIndex = _channels[channel].velocityMapIdx;
+ assert(velocity <= 127);
velocity = _velocityMap[mapIndex][velocity];
}
@@ -183,6 +188,8 @@ void MidiPlayer_Midi::noteOn(int channel, int note, int velocity) {
}
void MidiPlayer_Midi::controlChange(int channel, int control, int value) {
+ assert(channel <= 15);
+
switch (control) {
case 0x07:
_channels[channel].volume = value;
@@ -232,6 +239,8 @@ void MidiPlayer_Midi::controlChange(int channel, int control, int value) {
void MidiPlayer_Midi::setPatch(int channel, int patch) {
bool resetVol = false;
+ assert(channel <= 15);
+
if ((channel == MIDI_RHYTHM_CHANNEL) || (_channels[channel].patch == patch))
return;
@@ -772,6 +781,9 @@ int MidiPlayer_Midi::open(ResourceManager *resMan) {
_percussionMap[i] = i;
_patchMap[i] = i;
_velocityMap[0][i] = i;
+ _velocityMap[1][i] = i;
+ _velocityMap[2][i] = i;
+ _velocityMap[3][i] = i;
_keyShift[i] = 0;
_volAdjust[i] = 0;
_velocityMapIdx[i] = 0;
@@ -808,17 +820,35 @@ int MidiPlayer_Midi::open(ResourceManager *resMan) {
// Detect the format of patch 1, so that we know what play mask to use
res = resMan->findResource(ResourceId(kResourceTypePatch, 1), 0);
if (!res)
- _isOldPatchFormat = false;
+ _useMT32Track = false;
else
- _isOldPatchFormat = !isMt32GmPatch(res->data, res->size);
+ _useMT32Track = !isMt32GmPatch(res->data, res->size);
+
+ // Check if the songs themselves have a GM track
+ if (!_useMT32Track) {
+ if (!resMan->isGMTrackIncluded())
+ _useMT32Track = true;
+ }
} else {
// No GM patch found, map instruments using MT-32 patch
warning("Game has no native support for General MIDI, applying auto-mapping");
+ // TODO: The MT-32 <-> GM mapping hasn't been worked on for SCI1 games. Throw
+ // a warning to the user
+ if (getSciVersion() >= SCI_VERSION_1_EGA)
+ warning("The automatic mapping for General MIDI hasn't been worked on for "
+ "SCI1 games. Music might sound wrong or broken. Please choose another "
+ "music driver for this game (e.g. Adlib or MT-32) if you are "
+ "experiencing issues with music");
+
// Modify velocity map to make low velocity notes a little louder
- for (uint i = 1; i < 0x40; i++)
+ for (uint i = 1; i < 0x40; i++) {
_velocityMap[0][i] = 0x20 + (i - 1) / 2;
+ _velocityMap[1][i] = 0x20 + (i - 1) / 2;
+ _velocityMap[2][i] = 0x20 + (i - 1) / 2;
+ _velocityMap[3][i] = 0x20 + (i - 1) / 2;
+ }
res = resMan->findResource(ResourceId(kResourceTypePatch, 1), 0);
@@ -881,7 +911,7 @@ byte MidiPlayer_Midi::getPlayId() {
if (_isMt32)
return 0x0c;
else
- return _isOldPatchFormat ? 0x0c : 0x07;
+ return _useMT32Track ? 0x0c : 0x07;
}
}
diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp
index 6ec28a8b02..d53f919f8f 100644
--- a/engines/sci/sound/midiparser_sci.cpp
+++ b/engines/sci/sound/midiparser_sci.cpp
@@ -53,6 +53,7 @@ MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion, SciMusic *music) :
_ppqn = 1;
setTempo(16667);
+ _masterVolume = 15;
_volume = 127;
_signalSet = false;
@@ -418,7 +419,7 @@ void MidiParser_SCI::sendToDriver(uint32 midi) {
int channelVolume = (midi >> 16) & 0xFF;
// Remember, if we need to set it ourselves
_channelVolume[midiChannel] = channelVolume;
- // Adjust volume accordingly to current "global" volume
+ // Adjust volume accordingly to current local volume
channelVolume = channelVolume * _volume / 127;
midi = (midi & 0xFFF0) | ((channelVolume & 0xFF) << 16);
}
@@ -445,7 +446,8 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) {
}
if (_signalSet) {
_signalSet = false;
- _pSnd->signal = _signalToSet;
+ _pSnd->setSignal(_signalToSet);
+
debugC(4, kDebugLevelSound, "signal %04x", _signalToSet);
}
@@ -608,7 +610,7 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) {
jumpToTick(_loopTick);
} else {
_pSnd->status = kSoundStopped;
- _pSnd->signal = SIGNAL_OFFSET;
+ _pSnd->setSignal(SIGNAL_OFFSET);
debugC(4, kDebugLevelSound, "signal EOT");
}
@@ -658,6 +660,28 @@ void MidiParser_SCI::allNotesOff() {
memset(_active_notes, 0, sizeof(_active_notes));
}
+void MidiParser_SCI::setMasterVolume(byte masterVolume) {
+ assert(masterVolume <= MUSIC_MASTERVOLUME_MAX);
+ _masterVolume = masterVolume;
+ switch (_soundVersion) {
+ case SCI_VERSION_0_EARLY:
+ case SCI_VERSION_0_LATE:
+ // update driver master volume
+ setVolume(_volume);
+ break;
+
+ case SCI_VERSION_1_EARLY:
+ case SCI_VERSION_1_LATE:
+ case SCI_VERSION_2_1:
+ // directly set master volume (global volume is merged with channel volumes)
+ ((MidiPlayer *)_driver)->setVolume(masterVolume);
+ break;
+
+ default:
+ error("MidiParser_SCI::setVolume: Unsupported soundVersion");
+ }
+}
+
void MidiParser_SCI::setVolume(byte volume) {
assert(volume <= MUSIC_VOLUME_MAX);
_volume = volume;
@@ -666,8 +690,7 @@ void MidiParser_SCI::setVolume(byte volume) {
case SCI_VERSION_0_EARLY:
case SCI_VERSION_0_LATE: {
// SCI0 adlib driver doesn't support channel volumes, so we need to go this way
- // TODO: this should take the actual master volume into account
- int16 globalVolume = _volume * 15 / 127;
+ int16 globalVolume = _volume * _masterVolume / MUSIC_VOLUME_MAX;
((MidiPlayer *)_driver)->setVolume(globalVolume);
break;
}
diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h
index 90db06e539..9d0cb15e74 100644
--- a/engines/sci/sound/midiparser_sci.h
+++ b/engines/sci/sound/midiparser_sci.h
@@ -65,6 +65,7 @@ public:
}
void sendInitCommands();
void unloadMusic();
+ void setMasterVolume(byte masterVolume);
void setVolume(byte volume);
void stop() {
_abort_parse = true;
@@ -104,7 +105,8 @@ protected:
SoundResource::Track *_track;
MusicEntry *_pSnd;
uint32 _loopTick;
- byte _volume;
+ byte _masterVolume; // the overall master volume (same for all tracks)
+ byte _volume; // the global volume of the current track
bool _signalSet;
int16 _signalToSet;
diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp
index 061f380ebc..fe1d4fdbbb 100644
--- a/engines/sci/sound/music.cpp
+++ b/engines/sci/sound/music.cpp
@@ -30,6 +30,7 @@
#include "sci/sci.h"
#include "sci/console.h"
#include "sci/resource.h"
+#include "sci/engine/features.h"
#include "sci/engine/kernel.h"
#include "sci/engine/state.h"
#include "sci/sound/midiparser_sci.h"
@@ -66,8 +67,9 @@ void SciMusic::init() {
// Default to MIDI in SCI2.1+ games, as many don't have AdLib support.
Common::Platform platform = g_sci->getPlatform();
uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2_1) ? (MDT_PCSPK | MDT_PCJR | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM) : (MDT_PCSPK | MDT_PCJR | MDT_ADLIB | MDT_MIDI));
+ _musicType = MidiDriver::getMusicType(dev);
- switch (MidiDriver::getMusicType(dev)) {
+ switch (_musicType) {
case MT_ADLIB:
// FIXME: There's no Amiga sound option, so we hook it up to AdLib
if (g_sci->getPlatform() == Common::kPlatformAmiga || platform == Common::kPlatformMacintosh)
@@ -82,7 +84,7 @@ void SciMusic::init() {
_pMidiDrv = MidiPlayer_PCSpeaker_create(_soundVersion);
break;
default:
- if (ConfMan.getBool("enable_fb01"))
+ if (ConfMan.getBool("native_fb01"))
_pMidiDrv = MidiPlayer_Fb01_create(_soundVersion);
else
_pMidiDrv = MidiPlayer_Midi_create(_soundVersion);
@@ -260,6 +262,7 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {
pSnd->pMidiParser = new MidiParser_SCI(_soundVersion, this);
pSnd->pMidiParser->setMidiDriver(_pMidiDrv);
pSnd->pMidiParser->setTimerRate(_dwTempo);
+ pSnd->pMidiParser->setMasterVolume(_masterVolume);
}
pSnd->pauseCounter = 0;
@@ -465,6 +468,17 @@ void SciMusic::soundKill(MusicEntry *pSnd) {
}
void SciMusic::soundPause(MusicEntry *pSnd) {
+ // SCI seems not to be pausing samples played back by kDoSound at all
+ // It only stops looping samples (actually doesn't loop them again before they are unpaused)
+ // Examples: Space Quest 1 death by acid drops (pause is called even specifically for the sample, see bug #3038048)
+ // Eco Quest 1 during the intro when going to the abort-menu
+ // In both cases sierra sci keeps playing
+ // Leisure Suit Larry 1 doll scene - it seems that pausing here actually just stops
+ // further looping from happening
+ // This is a somewhat bigger change, I'm leaving in the old code in here just in case
+ // I'm currently pausing looped sounds directly, non-looped sounds won't get paused
+ if ((pSnd->pStreamAud) && (!pSnd->pLoopStream))
+ return;
pSnd->pauseCounter++;
if (pSnd->status != kSoundPlaying)
return;
@@ -514,8 +528,11 @@ void SciMusic::soundSetMasterVolume(uint16 vol) {
Common::StackLock lock(_mutex);
- if (_pMidiDrv)
- _pMidiDrv->setVolume(vol);
+ const MusicList::iterator end = _playList.end();
+ for (MusicList::iterator i = _playList.begin(); i != end; ++i) {
+ if ((*i)->pMidiParser)
+ (*i)->pMidiParser->setMasterVolume(vol);
+ }
}
void SciMusic::sendMidiCommand(uint32 cmd) {
@@ -627,6 +644,14 @@ MusicEntry::~MusicEntry() {
}
void MusicEntry::onTimer() {
+ if (!signal) {
+ if (!signalQueue.empty()) {
+ // no signal set, but signal in queue, set that one
+ signal = signalQueue[0];
+ signalQueue.remove_at(0);
+ }
+ }
+
if (status != kSoundPlaying)
return;
@@ -662,4 +687,23 @@ void MusicEntry::doFade() {
}
}
+void MusicEntry::setSignal(int newSignal) {
+ // For SCI0, we cache the signals to set, as some songs might
+ // update their signal faster than kGetEvent is called (which is where
+ // we manually invoke kDoSoundUpdateCues for SCI0 games). SCI01 and
+ // newer handle signalling inside kDoSoundUpdateCues. Refer to bug #3042981
+ if (g_sci->_features->detectDoSoundType() <= SCI_VERSION_0_LATE) {
+ if (!signal) {
+ signal = newSignal;
+ } else {
+ // signal already set and waiting for getting to scripts, queue new one
+ signalQueue.push_back(newSignal);
+ }
+ } else {
+ // Set the signal directly for newer games, otherwise the sound
+ // object might be deleted already later on (refer to bug #3045913)
+ signal = newSignal;
+ }
+}
+
} // End of namespace Sci
diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h
index 37e3c30030..b10f64aa18 100644
--- a/engines/sci/sound/music.h
+++ b/engines/sci/sound/music.h
@@ -47,10 +47,14 @@ enum SoundStatus {
#define MUSIC_VOLUME_DEFAULT 127
#define MUSIC_VOLUME_MAX 127
+#define MUSIC_MASTERVOLUME_DEFAULT 15
+#define MUSIC_MASTERVOLUME_MAX 15
class MidiParser_SCI;
class SegManager;
+typedef Common::Array<uint16> SignalQueue;
+
class MusicEntry : public Common::Serializable {
public:
// Do not get these directly for the sound objects!
@@ -90,6 +94,11 @@ public:
MidiParser_SCI *pMidiParser;
+ // this is used for storing signals, when the current signal is not yet
+ // sent to the scripts. We shouldn't need to save it, this normally only
+ // happens in rare situations like lb1, knocking on the door in the attic
+ SignalQueue signalQueue;
+
// TODO: We need to revise how we store the different
// audio stream objects we require.
Audio::RewindableAudioStream *pStreamAud;
@@ -102,6 +111,7 @@ public:
void doFade();
void onTimer();
+ void setSignal(int signal);
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
@@ -145,6 +155,7 @@ public:
void soundSetSoundOn(bool soundOnFlag);
uint16 soundGetVoices();
uint32 soundGetTempo() const { return _dwTempo; }
+ MusicType soundGetMusicType() const { return _musicType; }
bool soundIsActive(MusicEntry *pSnd) {
assert(pSnd->pStreamAud != 0);
@@ -208,6 +219,7 @@ private:
MusicEntry *_usedChannel[16];
MidiCommandQueue _queuedCommands;
+ MusicType _musicType;
int _driverFirstChannel;
};
diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp
index 567a1605f3..84aedc8515 100644
--- a/engines/sci/sound/soundcmd.cpp
+++ b/engines/sci/sound/soundcmd.cpp
@@ -284,8 +284,8 @@ reg_t SoundCommandParser::kDoSoundMasterVolume(int argc, reg_t *argv, reg_t acc)
if (argc > 0) {
debugC(2, kDebugLevelSound, "kDoSound(masterVolume): %d", argv[0].toSint16());
- int vol = CLIP<int16>(argv[0].toSint16(), 0, kMaxSciVolume);
- vol = vol * Audio::Mixer::kMaxMixerVolume / kMaxSciVolume;
+ int vol = CLIP<int16>(argv[0].toSint16(), 0, MUSIC_MASTERVOLUME_MAX);
+ vol = vol * Audio::Mixer::kMaxMixerVolume / MUSIC_MASTERVOLUME_MAX;
ConfMan.setInt("music_volume", vol);
ConfMan.setInt("sfx_volume", vol);
g_engine->syncSoundSettings();
@@ -298,7 +298,7 @@ reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) {
MusicEntry *musicSlot = _music->getSlot(obj);
if (!musicSlot) {
- warning("kDoSound(fade): Slot not found (%04x:%04x)", PRINT_REG(obj));
+ debugC(2, kDebugLevelSound, "kDoSound(fade): Slot not found (%04x:%04x)", PRINT_REG(obj));
return acc;
}
@@ -688,6 +688,7 @@ void SoundCommandParser::startNewSound(int number) {
}
void SoundCommandParser::setMasterVolume(int vol) {
+ // 0...15
_music->soundSetMasterVolume(vol);
}
@@ -695,4 +696,9 @@ void SoundCommandParser::pauseAll(bool pause) {
_music->pauseAll(pause);
}
+MusicType SoundCommandParser::getMusicType() const {
+ assert(_music);
+ return _music->soundGetMusicType();
+}
+
} // End of namespace Sci
diff --git a/engines/sci/sound/soundcmd.h b/engines/sci/sound/soundcmd.h
index 8e6fb81762..61371d903f 100644
--- a/engines/sci/sound/soundcmd.h
+++ b/engines/sci/sound/soundcmd.h
@@ -27,6 +27,7 @@
#define SCI_SOUNDCMD_H
#include "common/list.h"
+#include "sound/mididrv.h" // for MusicType
#include "sci/engine/state.h"
namespace Sci {
@@ -47,10 +48,6 @@ public:
SoundCommandParser(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, AudioPlayer *audio, SciVersion soundVersion);
~SoundCommandParser();
- enum {
- kMaxSciVolume = 15
- };
-
//reg_t parseCommand(int argc, reg_t *argv, reg_t acc);
// Functions used for game state loading
@@ -71,6 +68,8 @@ public:
void processPlaySound(reg_t obj);
void processStopSound(reg_t obj, bool sampleFinishedPlaying);
+ MusicType getMusicType() const;
+
/**
* Synchronizes the current state of the music list to the rest of the engine, so that
* the changes that the sound thread makes to the music are registered with the engine
diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp
index 9721c75677..9010cb84c3 100644
--- a/engines/scumm/detection.cpp
+++ b/engines/scumm/detection.cpp
@@ -401,8 +401,8 @@ static void composeFileHashMap(const Common::FSList &fslist, DescMap &fileMD5Map
continue;
bool matched = false;
- for (const char *glob = *globs; *glob; glob++)
- if (file->getName().matchString(glob, true)) {
+ for (const char **glob = globs; *glob; glob++)
+ if (file->getName().matchString(*glob, true)) {
matched = true;
break;
}
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index d8987c816f..98fab9468a 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -186,6 +186,7 @@ using Common::GUIO_NONE;
using Common::GUIO_NOLAUNCHLOAD;
using Common::GUIO_NOMIDI;
using Common::GUIO_NOSPEECH;
+using Common::GUIO_MIDITOWNS;
// The following table contains information about variants of our various
// games. We index into it with help of md5table (from scumm-md5.h), to find
@@ -207,39 +208,39 @@ using Common::GUIO_NOSPEECH;
// only a single unique variant. This is used to help the detector quickly
// decide whether it has to worry about distinguishing multiple variants or not.
static const GameSettings gameVariantsTable[] = {
- {"maniac", "Apple II", 0, GID_MANIAC, 0, 0, MDT_PCSPK, 0, Common::kPlatformApple2GS, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"maniac", "C64", 0, GID_MANIAC, 0, 0, MDT_PCSPK, 0, Common::kPlatformC64, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"maniac", "V1", "v1", GID_MANIAC, 1, 0, MDT_PCSPK, 0, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"maniac", "V1 Demo", "v1", GID_MANIAC, 1, 0, MDT_PCSPK, GF_DEMO, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"maniac", "Apple II", 0, GID_MANIAC, 0, 0, MDT_APPLEIIGS, 0, Common::kPlatformApple2GS, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"maniac", "C64", 0, GID_MANIAC, 0, 0, MDT_C64, 0, Common::kPlatformC64, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"maniac", "V1", "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, 0, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"maniac", "V1 Demo", "v1", GID_MANIAC, 1, 0, MDT_PCSPK | MDT_PCJR, GF_DEMO, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
{"maniac", "NES", 0, GID_MANIAC, 1, 0, MDT_NONE, 0, Common::kPlatformNES, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"maniac", "V2", "v2", GID_MANIAC, 2, 0, MDT_PCSPK, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"maniac", "V2 Demo", "v2", GID_MANIAC, 2, 0, MDT_PCSPK, GF_DEMO, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"maniac", "V2", "v2", GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"maniac", "V2 Demo", "v2", GID_MANIAC, 2, 0, MDT_PCSPK | MDT_PCJR, GF_DEMO, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"zak", "V1", "v1", GID_ZAK, 1, 0, MDT_PCSPK, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"zak", "V2", "v2", GID_ZAK, 2, 0, MDT_PCSPK, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"zak", "FM-TOWNS", 0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"zak", "V1", "v1", GID_ZAK, 1, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"zak", "V2", "v2", GID_ZAK, 2, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"zak", "FM-TOWNS", 0, GID_ZAK, 3, 0, MDT_TOWNS, GF_OLD256 | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI | GUIO_MIDITOWNS},
- {"indy3", "EGA", "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"indy3", "No AdLib", "ega", GID_INDY3, 3, 0, MDT_PCSPK, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"indy3", "VGA", "vga", GID_INDY3, 3, 0, MDT_PCSPK | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"indy3", "FM-TOWNS", 0, GID_INDY3, 3, 0, MDT_TOWNS, GF_OLD256 | GF_FEW_LOCALS | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"indy3", "EGA", "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"indy3", "No AdLib", "ega", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"indy3", "VGA", "vga", GID_INDY3, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"indy3", "FM-TOWNS", 0, GID_INDY3, 3, 0, MDT_TOWNS, GF_OLD256 | GF_FEW_LOCALS | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI | GUIO_MIDITOWNS},
- {"loom", "EGA", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH},
- {"loom", "No AdLib", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_CMS, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"loom", "EGA", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH},
+ {"loom", "No AdLib", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
#ifdef USE_RGB_COLOR
{"loom", "PC-Engine", 0, GID_LOOM, 3, 0, MDT_NONE, GF_AUDIOTRACKS | GF_OLD256 | GF_16BIT_COLOR, Common::kPlatformPCEngine, GUIO_NOSPEECH | GUIO_NOMIDI},
#endif
- {"loom", "FM-TOWNS", 0, GID_LOOM, 3, 0, MDT_TOWNS, GF_AUDIOTRACKS | GF_OLD256, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"loom", "FM-TOWNS", 0, GID_LOOM, 3, 0, MDT_TOWNS, GF_AUDIOTRACKS | GF_OLD256, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI | GUIO_MIDITOWNS},
{"loom", "VGA", "vga", GID_LOOM, 4, 0, MDT_NONE, GF_AUDIOTRACKS, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"pass", 0, 0, GID_PASS, 4, 0, MDT_PCSPK | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"pass", 0, 0, GID_PASS, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"monkey", "VGA", "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH},
- {"monkey", "EGA", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH},
- {"monkey", "No AdLib", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK, GF_16COLOR, Common::kPlatformAtariST, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"monkey", "Demo", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"monkey", "VGA", "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH},
+ {"monkey", "EGA", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH},
+ {"monkey", "No AdLib", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR, GF_16COLOR, Common::kPlatformAtariST, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"monkey", "Demo", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_PCJR | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI},
{"monkey", "CD", 0, GID_MONKEY, 5, 0, MDT_ADLIB, GF_AUDIOTRACKS, UNK, GUIO_NOSPEECH | GUIO_NOMIDI},
- {"monkey", "FM-TOWNS", 0, GID_MONKEY, 5, 0, MDT_ADLIB, GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI},
+ {"monkey", "FM-TOWNS", 0, GID_MONKEY, 5, 0, MDT_TOWNS, GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI | GUIO_MIDITOWNS},
{"monkey", "SEGA", 0, GID_MONKEY, 5, 0, MDT_NONE, GF_AUDIOTRACKS, Common::kPlatformSegaCD, GUIO_NOSPEECH | GUIO_NOMIDI},
{"monkey2", 0, 0, GID_MONKEY2, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH},
diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp
index 7b0d4909d6..3b8d9c296a 100644
--- a/engines/scumm/gfx.cpp
+++ b/engines/scumm/gfx.cpp
@@ -1794,18 +1794,16 @@ bool Gdi::drawStrip(byte *dstPtr, VirtScreen *vs, int x, int y, const int width,
if (stripnr * 2 + 2 < smapLen) {
offset = READ_LE_UINT16(smap_ptr + stripnr * 2 + 2);
}
- assertRange(0, offset, smapLen-1, "screen strip");
} else if (_vm->_game.features & GF_SMALL_HEADER) {
smapLen = READ_LE_UINT32(smap_ptr);
if (stripnr * 4 + 4 < smapLen)
offset = READ_LE_UINT32(smap_ptr + stripnr * 4 + 4);
- assertRange(0, offset, smapLen-1, "screen strip");
} else {
smapLen = READ_BE_UINT32(smap_ptr);
if (stripnr * 4 + 8 < smapLen)
offset = READ_LE_UINT32(smap_ptr + stripnr * 4 + 8);
- assertRange(0, offset, smapLen-1, "screen strip");
}
+ assertRange(0, offset, smapLen-1, "screen strip");
return decompressBitmap(dstPtr, vs->pitch, smap_ptr + offset, height);
}
@@ -1902,7 +1900,7 @@ void Gdi::decodeMask(int x, int y, const int width, const int height,
z_plane_ptr = zplane_list[i] + offs;
if (tmsk_ptr) {
- const byte *tmsk = tmsk_ptr + READ_LE_UINT16(tmsk_ptr + 8);
+ const byte *tmsk = tmsk_ptr + READ_LE_UINT16(tmsk_ptr + stripnr * 2 + 8);
decompressTMSK(mask_ptr, tmsk, z_plane_ptr, height);
} else if (transpStrip && (flag & dbAllowMaskOr)) {
decompressMaskImgOr(mask_ptr, z_plane_ptr, height);
diff --git a/engines/scumm/help.cpp b/engines/scumm/help.cpp
index d9bdf51d19..e15c4a5592 100644
--- a/engines/scumm/help.cpp
+++ b/engines/scumm/help.cpp
@@ -254,7 +254,7 @@ void ScummHelp::updateStrings(byte gameId, byte version, Common::Platform platfo
case 4:
title = "Other game controls:";
if (version <= 2) {
- ADD_TEXT("Inventory: (not yet implemented)");
+ ADD_TEXT("Inventory:");
ADD_BIND("u", "Scroll list up");
ADD_BIND("j", "Scroll list down");
ADD_BIND("i", "Upper left item");
diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp
index 73aec472e4..6b38f80df1 100644
--- a/engines/scumm/imuse/imuse_player.cpp
+++ b/engines/scumm/imuse/imuse_player.cpp
@@ -47,7 +47,6 @@ namespace Scumm {
#define PERCUSSION_CHANNEL 9
extern MidiParser *MidiParser_createRO();
-extern MidiParser *MidiParser_createEUP();
uint16 Player::_active_notes[128];
@@ -195,7 +194,11 @@ int Player::start_seq_sound(int sound, bool reset_vars) {
_parser = MidiParser_createRO();
} else if (!memcmp(ptr, "SO", 2)) {
// Euphony (FM-TOWNS) resource
- _parser = MidiParser_createEUP();
+
+ //////////// REMOVE
+ //_parser = MidiParser_createEUP();
+ ///////////
+
} else if (!memcmp(ptr, "FORM", 4)) {
// Humongous Games XMIDI resource
_parser = MidiParser::createParser_XMIDI();
diff --git a/engines/scumm/midiparser_eup.cpp b/engines/scumm/midiparser_eup.cpp
deleted file mode 100644
index 592d43f7fe..0000000000
--- a/engines/scumm/midiparser_eup.cpp
+++ /dev/null
@@ -1,222 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-
-#include "sound/midiparser.h"
-#include "sound/mididrv.h"
-#include "common/util.h"
-
-namespace Scumm {
-
-/**
- * The FM-TOWNS Euphony version of MidiParser.
- */
-class MidiParser_EUP : public MidiParser {
-protected:
- byte _instruments[6][50]; // Two extra bytes for SysEx ID and channel #
- byte *_instr_to_channel;
- struct {
- byte *enable;
- int8 *channel;
- int8 *volume;
- int8 *transpose;
- } _presets;
- bool _loop;
- byte _presend; // Tracks which startup implied events have been sent.
- uint32 _base_tick; // Events times are relative to this base.
-
-protected:
- void parseNextEvent (EventInfo &info);
- void resetTracking();
-
-public:
- bool loadMusic (byte *data, uint32 size);
-};
-
-
-
-//////////////////////////////////////////////////
-//
-// MidiParser_EUP implementation
-//
-//////////////////////////////////////////////////
-
-void MidiParser_EUP::parseNextEvent (EventInfo &info) {
- byte *pos = _position._play_pos;
-
- // FIXME: The presend is for sending init events
- // that aren't actually in the stream. This would
- // be for, e.g., instrument setup. Right now, we
- // don't actually use the instruments specified
- // in the music header. We're sending fixed GM
- // program changes to get a reasonable "one-size-
- // fits-all" sound until we actually support the
- // FM synthesis capabilities of FM-TOWNS.
- for (; _presend < 12; ++_presend) {
- if (_instr_to_channel[_presend >> 1] >= 16)
- continue;
- info.start = pos;
- info.delta = 0;
- if (_presend & 1) {
- byte *data = &_instruments[_presend >> 1][0];
- data[1] = _instr_to_channel[_presend >> 1];
- info.event = 0xF0;
- info.ext.data = data;
- info.length = 48;
- } else {
- info.event = 0xB0 | (_presend >> 1);
- info.basic.param1 = 121;
- info.basic.param2 = 0;
- }
- ++_presend;
- return;
- }
-
- while (true) {
- byte cmd = *pos;
- if ((cmd & 0xF0) == 0x90) {
- byte preset = pos[1];
- byte channel = _presets.channel[preset];
- if (channel >= 16)
- channel = cmd & 0x0F;
- uint16 tick = (pos[2] | ((uint16) pos[3] << 7)) + _base_tick;
- int note = (int) pos[4] + _presets.transpose[preset];
- int volume = (int) pos[5];
- // HACK: Loom-Towns distaff tracks seem to
- // contain zero-volume note events, so change
- // those to full volume.
- if (!volume)
- volume = 127;
- volume += _presets.volume[preset];
- if (volume > 127)
- volume = 127;
- else if (volume < 0)
- volume = 0;
- pos += 6;
- if (_presets.enable[preset]) {
- uint16 duration = pos[1] | (pos[2] << 4);
- info.start = pos;
- uint32 last = _position._last_event_tick;
- info.delta = (tick < last) ? 0 : (tick - last);
- info.event = 0x90 | channel;
- info.length = duration;
- info.basic.param1 = note;
- info.basic.param2 = volume;
- pos += 6;
- break;
- }
- pos += 6;
- } else if (cmd == 0xF2) {
- // This is a "measure marker" of sorts.
- // It advances the "base time", to which
- // all event times are relative.
- _base_tick += (pos[3] << 7) | pos[2];
- pos += 6;
- } else if (cmd == 0xF8) {
- // TODO: Implement this.
- pos += 6;
- } else if (cmd == 0xFD || cmd == 0xFE) {
- // End of track.
- if (_loop && false) {
- // TODO: Implement this.
- } else {
- info.start = pos;
- uint32 last = _position._last_event_tick;
- info.delta = (_base_tick < last) ? 0 : (_base_tick - last);
- info.event = 0xFF;
- info.length = 0;
- info.ext.type = 0x2F;
- info.ext.data = pos;
- break;
- }
- } else {
- error("Unknown Euphony music event 0x%02X", (int) cmd);
- memset(&info, 0, sizeof(info));
- pos = 0;
- break;
- }
- }
- _position._play_pos = pos;
-}
-
-bool MidiParser_EUP::loadMusic (byte *data, uint32 size) {
- unloadMusic();
- byte *pos = data;
- int i;
-
- if (memcmp(pos, "SO", 2)) {
- error("'SO' header expected but found '%c%c' instead.", pos[0], pos[1]);
- return false;
- }
-
- byte numInstruments = pos[16];
- pos += 16 + 2;
- for (i = 0; i < numInstruments; ++i) {
- _instruments[i][0] = 0x7C;
- memcpy (&_instruments[i][2], pos, 48);
- pos += 48;
- }
-
- // Load the prest pointers
- _presets.enable = pos;
- pos += 32;
- _presets.channel = (int8 *) pos;
- pos += 32;
- _presets.volume = (int8 *) pos;
- pos += 32;
- _presets.transpose = (int8 *) pos;
- pos += 32;
-
- pos += 8; // Unknown bytes
- _instr_to_channel = pos; // Instrument-to-channel mapping
- pos += 6;
- pos += 4; // Skip the music size for now.
- pos++; // Unknown byte
- byte tempo = *pos++;
- _loop = (*pos++ != 1);
- pos++; // Unknown byte
-
- _num_tracks = 1;
- _ppqn = 120;
- _tracks[0] = pos;
-
- // Note that we assume the original data passed in
- // will persist beyond this call, i.e. we do NOT
- // copy the data to our own buffer. Take warning....
- resetTracking();
- setTempo (1000000 * 60 / tempo);
- setTrack (0);
- return true;
-}
-
-void MidiParser_EUP::resetTracking() {
- MidiParser::resetTracking();
- _presend = 0;
- _base_tick = 0;
-}
-
-MidiParser *MidiParser_createEUP() { return new MidiParser_EUP; }
-
-} // End of namespace Scumm
diff --git a/engines/scumm/module.mk b/engines/scumm/module.mk
index e5f0745dd6..14d1f5fdd4 100644
--- a/engines/scumm/module.mk
+++ b/engines/scumm/module.mk
@@ -29,7 +29,6 @@ MODULE_OBJS := \
imuse/sysex_samnmax.o \
imuse/sysex_scumm.o \
input.o \
- midiparser_eup.o \
midiparser_ro.o \
object.o \
palette.o \
@@ -37,6 +36,7 @@ MODULE_OBJS := \
player_nes.o \
player_pce.o \
player_sid.o \
+ player_towns.o \
player_v1.o \
player_v2.o \
player_v2a.o \
diff --git a/engines/scumm/palette.cpp b/engines/scumm/palette.cpp
index 09da1b47c4..7659e5fe1a 100644
--- a/engines/scumm/palette.cpp
+++ b/engines/scumm/palette.cpp
@@ -56,11 +56,17 @@ uint16 ScummEngine::get16BitColor(uint8 r, uint8 g, uint8 b) {
void ScummEngine::resetPalette() {
static const byte tableC64Palette[] = {
+#if 1 // VICE-based palette. See bug #2847001
+ 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x7E, 0x35, 0x2B, 0x6E, 0xB7, 0xC1,
+ 0x7F, 0x3B, 0xA6, 0x5C, 0xA0, 0x35, 0x33, 0x27, 0x99, 0xCB, 0xD7, 0x65,
+ 0x85, 0x53, 0x1C, 0x50, 0x3C, 0x00, 0xB4, 0x6B, 0x61, 0x4A, 0x4A, 0x4A,
+ 0x75, 0x75, 0x75, 0xA3, 0xE7, 0x7C, 0x70, 0x64, 0xD6, 0xA3, 0xA3, 0xA3,
+#else
0x00, 0x00, 0x00, 0xFD, 0xFE, 0xFC, 0xBE, 0x1A, 0x24, 0x30, 0xE6, 0xC6,
0xB4, 0x1A, 0xE2, 0x1F, 0xD2, 0x1E, 0x21, 0x1B, 0xAE, 0xDF, 0xF6, 0x0A,
0xB8, 0x41, 0x04, 0x6A, 0x33, 0x04, 0xFE, 0x4A, 0x57, 0x42, 0x45, 0x40,
0x70, 0x74, 0x6F, 0x59, 0xFE, 0x59, 0x5F, 0x53, 0xFE, 0xA4, 0xA7, 0xA2,
-
+#endif
// Use 17 color table for v1 games to allow correct color for inventory and
// sentence line. Original games used some kind of dynamic color table
// remapping between rooms.
diff --git a/engines/scumm/player_sid.cpp b/engines/scumm/player_sid.cpp
index 3f7b65cbb4..35671e094b 100644
--- a/engines/scumm/player_sid.cpp
+++ b/engines/scumm/player_sid.cpp
@@ -92,8 +92,8 @@ static const uint16 FREQ_TBL[97] = {
static const int SONG_CHANNEL_OFFSET[3] = { 6, 8, 10 };
static const int RES_ID_CHANNEL[3] = { 3, 4, 5 };
-#define LOBYTE(a) ((a) & 0xFF)
-#define HIBYTE(a) (((a) >> 8) & 0xFF)
+#define LOBYTE_(a) ((a) & 0xFF)
+#define HIBYTE_(a) (((a) >> 8) & 0xFF)
#define GETBIT(var, pos) ((var) & (1<<(pos)))
@@ -176,14 +176,14 @@ void Player_SID::handleMusicBuffer() { // $33cd
l_chanBuf[19] = phaseBit[channel];
l_chanBuf[10] |= 0x01; // attack phase
}
- l_chanBuf[11] = LOBYTE(l_freq);
- l_chanBuf[12] = HIBYTE(l_freq);
+ l_chanBuf[11] = LOBYTE_(l_freq);
+ l_chanBuf[12] = HIBYTE_(l_freq);
releasePhase[channel] = false;
}
// set counter value for frequency update (freqDeltaCounter)
- l_chanBuf[13] = LOBYTE(curStepSum);
- l_chanBuf[14] = HIBYTE(curStepSum);
+ l_chanBuf[13] = LOBYTE_(curStepSum);
+ l_chanBuf[14] = HIBYTE_(curStepSum);
_soundQueue[channel] = RES_ID_CHANNEL[channel];
processSongData(channel);
@@ -340,8 +340,8 @@ void Player_SID::processSongData(int channel) { // $4939
if (songFileOrChanBufData == NULL) { // chanBuf (4C1C)
/*
// TODO: do we need this?
- LOBYTE(vec20[channel]) = 0;
- LOBYTE(songPosPtr[channel]) = LOBYTE(songFileOrChanBufOffset[channel]);
+ LOBYTE_(vec20[channel]) = 0;
+ LOBYTE_(songPosPtr[channel]) = LOBYTE_(songFileOrChanBufOffset[channel]);
*/
releaseResourceUnk(channel);
return;
@@ -551,8 +551,8 @@ void Player_SID::setSIDFreqAS(int channel) { // $4be6
if (swapVarLoaded)
return;
int reg = SID_REG_OFFSET[channel];
- SID_Write(reg, LOBYTE(freqReg[channel])); // freq/pulseWidth voice 1/2/3
- SID_Write(reg+1, HIBYTE(freqReg[channel]));
+ SID_Write(reg, LOBYTE_(freqReg[channel])); // freq/pulseWidth voice 1/2/3
+ SID_Write(reg+1, HIBYTE_(freqReg[channel]));
if (channel < 3) {
SID_Write(reg+5, attackReg[channel]); // attack
SID_Write(reg+6, sustainReg[channel]); // sustain
@@ -839,8 +839,8 @@ void Player_SID::useSwapVars(int channel) { // $5342
SID_Write(24, SIDReg24);
// filter freq.
- SID_Write(21, LOBYTE(freqReg[3]));
- SID_Write(22, HIBYTE(freqReg[3]));
+ SID_Write(21, LOBYTE_(freqReg[3]));
+ SID_Write(22, HIBYTE_(freqReg[3]));
} else {
SIDReg23 = SIDReg23Stuff & BITMASK_INV[channel];
SID_Write(23, SIDReg23);
diff --git a/engines/scumm/player_towns.cpp b/engines/scumm/player_towns.cpp
new file mode 100644
index 0000000000..871bd67546
--- /dev/null
+++ b/engines/scumm/player_towns.cpp
@@ -0,0 +1,556 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+
+#include "scumm/sound.h"
+#include "scumm/player_towns.h"
+
+namespace Scumm {
+
+Player_Towns::Player_Towns(ScummEngine *vm, Audio::Mixer *mixer) : _vm(vm) {
+ _cdaCurrentSound = _eupCurrentSound = _cdaNumLoops = 0;
+ _cdaForceRestart = 0;
+ memset(_pcmCurrentSound, 0, sizeof(_pcmCurrentSound));
+ _cdaVolLeft = _cdaVolRight = 0;
+
+ _eupVolLeft = _eupVolRight = 0;
+ memset(&_ovrCur, 0, sizeof(SoundOvrParameters));
+ _soundOverride = 0;
+
+ if (_vm->_game.version == 3) {
+ _soundOverride = new SoundOvrParameters[200];
+ memset(_soundOverride, 0, 200 * sizeof(SoundOvrParameters));
+ }
+
+ _eupLooping = false;
+ _unkFlags = 0x33;
+
+ _driver = new TownsEuphonyDriver(mixer);
+}
+
+Player_Towns::~Player_Towns() {
+ delete[] _soundOverride;
+ delete _driver;
+}
+
+bool Player_Towns::init() {
+ if (!_driver)
+ return false;
+
+ if (!_driver->init())
+ return false;
+
+ _driver->reserveSoundEffectChannels(8);
+
+ // Treat all 6 fm channels and all 8 pcm channels as sound effect channels
+ // since music seems to exist as CD audio only in the games which use this
+ // MusicEngine implementation.
+ _driver->intf()->setSoundEffectChanMask(-1);
+
+ setVolumeCD(255, 255);
+
+ return true;
+}
+
+void Player_Towns::setMusicVolume(int vol) {
+ _driver->setMusicVolume(vol);
+}
+
+void Player_Towns::setSfxVolume(int vol) {
+ _driver->setSoundEffectVolume(vol);
+}
+
+void Player_Towns::startSound(int sound) {
+ uint8 *ptr = _vm->getResourceAddress(rtSound, sound);
+ if (_vm->_game.version != 3) {
+ ptr += 2;
+ } else if (_soundOverride && sound > 0 && sound < 200) {
+ memcpy(&_ovrCur, &_soundOverride[sound], sizeof(SoundOvrParameters));
+ memset(&_soundOverride[sound], 0, sizeof(SoundOvrParameters));
+ }
+
+ int type = ptr[13];
+
+ if (type == 0) {
+ playPcmTrack(sound, ptr + 6);
+ } else if (type == 1) {
+ playEuphonyTrack(sound, ptr + 6);
+ } else if (type == 2) {
+ playCdaTrack(sound, ptr + 6);
+ }
+ memset(&_ovrCur, 0, sizeof(SoundOvrParameters));
+}
+
+void Player_Towns::stopSound(int sound) {
+ if (sound == 0 || sound == _cdaCurrentSound) {
+ _cdaCurrentSound = 0;
+ _vm->_sound->stopCD();
+ _vm->_sound->stopCDTimer();
+ }
+
+ if (sound != 0 && sound == _eupCurrentSound) {
+ _eupCurrentSound = 0;
+ _eupLooping = false;
+ _driver->stopParser();
+ }
+
+ stopPcmTrack(sound);
+}
+
+void Player_Towns::stopAllSounds() {
+ _cdaCurrentSound = 0;
+ _vm->_sound->stopCD();
+ _vm->_sound->stopCDTimer();
+
+ _eupCurrentSound = 0;
+ _eupLooping = false;
+ _driver->stopParser();
+
+ stopPcmTrack(0);
+}
+
+int Player_Towns::getSoundStatus(int sound) const {
+ if (sound == _cdaCurrentSound)
+ return _vm->_sound->pollCD();
+ if (sound == _eupCurrentSound)
+ return _driver->parserIsPlaying() ? 1 : 0;
+ for (int i = 1; i < 9; i++) {
+ if (_pcmCurrentSound[i].index == sound)
+ return _driver->soundEffectIsPlaying(i + 0x3f) ? 1 : 0;
+ }
+ return 0;
+}
+
+int32 Player_Towns::doCommand(int numargs, int args[]) {
+ int32 res = 0;
+
+ switch (args[0]) {
+ case 2:
+ _driver->intf()->callback(73, 0);
+ break;
+
+ case 3:
+ restartLoopingSounds();
+ break;
+
+ case 8:
+ startSound(args[1]);
+ break;
+
+ case 9:
+ _vm->_sound->stopSound(args[1]);
+ break;
+
+ case 11:
+ stopPcmTrack(0);
+ break;
+
+ case 14:
+ startSoundEx(args[1], args[2], args[3], args[4]);
+ break;
+
+ case 15:
+ stopSoundSuspendLooping(args[1]);
+ break;
+
+ default:
+ warning("Player_Towns::doCommand: Unknown command %d", args[0]);
+ break;
+ }
+
+ return res;
+}
+
+void Player_Towns::setVolumeCD(int left, int right) {
+ _cdaVolLeft = left & 0xff;
+ _cdaVolRight = right & 0xff;
+ _driver->setOutputVolume(1, left >> 1, right >> 1);
+}
+
+void Player_Towns::setSoundVolume(int sound, int left, int right) {
+ if (_soundOverride && sound > 0 && sound < 200) {
+ _soundOverride[sound].vLeft = left;
+ _soundOverride[sound].vRight = right;
+ }
+}
+
+void Player_Towns::setSoundNote(int sound, int note) {
+ if (_soundOverride && sound > 0 && sound < 200)
+ _soundOverride[sound].note = note;
+}
+
+void Player_Towns::saveLoadWithSerializer(Serializer *ser) {
+ _cdaCurrentSoundTemp = (_vm->_sound->pollCD() && _cdaNumLoops > 1) ? _cdaCurrentSound & 0xff : 0;
+ _cdaNumLoopsTemp = _cdaNumLoops & 0xff;
+
+ static const SaveLoadEntry cdEntries[] = {
+ MKLINE(Player_Towns, _cdaCurrentSoundTemp, sleUint8, VER(81)),
+ MKLINE(Player_Towns, _cdaNumLoopsTemp, sleUint8, VER(81)),
+ MKLINE(Player_Towns, _cdaVolLeft, sleUint8, VER(81)),
+ MKLINE(Player_Towns, _cdaVolRight, sleUint8, VER(81)),
+ MKEND()
+ };
+
+ ser->saveLoadEntries(this, cdEntries);
+
+ if (!_eupLooping && !_driver->parserIsPlaying())
+ _eupCurrentSound = 0;
+
+ static const SaveLoadEntry eupEntries[] = {
+ MKLINE(Player_Towns, _eupCurrentSound, sleUint8, VER(81)),
+ MKLINE(Player_Towns, _eupLooping, sleUint8, VER(81)),
+ MKLINE(Player_Towns, _eupVolLeft, sleUint8, VER(81)),
+ MKLINE(Player_Towns, _eupVolRight, sleUint8, VER(81)),
+ MKEND()
+ };
+
+ ser->saveLoadEntries(this, eupEntries);
+
+ static const SaveLoadEntry pcmEntries[] = {
+ MKLINE(PcmCurrentSound, index, sleInt16, VER(81)),
+ MKLINE(PcmCurrentSound, chan, sleInt16, VER(81)),
+ MKLINE(PcmCurrentSound, note, sleUint8, VER(81)),
+ MKLINE(PcmCurrentSound, velo, sleUint8, VER(81)),
+ MKLINE(PcmCurrentSound, pan, sleUint8, VER(81)),
+ MKLINE(PcmCurrentSound, paused, sleUint8, VER(81)),
+ MKLINE(PcmCurrentSound, looping, sleUint8, VER(81)),
+ MKLINE(PcmCurrentSound, priority, sleUint32, VER(81)),
+ MKEND()
+ };
+
+ for (int i = 1; i < 9; i++) {
+ if (!_pcmCurrentSound[i].index)
+ continue;
+
+ if (_driver->soundEffectIsPlaying(i + 0x3f))
+ continue;
+
+ _driver->stopSoundEffect(i + 0x3f);
+
+ _pcmCurrentSound[i].index = 0;
+ }
+
+ ser->saveLoadArrayOf(_pcmCurrentSound, 9, sizeof(PcmCurrentSound), pcmEntries);
+}
+
+void Player_Towns::restoreAfterLoad() {
+ setVolumeCD(_cdaVolLeft, _cdaVolRight);
+
+ if (_cdaCurrentSoundTemp) {
+ uint8 *ptr = _vm->getResourceAddress(rtSound, _cdaCurrentSoundTemp) + 6;
+ if (_vm->_game.version != 3)
+ ptr += 2;
+
+ if (ptr[7] == 2) {
+ playCdaTrack(_cdaCurrentSoundTemp, ptr, true);
+ _cdaCurrentSound = _cdaCurrentSoundTemp;
+ _cdaNumLoops = _cdaNumLoopsTemp;
+ }
+ }
+
+ if (_eupCurrentSound) {
+ uint8 *ptr = _vm->getResourceAddress(rtSound, _eupCurrentSound) + 6;
+ if (_vm->_game.version != 3)
+ ptr += 2;
+
+ if (ptr[7] == 1) {
+ setSoundVolume(_eupCurrentSound, _eupVolLeft, _eupVolRight);
+ playEuphonyTrack(_eupCurrentSound, ptr);
+ }
+ }
+
+ for (int i = 1; i < 9; i++) {
+ if (!_pcmCurrentSound[i].index)
+ continue;
+
+ uint8 *ptr = _vm->getResourceAddress(rtSound, _pcmCurrentSound[i].index);
+ if (!ptr)
+ continue;
+
+ if (_vm->_game.version != 3)
+ ptr += 2;
+
+ if (ptr[13])
+ continue;
+
+ playPcmTrack(_pcmCurrentSound[i].index, ptr + 6, _pcmCurrentSound[i].velo, _pcmCurrentSound[i].pan, _pcmCurrentSound[i].note);
+ }
+}
+
+int Player_Towns::getNextFreePcmChannel(int sound, int sfxChanRelIndex) {
+ int chan = 0;
+ for (int i = 8; i; i--) {
+ if (!_pcmCurrentSound[i].index) {
+ chan = i;
+ continue;
+ }
+
+ if (_driver->soundEffectIsPlaying(i + 0x3f))
+ continue;
+
+ chan = i;
+ _vm->_sound->stopSound(_pcmCurrentSound[chan].index);
+ }
+
+ if (!chan) {
+ uint16 l = 0xffff;
+ uint8 *ptr = 0;
+ for (int i = 8; i; i--) {
+ ptr = _vm->getResourceAddress(rtSound, _pcmCurrentSound[i].index) + 6;
+ uint16 a = READ_LE_UINT16(ptr + 10);
+ if (a <= l) {
+ chan = i;
+ l = a;
+ }
+ }
+
+ ptr = _vm->getResourceAddress(rtSound, sound) + 6;
+ if (l <= READ_LE_UINT16(ptr + 10))
+ _vm->_sound->stopSound(_pcmCurrentSound[chan].index);
+ else
+ chan = 0;
+ }
+
+ if (chan) {
+ _pcmCurrentSound[chan].index = sound;
+ _pcmCurrentSound[chan].chan = sfxChanRelIndex;
+ }
+
+ return chan;
+}
+
+void Player_Towns::restartLoopingSounds() {
+ if (_cdaNumLoops && !_cdaForceRestart)
+ _cdaForceRestart = 1;
+
+ for (int i = 1; i < 9; i++) {
+ if (!_pcmCurrentSound[i].paused)
+ continue;
+
+ _pcmCurrentSound[i].paused = 0;
+
+ uint8 *ptr = _vm->getResourceAddress(rtSound, _pcmCurrentSound[i].index);
+ if (!ptr)
+ continue;
+ ptr += 24;
+
+ int c = 1;
+ while (_pcmCurrentSound[i].chan != c) {
+ ptr = ptr + READ_LE_UINT32(&ptr[12]) + 32;
+ c++;
+ }
+
+ _driver->playSoundEffect(i + 0x3f, _pcmCurrentSound[i].note, _pcmCurrentSound[i].velo, ptr);
+ }
+
+ _driver->intf()->callback(73, 1);
+}
+
+void Player_Towns::startSoundEx(int sound, int velo, int pan, int note) {
+ uint8 *ptr = _vm->getResourceAddress(rtSound, sound) + 2;
+
+ if (pan > 99)
+ pan = 99;
+
+ velo = velo ? (velo * ptr[14] + 50) / 100 : ptr[14];
+ velo = CLIP(velo, 1, 255);
+
+ if (ptr[13] == 0) {
+ velo >>= 1;
+
+ if (!velo)
+ velo = 1;
+
+ pan = pan ? (((pan << 7) - pan) + 50) / 100 : 64;
+
+ playPcmTrack(sound, ptr + 6, velo, pan, note);
+
+ } else if (ptr[13] == 2) {
+ int volLeft = velo;
+ int volRight = velo;
+
+ if (pan < 50)
+ volRight = ((pan * 2 + 1) * velo + 50) / 100;
+ else if (pan > 50)
+ volLeft = (((99 - pan) * 2 + 1) * velo + 50) / 100;
+
+ setVolumeCD(volLeft, volRight);
+
+ if (!_cdaForceRestart && sound == _cdaCurrentSound)
+ return;
+
+ playCdaTrack(sound, ptr + 6, true);
+ }
+}
+
+void Player_Towns::stopSoundSuspendLooping(int sound) {
+ if (!sound) {
+ return;
+ } else if (sound == _cdaCurrentSound) {
+ if (_cdaNumLoops && _cdaForceRestart)
+ _cdaForceRestart = 1;
+ } else {
+ for (int i = 1; i < 9; i++) {
+ if (sound == _pcmCurrentSound[i].index) {
+ if (!_driver->soundEffectIsPlaying(i + 0x3f))
+ continue;
+ _driver->stopSoundEffect(i + 0x3f);
+ if (_pcmCurrentSound[i].looping)
+ _pcmCurrentSound[i].paused = 1;
+ else
+ _pcmCurrentSound[i].index = 0;
+ }
+ }
+ }
+}
+
+void Player_Towns::playEuphonyTrack(int sound, const uint8 *data) {
+ const uint8 *pos = data + 16;
+ const uint8 *src = pos + data[14] * 48;
+ const uint8 *trackData = src + 150;
+
+ for (int i = 0; i < 32; i++)
+ _driver->chanEnable(i, *src++);
+ for (int i = 0; i < 32; i++)
+ _driver->chanMode(i, 0xff);
+ for (int i = 0; i < 32; i++)
+ _driver->chanOrdr(i, *src++);
+ for (int i = 0; i < 32; i++)
+ _driver->chanVolumeShift(i, *src++);
+ for (int i = 0; i < 32; i++)
+ _driver->chanNoteShift(i, *src++);
+
+ src += 8;
+ for (int i = 0; i < 6; i++)
+ _driver->assignChannel(i, *src++);
+
+ for (int i = 0; i < data[14]; i++) {
+ _driver->loadInstrument(i, i, pos + i * 48);
+ _driver->intf()->callback(4, i, i);
+ }
+
+ _eupVolLeft = _ovrCur.vLeft;
+ _eupVolRight = _ovrCur.vRight;
+ int lvl = _ovrCur.vLeft + _ovrCur.vRight;
+ if (!lvl)
+ lvl = data[8] + data[9];
+ lvl >>= 2;
+
+ for (int i = 0; i < 6; i++)
+ _driver->chanVolume(i, lvl);
+
+ uint32 trackSize = READ_LE_UINT32(src);
+ src += 4;
+ uint8 startTick = *src++;
+
+ _driver->setMusicTempo(*src++);
+ _driver->startMusicTrack(trackData, trackSize, startTick);
+
+ _eupLooping = (*src != 1) ? 1 : 0;
+ _driver->setMusicLoop(_eupLooping != 0);
+ _driver->continueParsing();
+ _eupCurrentSound = sound;
+}
+
+void Player_Towns::playPcmTrack(int sound, const uint8 *data, int velo, int pan, int note) {
+ const uint8 *ptr = data;
+ const uint8 *sfxData = ptr + 16;
+
+ int note2, velocity;
+
+ if (velo)
+ velocity = velo;
+ else if (_ovrCur.vLeft + _ovrCur.vRight)
+ velocity = (_ovrCur.vLeft + _ovrCur.vRight) >> 2;
+ else
+ velocity = ptr[8] >> 1;
+
+ int numChan = ptr[14];
+ for (int i = 0; i < numChan; i++) {
+ int chan = getNextFreePcmChannel(sound, i);
+ if (!chan)
+ return;
+
+ _driver->intf()->callback(70, _unkFlags);
+ _driver->chanPanPos(chan + 0x3f, pan);
+
+ if (note)
+ note2 = note;
+ else if (_ovrCur.note)
+ note2 = _ovrCur.note;
+ else
+ note2 = sfxData[28];
+
+ _driver->playSoundEffect(chan + 0x3f, note2, velocity, sfxData);
+
+ _pcmCurrentSound[chan].note = note2;
+ _pcmCurrentSound[chan].velo = velocity;
+ _pcmCurrentSound[chan].pan = pan;
+ _pcmCurrentSound[chan].paused = 0;
+ _pcmCurrentSound[chan].looping = READ_LE_UINT32(&sfxData[20]) ? 1 : 0;
+
+ sfxData += (READ_LE_UINT32(&sfxData[12]) + 32);
+ }
+}
+
+void Player_Towns::playCdaTrack(int sound, const uint8 *data, bool skipTrackVelo) {
+ const uint8 *ptr = data;
+
+ if (!sound)
+ return;
+
+ if (!skipTrackVelo) {
+ if (_ovrCur.vLeft + _ovrCur.vRight)
+ setVolumeCD(_ovrCur.vLeft, _ovrCur.vRight);
+ else
+ setVolumeCD(ptr[8], ptr[9]);
+ }
+
+ if (sound == _cdaCurrentSound && _vm->_sound->pollCD() == 1)
+ return;
+
+ ptr += 16;
+
+ int track = ptr[0];
+ _cdaNumLoops = ptr[1];
+ int start = (ptr[2] * 60 + ptr[3]) * 75 + ptr[4];
+ int end = (ptr[5] * 60 + ptr[6]) * 75 + ptr[7];
+
+ _vm->_sound->playCDTrack(track, _cdaNumLoops == 0xff ? -1 : _cdaNumLoops, start, end <= start ? 0 : end - start);
+ _cdaForceRestart = 0;
+ _cdaCurrentSound = sound;
+}
+
+void Player_Towns::stopPcmTrack(int sound) {
+ for (int i = 1; i < 9; i++) {
+ if (sound == _pcmCurrentSound[i].index || !sound) {
+ _driver->stopSoundEffect(i + 0x3f);
+ _pcmCurrentSound[i].index = 0;
+ }
+ }
+}
+
+} // End of namespace Scumm
+
diff --git a/engines/scumm/player_towns.h b/engines/scumm/player_towns.h
new file mode 100644
index 0000000000..6d87c93c09
--- /dev/null
+++ b/engines/scumm/player_towns.h
@@ -0,0 +1,120 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef SCUMM_PLAYER_TOWNS_H
+#define SCUMM_PLAYER_TOWNS_H
+
+#include "scumm/scumm.h"
+#include "scumm/music.h"
+#include "sound/softsynth/fmtowns_pc98/towns_euphony.h"
+
+namespace Scumm {
+
+class Player_Towns : public MusicEngine {
+public:
+ Player_Towns(ScummEngine *vm, Audio::Mixer *mixer);
+ virtual ~Player_Towns();
+
+ bool init();
+
+ void setMusicVolume(int vol);
+ void setSfxVolume(int vol);
+ void startSound(int sound);
+ void stopSound(int sound);
+ void stopAllSounds();
+
+ int getSoundStatus(int sound) const;
+ int getCurrentCdaSound() { return _cdaCurrentSound; }
+ int getCurrentCdaVolume() { return (_cdaVolLeft + _cdaVolRight + 1) >> 1; }
+
+ virtual int32 doCommand(int numargs, int args[]);
+
+ void setVolumeCD(int left, int right);
+ void setSoundVolume(int sound, int left, int right);
+ void setSoundNote(int sound, int note);
+
+ void saveLoadWithSerializer(Serializer *ser);
+ void restoreAfterLoad();
+
+ TownsEuphonyDriver *driver() { return _driver; }
+
+protected:
+ virtual int getNextFreePcmChannel(int sound, int sfxChanRelIndex);
+
+private:
+ void restartLoopingSounds();
+ void startSoundEx(int sound, int velo, int pan, int note);
+ void stopSoundSuspendLooping(int sound);
+
+ void playEuphonyTrack(int sound, const uint8 *data);
+ void playPcmTrack(int sound, const uint8 *data, int velo = 0, int pan = 64, int note = 0);
+ void playCdaTrack(int sound, const uint8 *data, bool skipTrackVelo = false);
+
+ void stopPcmTrack(int sound);
+
+ uint8 _cdaVolLeft;
+ uint8 _cdaVolRight;
+
+ struct SoundOvrParameters {
+ uint8 vLeft;
+ uint8 vRight;
+ uint8 note;
+ };
+
+ SoundOvrParameters *_soundOverride;
+ SoundOvrParameters _ovrCur;
+
+ uint8 _unkFlags;
+
+ struct PcmCurrentSound {
+ uint16 index;
+ uint16 chan;
+ uint8 note;
+ uint8 velo;
+ uint8 pan;
+ uint8 paused;
+ uint8 looping;
+ uint32 priority;
+ } _pcmCurrentSound[9];
+
+ uint8 _eupCurrentSound;
+ uint8 _eupLooping;
+ uint8 _eupVolLeft;
+ uint8 _eupVolRight;
+
+ uint8 _cdaCurrentSound;
+ uint8 _cdaNumLoops;
+ uint8 _cdaForceRestart;
+
+ uint8 _cdaCurrentSoundTemp;
+ uint8 _cdaNumLoopsTemp;
+
+ TownsEuphonyDriver *_driver;
+ ScummEngine *_vm;
+};
+
+} // End of namespace Scumm
+
+#endif
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index 3cc619f630..ca48a2b86a 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -32,6 +32,7 @@
#include "scumm/charset.h"
#include "scumm/imuse_digi/dimuse.h"
#include "scumm/imuse/imuse.h"
+#include "player_towns.h"
#include "scumm/he/intern_he.h"
#include "scumm/object.h"
#include "scumm/resource.h"
@@ -447,6 +448,9 @@ bool ScummEngine::loadState(int slot, bool compat) {
// Update volume settings
syncSoundSettings();
+ if (_townsPlayer && (hdr.ver >= VER(81)))
+ _townsPlayer->restoreAfterLoad();
+
// Init NES costume data
if (_game.platform == Common::kPlatformNES) {
if (hdr.ver < VER(47))
@@ -1394,6 +1398,11 @@ void ScummEngine::saveOrLoad(Serializer *s) {
_imuse->save_or_load(s, this);
}
+
+ // Save/load FM-Towns audio status
+ if (_townsPlayer)
+ _townsPlayer->saveLoadWithSerializer(s);
+
//
// Save/load the charset renderer state
//
diff --git a/engines/scumm/saveload.h b/engines/scumm/saveload.h
index fafb6b383f..44c8cc7d60 100644
--- a/engines/scumm/saveload.h
+++ b/engines/scumm/saveload.h
@@ -50,7 +50,7 @@ namespace Scumm {
* only saves/loads those which are valid for the version of the savegame
* which is being loaded/saved currently.
*/
-#define CURRENT_VER 80
+#define CURRENT_VER 81
/**
* An auxillary macro, used to specify savegame versions. We use this instead
diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp
index be9f69ffb5..223e9822e2 100644
--- a/engines/scumm/script.cpp
+++ b/engines/scumm/script.cpp
@@ -708,25 +708,6 @@ void ScummEngine::writeVar(uint var, int value) {
error("Illegal varbits (w)");
}
-void ScummEngine::getResultPos() {
- int a;
-
- _resultVarNumber = fetchScriptWord();
- if (_resultVarNumber & 0x2000) {
- a = fetchScriptWord();
- if (a & 0x2000) {
- _resultVarNumber += readVar(a & ~0x2000);
- } else {
- _resultVarNumber += a & 0xFFF;
- }
- _resultVarNumber &= ~0x2000;
- }
-}
-
-void ScummEngine::setResult(int value) {
- writeVar(_resultVarNumber, value);
-}
-
void ScummEngine::push(int a) {
assert(_scummStackPos >= 0 && _scummStackPos < ARRAYSIZE(_vmStack));
_vmStack[_scummStackPos++] = a;
diff --git a/engines/scumm/script_v2.cpp b/engines/scumm/script_v2.cpp
index d93e2ea3e4..bc8446d16f 100644
--- a/engines/scumm/script_v2.cpp
+++ b/engines/scumm/script_v2.cpp
@@ -640,7 +640,6 @@ void ScummEngine_v2::o2_waitForActor() {
}
void ScummEngine_v2::o2_waitForMessage() {
-
if (VAR(VAR_HAVE_MSG)) {
_scriptPointer--;
o5_breakHere();
diff --git a/engines/scumm/script_v3.cpp b/engines/scumm/script_v3.cpp
index 7d2efdb9a8..176eefdeef 100644
--- a/engines/scumm/script_v3.cpp
+++ b/engines/scumm/script_v3.cpp
@@ -24,6 +24,7 @@
*/
#include "scumm/scumm_v3.h"
+#include "scumm/actor.h"
namespace Scumm {
@@ -36,6 +37,11 @@ void ScummEngine_v3::setupOpcodes() {
OPCODE(0x30, o3_setBoxFlags);
OPCODE(0xb0, o3_setBoxFlags);
}
+
+ OPCODE(0x3b, o3_waitForActor);
+ OPCODE(0xbb, o3_waitForActor);
+
+ OPCODE(0x4c, o3_waitForSentence);
}
void ScummEngine_v3::o3_setBoxFlags() {
@@ -46,4 +52,38 @@ void ScummEngine_v3::o3_setBoxFlags() {
setBoxFlags(a, b);
}
+void ScummEngine_v3::o3_waitForActor() {
+ // This opcode was a NOP in LOOM. Also, we cannot directly use
+ // o2_waitForActor because there the _scriptPointer is different (it
+ // assumes that getVar reads only a single byte, which is correct
+ // for v2 but not for v3). Of course we could copy the code here to
+ // o2_waitForActor and then merge the two, but right now I am
+ // keeping this as it is.
+ if (_game.id == GID_INDY3) {
+ const byte *oldaddr = _scriptPointer - 1;
+ Actor *a = derefActor(getVarOrDirectByte(PARAM_1), "o3_waitForActor");
+ if (a->_moving) {
+ _scriptPointer = oldaddr;
+ o5_breakHere();
+ }
+ }
+}
+
+void ScummEngine_v3::o3_waitForSentence() {
+ // FIXME/TODO: Can we merge this with o2_waitForSentence? I think
+ // the code here is actually incorrect, and the code in
+ // o2_waitForSentence correct, but somebody should check the
+ // disassembly for Indy and Loom.
+ if (_sentenceNum) {
+ if (_sentence[_sentenceNum - 1].freezeCount && !isScriptInUse(VAR(VAR_SENTENCE_SCRIPT)))
+ return;
+ } else if (!isScriptInUse(VAR(VAR_SENTENCE_SCRIPT)))
+ return;
+
+ _scriptPointer--;
+ o5_breakHere();
+}
+
+
+
} // End of namespace Scumm
diff --git a/engines/scumm/script_v4.cpp b/engines/scumm/script_v4.cpp
index 01927b02e7..6dc3004432 100644
--- a/engines/scumm/script_v4.cpp
+++ b/engines/scumm/script_v4.cpp
@@ -60,6 +60,11 @@ void ScummEngine_v4::setupOpcodes() {
OPCODE(0x22, o4_saveLoadGame);
OPCODE(0xa2, o4_saveLoadGame);
+
+ // Disable some opcodes which are unused in v4.
+ _opcodes[0x3b].setProc(0, 0);
+ _opcodes[0x4c].setProc(0, 0);
+ _opcodes[0xbb].setProc(0, 0);
}
void ScummEngine_v4::o4_ifState() {
diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp
index 5c20e0dfd3..8d986afc66 100644
--- a/engines/scumm/script_v5.cpp
+++ b/engines/scumm/script_v5.cpp
@@ -29,6 +29,7 @@
#include "scumm/scumm_v3.h"
#include "scumm/scumm_v5.h"
#include "scumm/sound.h"
+#include "scumm/player_towns.h"
#include "scumm/util.h"
#include "scumm/verbs.h"
@@ -377,6 +378,25 @@ int ScummEngine_v5::getVarOrDirectWord(byte mask) {
return fetchScriptWordSigned();
}
+void ScummEngine_v5::getResultPos() {
+ int a;
+
+ _resultVarNumber = fetchScriptWord();
+ if (_resultVarNumber & 0x2000) {
+ a = fetchScriptWord();
+ if (a & 0x2000) {
+ _resultVarNumber += readVar(a & ~0x2000);
+ } else {
+ _resultVarNumber += a & 0xFFF;
+ }
+ _resultVarNumber &= ~0x2000;
+ }
+}
+
+void ScummEngine_v5::setResult(int value) {
+ writeVar(_resultVarNumber, value);
+}
+
void ScummEngine_v5::jumpRelative(bool cond) {
// We explicitly call ScummEngine::fetchScriptWord()
// to make this method work also in v0, which overloads
@@ -980,17 +1000,6 @@ void ScummEngine_v5::o5_getActorRoom() {
void ScummEngine_v5::o5_getActorScale() {
Actor *a;
- // INDY3 uses this opcode for waitForActor
- if (_game.id == GID_INDY3) {
- const byte *oldaddr = _scriptPointer - 1;
- a = derefActor(getVarOrDirectByte(PARAM_1), "o5_getActorScale (wait)");
- if (a->_moving) {
- _scriptPointer = oldaddr;
- o5_breakHere();
- }
- return;
- }
-
getResultPos();
int act = getVarOrDirectByte(PARAM_1);
a = derefActor(act, "o5_getActorScale");
@@ -1587,21 +1596,18 @@ void ScummEngine_v5::o5_resourceRoutines() {
debug(0, "o5_resourceRoutines %d not yet handled (script %d)", op, vm.slot[_currentScript].number);
break;
case 35:
- // TODO: Might be used to set CD volume in FM-TOWNS Loom
- foo = getVarOrDirectByte(PARAM_2);
- debug(0, "o5_resourceRoutines %d not yet handled (script %d)", op, vm.slot[_currentScript].number);
+ if (_townsPlayer)
+ _townsPlayer->setVolumeCD(getVarOrDirectByte(PARAM_2), resid);
break;
case 36:
- // TODO: Sets the loudness of a sound resource. Used in Indy3 and Zak.
foo = getVarOrDirectByte(PARAM_2);
bar = fetchScriptByte();
- debug(0, "o5_resourceRoutines %d not yet handled (script %d)", op, vm.slot[_currentScript].number);
+ if (_townsPlayer)
+ _townsPlayer->setSoundVolume(resid, foo, bar);
break;
case 37:
- // TODO: Sets the pitch of a sound resource (pitch = foo - center semitones.
- // "center" is at 0x32 in the sfx resource (always 0x3C in zak256, but sometimes different in Indy3).
- foo = getVarOrDirectByte(PARAM_2);
- debug(0, "o5_resourceRoutines %d not yet handled (script %d)", op, vm.slot[_currentScript].number);
+ if (_townsPlayer)
+ _townsPlayer->setSoundNote(resid, getVarOrDirectByte(PARAM_2));
break;
default:
@@ -1972,7 +1978,7 @@ void ScummEngine_v5::o5_startMusic() {
result = _sound->getCurrentCDSound();
break;
case 0xFF:
- // TODO: Might return current CD volume in FM-TOWNS Loom. See also bug #805691.
+ result = _townsPlayer->getCurrentCdaVolume();
break;
default:
// TODO: return track length in seconds. We'll have to extend Sound and OSystem for this.
@@ -2025,19 +2031,6 @@ void ScummEngine_v5::o5_isSoundRunning() {
void ScummEngine_v5::o5_soundKludge() {
int items[16];
-
- if (_game.features & GF_SMALL_HEADER) { // Is WaitForSentence in SCUMM V3
- if (_sentenceNum) {
- if (_sentence[_sentenceNum - 1].freezeCount && !isScriptInUse(VAR(VAR_SENTENCE_SCRIPT)))
- return;
- } else if (!isScriptInUse(VAR(VAR_SENTENCE_SCRIPT)))
- return;
-
- _scriptPointer--;
- o5_breakHere();
- return;
- }
-
int num = getWordVararg(items);
_sound->soundKludge(items, num);
}
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index fc95060b6f..75c507565c 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -48,6 +48,7 @@
#include "scumm/imuse_digi/dimuse.h"
#include "scumm/smush/smush_mixer.h"
#include "scumm/smush/smush_player.h"
+#include "scumm/player_towns.h"
#include "scumm/insane/insane.h"
#include "scumm/he/animation_he.h"
#include "scumm/he/intern_he.h"
@@ -146,6 +147,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
_imuse = NULL;
_imuseDigital = NULL;
_musicEngine = NULL;
+ _townsPlayer = NULL;
_verbs = NULL;
_objs = NULL;
_sound = NULL;
@@ -214,7 +216,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
_opcode = 0;
vm.numNestedScripts = 0;
_lastCodePtr = NULL;
- _resultVarNumber = 0;
_scummStackPos = 0;
memset(_vmStack, 0, sizeof(_vmStack));
_fileOffset = 0;
@@ -631,6 +632,10 @@ ScummEngine_v5::ScummEngine_v5(OSystem *syst, const DetectorResult &dr)
_flashlight.xStrips = 7;
_flashlight.yStrips = 7;
_flashlight.buffer = NULL;
+
+ memset(_saveLoadVarsFilename, 0, sizeof(_saveLoadVarsFilename));
+
+ _resultVarNumber = 0;
}
ScummEngine_v4::ScummEngine_v4(OSystem *syst, const DetectorResult &dr)
@@ -1642,9 +1647,11 @@ void ScummEngine::setupMusic(int midi) {
_musicType = MDT_NONE;
break;
case MT_PCSPK:
- case MT_PCJR:
_musicType = MDT_PCSPK;
break;
+ case MT_PCJR:
+ _musicType = MDT_PCJR;
+ break;
//case MT_CMS:
#if 1
_musicType = MDT_ADLIB;
@@ -1658,6 +1665,12 @@ void ScummEngine::setupMusic(int midi) {
case MT_ADLIB:
_musicType = MDT_ADLIB;
break;
+ case MT_C64:
+ _musicType = MDT_C64;
+ break;
+ case MT_APPLEIIGS:
+ _musicType = MDT_APPLEIIGS;
+ break;
default:
_musicType = MDT_MIDI;
break;
@@ -1706,7 +1719,7 @@ void ScummEngine::setupMusic(int midi) {
* automatically when samples need to be generated */
if (!_mixer->isReady()) {
warning("Sound mixer initialization failed");
- if (_musicType == MDT_ADLIB || _musicType == MDT_PCSPK || _musicType == MDT_CMS) {
+ if (_musicType == MDT_ADLIB || _musicType == MDT_PCSPK || _musicType == MDT_PCJR || _musicType == MDT_CMS) {
dev = 0;
_musicType = MDT_NONE;
warning("MIDI driver depends on sound mixer, switching to null MIDI driver");
@@ -1740,12 +1753,16 @@ void ScummEngine::setupMusic(int midi) {
_musicEngine = new Player_V1(this, _mixer, MidiDriver::getMusicType(dev) != MT_PCSPK);
} else if (_game.version <= 2) {
_musicEngine = new Player_V2(this, _mixer, MidiDriver::getMusicType(dev) != MT_PCSPK);
- } else if ((_musicType == MDT_PCSPK) && (_game.version > 2 && _game.version <= 4)) {
+ } else if ((_musicType == MDT_PCSPK || _musicType == MDT_PCJR) && (_game.version > 2 && _game.version <= 4)) {
_musicEngine = new Player_V2(this, _mixer, MidiDriver::getMusicType(dev) != MT_PCSPK);
} else if (_musicType == MDT_CMS) {
_musicEngine = new Player_V2CMS(this, _mixer);
} else if (_game.platform == Common::kPlatform3DO && _game.heversion <= 62) {
// 3DO versions use digital music and sound samples.
+ } else if (_game.platform == Common::kPlatformFMTowns && (_game.version == 3 || _game.id == GID_MONKEY)) {
+ _musicEngine = _townsPlayer = new Player_Towns(this, _mixer);
+ if (!_townsPlayer->init())
+ error("Failed to initialize FM-Towns audio driver.");
} else if (_game.version >= 3 && _game.heversion <= 62) {
MidiDriver *nativeMidiDriver = 0;
MidiDriver *adlibMidiDriver = 0;
@@ -1791,10 +1808,23 @@ void ScummEngine::syncSoundSettings() {
int soundVolumeSfx = ConfMan.getInt("sfx_volume");
int soundVolumeSpeech = ConfMan.getInt("speech_volume");
+ bool mute = false;
+
+ if (ConfMan.hasKey("mute")) {
+ mute = ConfMan.getBool("mute");
+
+ if (mute)
+ soundVolumeMusic = soundVolumeSfx = soundVolumeSpeech = 0;
+ }
+
if (_musicEngine) {
_musicEngine->setMusicVolume(soundVolumeMusic);
}
+ if (_townsPlayer) {
+ _townsPlayer->setSfxVolume(soundVolumeSfx);
+ }
+
_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, soundVolumeSfx);
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, soundVolumeMusic);
_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, soundVolumeSpeech);
@@ -2087,7 +2117,12 @@ void ScummEngine::scummLoop_updateScummVars() {
// Since there are 2 2-stripes wide borders in MM NES screen,
// we have to compensate for it here. This fixes paning effects.
// Fixes bug #1328120: "MANIACNES: Screen width incorrect, camera halts sometimes"
- VAR(VAR_CAMERA_POS_X) = (camera._cur.x >> V12_X_SHIFT) + 2;
+ // But do not do it when only scrolling right to left, since otherwise Ed will not show
+ // up on the doorbell (Bug #3039004)
+ if (VAR(VAR_CAMERA_POS_X) < (camera._cur.x >> V12_X_SHIFT) + 2)
+ VAR(VAR_CAMERA_POS_X) = (camera._cur.x >> V12_X_SHIFT) + 2;
+ else
+ VAR(VAR_CAMERA_POS_X) = (camera._cur.x >> V12_X_SHIFT);
} else if (_game.version <= 2) {
VAR(VAR_CAMERA_POS_X) = camera._cur.x >> V12_X_SHIFT;
} else {
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index 42322ba5a2..1357bad8cf 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -70,6 +70,7 @@ class CharsetRenderer;
class IMuse;
class IMuseDigital;
class MusicEngine;
+class Player_Towns;
class ScummEngine;
class ScummDebugger;
class Serializer;
@@ -426,6 +427,7 @@ public:
IMuse *_imuse;
IMuseDigital *_imuseDigital;
MusicEngine *_musicEngine;
+ Player_Towns *_townsPlayer;
Sound *_sound;
VerbSlot *_verbs;
@@ -689,7 +691,7 @@ protected:
const byte *_scriptPointer, *_scriptOrgPointer;
byte _opcode, _currentScript;
const byte * const *_lastCodePtr;
- int _resultVarNumber, _scummStackPos;
+ int _scummStackPos;
int _vmStack[150];
OpcodeEntry _opcodes[256];
@@ -745,8 +747,6 @@ protected:
int fetchScriptDWordSigned();
void ignoreScriptWord() { fetchScriptWord(); }
void ignoreScriptByte() { fetchScriptByte(); }
- virtual void getResultPos();
- void setResult(int result);
void push(int a);
int pop();
virtual int readVar(uint var);
diff --git a/engines/scumm/scumm_v3.h b/engines/scumm/scumm_v3.h
index 767069d1bc..abe75cd64d 100644
--- a/engines/scumm/scumm_v3.h
+++ b/engines/scumm/scumm_v3.h
@@ -50,6 +50,8 @@ protected:
/* Version 3 script opcodes */
void o3_setBoxFlags();
+ void o3_waitForActor();
+ void o3_waitForSentence();
};
/**
diff --git a/engines/scumm/scumm_v5.h b/engines/scumm/scumm_v5.h
index 2580384fd8..71222470f4 100644
--- a/engines/scumm/scumm_v5.h
+++ b/engines/scumm/scumm_v5.h
@@ -50,6 +50,8 @@ protected:
PARAM_3 = 0x20
};
+ int _resultVarNumber;
+
public:
ScummEngine_v5(OSystem *syst, const DetectorResult &dr);
@@ -77,6 +79,9 @@ protected:
virtual int getVarOrDirectByte(byte mask);
virtual int getVarOrDirectWord(byte mask);
+ virtual void getResultPos();
+ void setResult(int result);
+
virtual void animateCursor();
virtual void setBuiltinCursor(int index);
diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp
index a845f623c2..708faa5687 100644
--- a/engines/scumm/sound.cpp
+++ b/engines/scumm/sound.cpp
@@ -31,6 +31,7 @@
#include "scumm/file.h"
#include "scumm/imuse/imuse.h"
#include "scumm/imuse_digi/dimuse.h"
+#include "scumm/player_towns.h"
#include "scumm/scumm.h"
#include "scumm/sound.h"
#include "scumm/util.h"
@@ -150,9 +151,10 @@ void Sound::processSoundQueues() {
data[0] >> 8, data[0] & 0xFF,
data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
- if (_vm->_imuse) {
+ if (_vm->_townsPlayer)
+ _vm->VAR(_vm->VAR_SOUNDRESULT) = (short)_vm->_townsPlayer->doCommand(num, data);
+ else if (_vm->_imuse)
_vm->VAR(_vm->VAR_SOUNDRESULT) = (short)_vm->_imuse->doCommand(num, data);
- }
}
}
_soundQuePos = 0;
@@ -170,7 +172,18 @@ void Sound::playSound(int soundID) {
static const char tracks[20] = {3, 4, 5, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 19, 20, 21};
_currentCDSound = soundID;
- playCDTrack(tracks[soundID - 13], 1, 0, 0);
+
+ // The original game had hard-coded lengths for all
+ // tracks, but this one track is the only one (as far
+ // as we know) where this actually matters. See bug
+ // #3024173 - LOOM-PCE: Music stops prematurely.
+
+ int track = tracks[soundID - 13];
+ if (track == 6) {
+ playCDTrack(track, 1, 0, 260);
+ } else {
+ playCDTrack(track, 1, 0, 0);
+ }
} else {
if (_vm->_musicEngine) {
_vm->_musicEngine->startSound(soundID);
@@ -301,89 +314,28 @@ void Sound::playSound(int soundID) {
stream = Audio::makeRawStream(sound, size, rate, Audio::FLAG_UNSIGNED);
_mixer->playStream(Audio::Mixer::kSFXSoundType, NULL, stream, soundID);
}
- else if ((_vm->_game.platform == Common::kPlatformFMTowns && _vm->_game.version == 3) || READ_BE_UINT32(ptr) == MKID_BE('SOUN') || READ_BE_UINT32(ptr) == MKID_BE('TOWS')) {
-
- bool tows = READ_BE_UINT32(ptr) == MKID_BE('TOWS');
- if (_vm->_game.version == 3) {
- size = READ_LE_UINT32(ptr);
- } else {
- size = READ_BE_UINT32(ptr + 4) - 2;
- if (tows)
- size += 8;
+ else if (_vm->_game.platform != Common::kPlatformFMTowns && READ_BE_UINT32(ptr) == MKID_BE('SOUN')) {
+ if (_vm->_game.version != 3)
ptr += 2;
- }
- rate = 11025;
int type = *(ptr + 0x0D);
- int numInstruments;
-
- if (tows)
- type = 0;
- switch (type) {
- case 0: // Sound effect
- numInstruments = *(ptr + 0x14);
- if (tows)
- numInstruments = 1;
+ if (type == 2) {
+ // CD track resource
ptr += 0x16;
- size -= 0x16;
-
- while (numInstruments--) {
- int waveSize = READ_LE_UINT32(ptr + 0x0C);
- int loopStart = READ_LE_UINT32(ptr + 0x10) * 2;
- int loopEnd = READ_LE_UINT32(ptr + 0x14) - 1;
- rate = READ_LE_UINT32(ptr + 0x18) * 1000 / 0x62;
- ptr += 0x20;
- size -= 0x20;
- if (size < waveSize) {
- warning("Wrong wave size in sound #%i: %i", soundID, waveSize);
- waveSize = size;
- }
- sound = (byte *)malloc(waveSize);
- for (int x = 0; x < waveSize; x++) {
- byte b = *ptr++;
- if (b < 0x80)
- sound[x] = 0x7F - b;
- else
- sound[x] = b;
- }
- size -= waveSize;
-
- if (loopEnd > 0) {
- Audio::SeekableAudioStream *s = Audio::makeRawStream(sound, waveSize, rate, Audio::FLAG_UNSIGNED);
- stream = new Audio::SubLoopingAudioStream(s, 0, Audio::Timestamp(0, loopStart, rate), Audio::Timestamp(0, loopEnd, rate));
- } else {
- stream = Audio::makeRawStream(sound, waveSize, rate, Audio::FLAG_UNSIGNED);
- }
- _mixer->playStream(Audio::Mixer::kSFXSoundType, NULL, stream, soundID, 255, 0);
- }
- break;
- case 1:
- // Music (Euphony format)
- if (_vm->_musicEngine)
- _vm->_musicEngine->startSound(soundID);
- break;
- case 2: // CD track resource
- ptr += 0x16;
-
- if (soundID == _currentCDSound && pollCD() == 1) {
+ if (soundID == _currentCDSound && pollCD() == 1)
return;
- }
- {
- int track = ptr[0];
- int loops = ptr[1];
- int start = (ptr[2] * 60 + ptr[3]) * 75 + ptr[4];
- int end = (ptr[5] * 60 + ptr[6]) * 75 + ptr[7];
-
- playCDTrack(track, loops == 0xff ? -1 : loops, start, end <= start ? 0 : end - start);
- }
+ int track = ptr[0];
+ int loops = ptr[1];
+ int start = (ptr[2] * 60 + ptr[3]) * 75 + ptr[4];
+ int end = (ptr[5] * 60 + ptr[6]) * 75 + ptr[7];
+ playCDTrack(track, loops == 0xff ? -1 : loops, start, end <= start ? 0 : end - start);
_currentCDSound = soundID;
- break;
- default:
+ } else {
// All other sound types are ignored
- break;
+ warning("Scumm::Sound::playSound: encountered audio resoure with chunk type 'SOUN' and sound type %d", type);
}
}
else if ((_vm->_game.id == GID_LOOM) && (_vm->_game.platform == Common::kPlatformMacintosh)) {
@@ -469,6 +421,9 @@ void Sound::playSound(int soundID) {
if (_vm->_musicEngine) {
_vm->_musicEngine->startSound(soundID);
}
+
+ if (_vm->_townsPlayer)
+ _currentCDSound = _vm->_townsPlayer->getCurrentCdaSound();
}
}
@@ -1134,7 +1089,7 @@ int ScummEngine::readSoundResource(int idx) {
switch (basetag) {
case MKID_BE('MIDI'):
case MKID_BE('iMUS'):
- if (_musicType != MDT_PCSPK) {
+ if (_musicType != MDT_PCSPK && _musicType != MDT_PCJR) {
_fileHandle->seek(-8, SEEK_CUR);
_fileHandle->read(_res->createResource(rtSound, idx, total_size + 8), total_size + 8);
return 1;
@@ -1177,12 +1132,12 @@ int ScummEngine::readSoundResource(int idx) {
break;
case MKID_BE('SPK '):
pri = -1;
-// if (_musicType == MDT_PCSPK)
+// if (_musicType == MDT_PCSPK || _musicType == MDT_PCJR)
// pri = 11;
break;
}
- if ((_musicType == MDT_PCSPK || _musicType == MDT_CMS) && pri != 11)
+ if ((_musicType == MDT_PCSPK || _musicType == MDT_PCJR || _musicType == MDT_CMS) && pri != 11)
pri = -1;
debugC(DEBUG_RESOURCE, " tag: %s, total_size=%d, pri=%d", tag2str(tag), size, pri);
@@ -2114,7 +2069,7 @@ int ScummEngine::readSoundResourceSmallHeader(int idx) {
}
}
- if ((_musicType == MDT_PCSPK) && wa_offs != 0) {
+ if ((_musicType == MDT_PCSPK || _musicType == MDT_PCJR) && wa_offs != 0) {
if (_game.features & GF_OLD_BUNDLE) {
_fileHandle->seek(wa_offs, SEEK_SET);
_fileHandle->read(_res->createResource(rtSound, idx, wa_size), wa_size);
diff --git a/engines/scumm/vars.cpp b/engines/scumm/vars.cpp
index cacfd0101b..d1d3ed63a4 100644
--- a/engines/scumm/vars.cpp
+++ b/engines/scumm/vars.cpp
@@ -727,6 +727,9 @@ void ScummEngine::resetScummVars() {
case MDT_PCSPK:
VAR(VAR_SOUNDCARD) = 0;
break;
+ case MDT_PCJR:
+ VAR(VAR_SOUNDCARD) = 1;
+ break;
case MDT_CMS:
VAR(VAR_SOUNDCARD) = 2;
break;
diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp
index 95fba8ee7e..5f8a6d9f52 100644
--- a/engines/scumm/verbs.cpp
+++ b/engines/scumm/verbs.cpp
@@ -651,6 +651,50 @@ void ScummEngine_v2::checkExecVerbs() {
}
}
+ // Simulate inventory picking and scrolling keys
+ int object = -1;
+
+ switch (_mouseAndKeyboardStat) {
+ case 'u': // arrow up
+ if (_inventoryOffset >= 2) {
+ _inventoryOffset -= 2;
+ redrawV2Inventory();
+ }
+ return;
+ case 'j': // arrow down
+ if (_inventoryOffset + 4 < getInventoryCount(_scummVars[VAR_EGO])) {
+ _inventoryOffset += 2;
+ redrawV2Inventory();
+ }
+ return;
+ case 'i': // object
+ object = 0;
+ break;
+ case 'o':
+ object = 1;
+ break;
+ case 'k':
+ object = 2;
+ break;
+ case 'l':
+ object = 3;
+ break;
+ }
+
+ if (object != -1) {
+ object = findInventory(_scummVars[VAR_EGO], object + 1 + _inventoryOffset);
+
+ if (object > 0) {
+ if (_game.version == 0) {
+ _activeInventory = object;
+
+ } else {
+ runInputScript(kInventoryClickArea, object, 0);
+ }
+ }
+ return;
+ }
+
// Generic keyboard input
runInputScript(kKeyClickArea, _mouseAndKeyboardStat, 1);
} else if (_mouseAndKeyboardStat & MBS_MOUSE_MASK) {
diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h
index b467cc613e..a2a32d2e13 100644
--- a/engines/tinsel/detection_tables.h
+++ b/engines/tinsel/detection_tables.h
@@ -394,7 +394,7 @@ static const TinselGameDescription gameDescriptions[] = {
},
GID_DW1,
0,
- GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT,
+ GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT | GF_ALT_MIDI,
TINSEL_V1,
},
diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp
index cef7f0a781..ea34fa963a 100644
--- a/engines/tinsel/music.cpp
+++ b/engines/tinsel/music.cpp
@@ -70,42 +70,8 @@ static SOUND_BUFFER midiBuffer = { 0, 0 };
static SCNHANDLE currentMidi = 0;
static bool currentLoop = false;
-static const SCNHANDLE midiOffsetsGRAVersion[] = {
- 4, 4534, 14298, 18828, 23358, 38888, 54418, 57172, 59926, 62450,
- 62952, 67482, 72258, 74538, 79314, 87722, 103252, 115176, 127100, 127898,
- 130256, 132614, 134972, 137330, 139688, 150196, 152554, 154912, 167422, 174762,
- 182102, 194612, 198880, 199536, 206128, 206380, 216372, 226364, 235676, 244988,
- 249098, 249606, 251160, 252714, 263116, 268706, 274296, 283562, 297986, 304566,
- 312028, 313524, 319192, 324860, 331772, 336548, 336838, 339950, 343062, 346174,
- 349286, 356246, 359358, 360434, 361510, 369966, 374366, 382822, 384202, 394946,
- 396022, 396730, 399524, 401020, 403814, 418364, 419466, 420568, 425132, 433540,
- 434384, 441504, 452132, 462760, 472804, 486772, 491302, 497722, 501260, 507680,
- 509726, 521858, 524136, 525452, 533480, 538236, 549018, 559870, 564626, 565306,
- 566734, 567616, 570144, 574102, 574900, 582518, 586350, 600736, 604734, 613812,
- 616566, 619626, 623460, 627294, 631128, 634188, 648738, 663288, 667864, 681832,
- 682048, 683014, 688908, 689124, 698888, 708652, 718416, 728180, 737944, 747708,
- 752238, 765522, 766554, 772944, 774546, 776148, 776994, 781698, 786262, 789016,
- 794630, 796422, 798998
-};
-
-static const SCNHANDLE midiOffsetsSCNVersion[] = {
- 4, 4504, 11762, 21532, 26070, 28754, 33254, 40512, 56310, 72108,
- 74864, 77620, 80152, 80662, 85200, 89982, 92268, 97050, 105466, 121264,
- 133194, 145124, 145928, 148294, 150660, 153026, 155392, 157758, 168272, 170638,
- 173004, 185522, 192866, 200210, 212728, 217000, 217662, 224254, 224756, 234754,
- 244752, 245256, 245950, 255256, 264562, 268678, 269192, 270752, 272312, 282712,
- 288312, 293912, 303186, 317624, 324210, 331680, 333208, 338884, 344560, 351478,
- 356262, 356552, 359670, 362788, 365906, 369024, 376014, 379132, 380214, 381296,
- 389758, 394164, 402626, 404012, 414762, 415844, 416552, 419352, 420880, 423680,
- 438236, 439338, 440440, 445010, 453426, 454276, 461398, 472032, 482666, 492716,
- 506690, 511226, 517654, 521198, 527626, 529676, 541814, 546210, 547532, 555562,
- 560316, 571104, 581962, 586716, 587402, 588836, 589718, 592246, 596212, 597016,
- 604636, 608474, 622862, 626860, 635944, 638700, 641456, 645298, 649140, 652982,
- 655738, 670294, 684850, 689432, 703628, 703850, 704816, 706350, 706572, 716342,
- 726112, 735882, 745652, 755422, 765192, 774962, 784732, 794502, 804272, 814042,
- 823812, 832996, 846286, 847324, 853714, 855324, 856934, 857786, 862496, 867066,
- 869822, 875436, 877234, 879818
-};
+// We allocate 155 entries because that's the maximum, used in the SCN version
+static SCNHANDLE midiOffsets[155];
static const int enhancedAudioGRAVersion[] = {
1, 2, 1, 1, 3, 3, 4, 4, 5, 6, // 1-10
@@ -140,34 +106,41 @@ static const int enhancedAudioSCNVersion[] = {
77, 78, 79, 80, 4, 4, 82, 83, 77, 4, // 111-120
84, 85, 86, 3124, 88, 89, 90, 88, 2, 2, // 121-130
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 131-140
- 3141, 91, 92, 93, 94, 94, 95, 96, 52, 4, // 141-150
+ 3142, 91, 92, 93, 94, 94, 95, 96, 52, 4, // 141-150
97, 98, 99, 99 // 151-154
};
+// TODO. This mapping is wrong
+static const int enhancedAudioSCNVersionALT[] = {
+ 301, 302, 2, 1, 1, 301, 302, 3, 3, 4, // 1-10
+ 4, 5, 6, 1, 7, 8, 9, 10, 8, 11, // 11-20
+ 11, 12, 13, 13, 13, 13, 13, 14, 13, 13, // 21-30
+ 15, 16, 17, 15, 18, 19, 20, 338, 21, 21, // 31-40
+ 341, 342, 22, 22, 23, 24, 25, 26, 27, 28, // 41-50
+ 29, 30, 31, 32, 33, 34, 35, 35, 36, 37, // 51-60
+ 38, 39, 39, 39, 39, 40, 39, 41, 41, 42, // 61-70
+ 43, 42, 44, 45, 41, 46, 48, 47, 48, 49, // 71-80
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, // 81-90
+ 60, 61, 62, 63, 61, 64, 65, 66, 67, 68, // 91-100
+ 69, 70, 68, 71, 72, 73, 74, 75, 12, 76, // 101-110
+ 77, 78, 79, 80, 4, 4, 82, 83, 77, 4, // 111-120
+ 84, 85, 86, 3124, 88, 89, 90, 88, 2, 2, // 121-130
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 131-140
+ 3142, 91, 92, 93, 94, 94, 95, 96, 52, 4, // 141-150
+ 97, 98, 99 // 151-153
+};
+
int GetTrackNumber(SCNHANDLE hMidi) {
- if (_vm->getFeatures() & GF_SCNFILES) {
- for (int i = 0; i < ARRAYSIZE(midiOffsetsSCNVersion); i++) {
- if (midiOffsetsSCNVersion[i] == hMidi)
- return i;
- }
- } else {
- for (int i = 0; i < ARRAYSIZE(midiOffsetsGRAVersion); i++) {
- if (midiOffsetsGRAVersion[i] == hMidi)
- return i;
- }
- }
+ for (int i = 0; i < ARRAYSIZE(midiOffsets); i++)
+ if (midiOffsets[i] == hMidi)
+ return i;
return -1;
}
SCNHANDLE GetTrackOffset(int trackNumber) {
- if (_vm->getFeatures() & GF_SCNFILES) {
- assert(trackNumber < ARRAYSIZE(midiOffsetsSCNVersion));
- return midiOffsetsSCNVersion[trackNumber];
- } else {
- assert(trackNumber < ARRAYSIZE(midiOffsetsGRAVersion));
- return midiOffsetsGRAVersion[trackNumber];
- }
+ assert(trackNumber < ARRAYSIZE(midiOffsets));
+ return midiOffsets[trackNumber];
}
/**
@@ -199,7 +172,9 @@ bool PlayMidiSequence(uint32 dwFileOffset, bool bLoop) {
int trackNumber = GetTrackNumber(dwFileOffset);
int track = 0;
if (trackNumber >= 0) {
- if (_vm->getFeatures() & GF_SCNFILES)
+ if (_vm->getFeatures() & GF_ALT_MIDI)
+ track = enhancedAudioSCNVersionALT[trackNumber];
+ else if (_vm->getFeatures() & GF_SCNFILES)
track = enhancedAudioSCNVersion[trackNumber];
else
track = enhancedAudioGRAVersion[trackNumber];
@@ -384,6 +359,34 @@ void OpenMidiFiles() {
}
}
+ // Now scan through the contents of the MIDI file to find the offset
+ // of each individual track, in order to create a mapping from MIDI
+ // offset to track number, for the enhanced MIDI soundtrack.
+ // The first song is always at position 4. The subsequent ones are
+ // calculated dynamically.
+ uint32 curOffset = 4;
+ uint32 curTrack = 0;
+ uint32 songLength = 0;
+
+ // Init
+ for (int i = 0; i < ARRAYSIZE(midiOffsets); i++)
+ midiOffsets[i] = 0;
+
+ while (!midiStream.eos() && !midiStream.err()) {
+ if (curOffset + (4 * curTrack) >= (uint32)midiStream.size())
+ break;
+
+ assert(curTrack < ARRAYSIZE(midiOffsets));
+ midiOffsets[curTrack] = curOffset + (4 * curTrack);
+ //printf("%d: %d\n", curTrack, midiOffsets[curTrack]);
+
+ songLength = midiStream.readUint32LE();
+ curOffset += songLength;
+ midiStream.skip(songLength);
+
+ curTrack++;
+ }
+
midiStream.close();
}
@@ -979,29 +982,21 @@ void dumpMusic() {
int outFileSize = 0;
char buffer[20000];
- int total = (_vm->getFeatures() & GF_SCNFILES) ?
- ARRAYSIZE(midiOffsetsSCNVersion) :
- ARRAYSIZE(midiOffsetsGRAVersion);
+ const int total = 155; // maximum (SCN version)
for (int i = 0; i < total; i++) {
+ if (midiOffsets[i] == 0)
+ break;
+
sprintf(outName, "track%03d.xmi", i + 1);
outFile.open(outName);
- if (_vm->getFeatures() & GF_SCNFILES) {
- if (i < total - 1)
- outFileSize = midiOffsetsSCNVersion[i + 1] - midiOffsetsSCNVersion[i] - 4;
- else
- outFileSize = midiFile.size() - midiOffsetsSCNVersion[i] - 4;
-
- midiFile.seek(midiOffsetsSCNVersion[i] + 4, SEEK_SET);
- } else {
- if (i < total - 1)
- outFileSize = midiOffsetsGRAVersion[i + 1] - midiOffsetsGRAVersion[i] - 4;
- else
- outFileSize = midiFile.size() - midiOffsetsGRAVersion[i] - 4;
+ if (i < total - 1)
+ outFileSize = midiOffsets[i + 1] - midiOffsets[i] - 4;
+ else
+ outFileSize = midiFile.size() - midiOffsets[i] - 4;
- midiFile.seek(midiOffsetsGRAVersion[i] + 4, SEEK_SET);
- }
+ midiFile.seek(midiOffsets[i] + 4, SEEK_SET);
assert(outFileSize < 20000);
midiFile.read(buffer, outFileSize);
diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp
index 6c77a98dda..248c97e209 100644
--- a/engines/tinsel/tinsel.cpp
+++ b/engines/tinsel/tinsel.cpp
@@ -283,7 +283,7 @@ static void SingleLeftProcess(CORO_PARAM, const void *param) {
} while (DwGetCurrentTime() < _ctx->endTicks);
if (GetProvNotProcessed()) {
- Common::Point clickPos = *(Common::Point *)param;
+ const Common::Point clickPos = *(const Common::Point *)param;
PlayerEvent(PLR_WALKTO, clickPos);
}
@@ -834,8 +834,7 @@ TinselEngine::TinselEngine(OSystem *syst, const TinselGameDescription *gameDesc)
DebugMan.addDebugChannel(kTinselDebugMusic, "music", "Music debugging");
// Setup mixer
- _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
- _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
+ syncSoundSettings();
// Add DW2 subfolder to search path in case user is running directly from the CDs
const Common::FSNode gameDataDir(ConfMan.get("path"));
@@ -907,17 +906,6 @@ TinselEngine::~TinselEngine() {
MemoryDeinit();
}
-void TinselEngine::syncSoundSettings() {
- // Sync the engine with the config manager
- int soundVolumeMusic = ConfMan.getInt("music_volume");
- int soundVolumeSFX = ConfMan.getInt("sfx_volume");
- int soundVolumeSpeech = ConfMan.getInt("speech_volume");
-
- _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, soundVolumeMusic);
- _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, soundVolumeSFX);
- _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, soundVolumeSpeech);
-}
-
Common::String TinselEngine::getSavegameFilename(int16 saveNum) const {
char filename[256];
snprintf(filename, 256, "%s.%03d", getTargetName().c_str(), saveNum);
diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h
index df27a1e0e1..ed70979349 100644
--- a/engines/tinsel/tinsel.h
+++ b/engines/tinsel/tinsel.h
@@ -74,13 +74,14 @@ enum TinselGameFeatures {
GF_FLOPPY = 1 << 2,
GF_SCNFILES = 1 << 3,
GF_ENHANCED_AUDIO_SUPPORT = 1 << 4,
+ GF_ALT_MIDI = 1 << 5, // Alternate sequence in midi.dat file
// The GF_USE_?FLAGS values specify how many country flags are displayed
// in the subtitles options dialog.
// None of these defined -> 1 language, in ENGLISH.TXT
- GF_USE_3FLAGS = 1 << 5, // French, German, Spanish
- GF_USE_4FLAGS = 1 << 6, // French, German, Spanish, Italian
- GF_USE_5FLAGS = 1 << 7 // All 5 flags
+ GF_USE_3FLAGS = 1 << 6, // French, German, Spanish
+ GF_USE_4FLAGS = 1 << 7, // French, German, Spanish, Italian
+ GF_USE_5FLAGS = 1 << 8 // All 5 flags
};
/**
@@ -169,7 +170,6 @@ protected:
#if 0
bool canSaveGameStateCurrently();
#endif
- virtual void syncSoundSettings();
public:
TinselEngine(OSystem *syst, const TinselGameDescription *gameDesc);
diff --git a/graphics/VectorRendererSpec.cpp b/graphics/VectorRendererSpec.cpp
index 666a59b888..966c56cf4e 100644
--- a/graphics/VectorRendererSpec.cpp
+++ b/graphics/VectorRendererSpec.cpp
@@ -164,7 +164,7 @@ inline frac_t fp_sqroot(uint32 x) {
x--; px -= pitch; \
} \
a2 = (T >> 8); \
- a1 = ~a2; \
+ a1 = ~a2 >> 4; \
}
diff --git a/graphics/surface.cpp b/graphics/surface.cpp
index 353803c23a..137ef29a4e 100644
--- a/graphics/surface.cpp
+++ b/graphics/surface.cpp
@@ -143,8 +143,10 @@ void Surface::fillRect(Common::Rect r, uint32 color) {
lineLen *= 2;
if ((uint16)color != ((color & 0xff) | (color & 0xff) << 8))
useMemset = false;
+ } else if (bytesPerPixel == 4) {
+ useMemset = false;
} else if (bytesPerPixel != 1) {
- error("Surface::fillRect: bytesPerPixel must be 1 or 2");
+ error("Surface::fillRect: bytesPerPixel must be 1, 2 or 4");
}
if (useMemset) {
@@ -154,10 +156,18 @@ void Surface::fillRect(Common::Rect r, uint32 color) {
ptr += pitch;
}
} else {
- uint16 *ptr = (uint16 *)getBasePtr(r.left, r.top);
- while (height--) {
- Common::set_to(ptr, ptr + width, (uint16)color);
- ptr += pitch/2;
+ if (bytesPerPixel == 2) {
+ uint16 *ptr = (uint16 *)getBasePtr(r.left, r.top);
+ while (height--) {
+ Common::set_to(ptr, ptr + width, (uint16)color);
+ ptr += pitch/2;
+ }
+ } else {
+ uint32 *ptr = (uint32 *)getBasePtr(r.left, r.top);
+ while (height--) {
+ Common::set_to(ptr, ptr + width, color);
+ ptr += pitch / 4;
+ }
}
}
}
diff --git a/graphics/video/codecs/indeo3.cpp b/graphics/video/codecs/indeo3.cpp
index f59ae81e81..c99afbd0d3 100644
--- a/graphics/video/codecs/indeo3.cpp
+++ b/graphics/video/codecs/indeo3.cpp
@@ -69,27 +69,22 @@ PixelFormat Indeo3Decoder::getPixelFormat() const {
return _pixelFormat;
}
-bool Indeo3Decoder::isIndeo3(byte *data, uint32 dataLen) {
- // No data, no Indeo 3
- if (!data)
- return false;
-
+bool Indeo3Decoder::isIndeo3(Common::SeekableReadStream &stream) {
// Less than 16 bytes? This can't be right
- if (dataLen < 16)
+ if (stream.size() < 16)
return false;
+ uint32 id0 = stream.readUint32LE();
+ uint32 id1 = stream.readUint32LE();
+ uint32 id2 = stream.readUint32LE();
+ uint32 id3 = stream.readUint32LE();
+
// Unknown, but according to the docs, always 0
- if (READ_LE_UINT32(data + 4) != 0)
+ if (id1 != 0)
return false;
- uint32 id;
- id = READ_LE_UINT32(data ); // frame number
- id ^= READ_LE_UINT32(data + 4); // unknown
- id ^= READ_LE_UINT32(data + 8); // checksum
- id ^= READ_LE_UINT32(data + 12); // frame data length
-
// These 4 uint32s XOR'd need to spell "FRMH"
- if (id != MKID_BE('FRMH'))
+ if ((id0 ^ id1 ^ id2 ^ id3) != MKID_BE('FRMH'))
return false;
return true;
@@ -174,31 +169,23 @@ void Indeo3Decoder::allocFrames() {
}
Surface *Indeo3Decoder::decodeImage(Common::SeekableReadStream *stream) {
- uint32 dataLen = stream->size();
-
- byte *inData = new byte[dataLen];
-
- if (stream->read(inData, dataLen) != dataLen)
- return 0;
-
// Not Indeo 3? Fail
- if (!isIndeo3(inData, dataLen))
+ if (!isIndeo3(*stream))
return 0;
- uint32 frameDataLen = READ_LE_UINT32(inData + 12);
+ stream->seek(12);
+ uint32 frameDataLen = stream->readUint32LE();
// Less data than the frame should have? Fail
- if (dataLen < (frameDataLen - 16))
+ if (stream->size() < (int)(frameDataLen - 16))
return 0;
- Common::MemoryReadStream frame(inData, dataLen);
-
- frame.skip(16); // Header
- frame.skip(2); // Unknown
+ stream->seek(16); // Behind header
+ stream->skip(2); // Unknown
- uint16 flags1 = frame.readUint16LE();
- uint32 flags3 = frame.readUint32LE();
- uint8 flags2 = frame.readByte();
+ uint16 flags1 = stream->readUint16LE();
+ uint32 flags3 = stream->readUint32LE();
+ uint8 flags2 = stream->readByte();
// Finding the reference frame
if (flags1 & 0x200) {
@@ -212,47 +199,71 @@ Surface *Indeo3Decoder::decodeImage(Common::SeekableReadStream *stream) {
if (flags3 == 0x80)
return _surface;
- frame.skip(3);
+ stream->skip(3);
- uint16 fHeight = frame.readUint16LE();
- uint16 fWidth = frame.readUint16LE();
+ uint16 fHeight = stream->readUint16LE();
+ uint16 fWidth = stream->readUint16LE();
uint32 chromaHeight = ((fHeight >> 2) + 3) & 0x7FFC;
uint32 chromaWidth = ((fWidth >> 2) + 3) & 0x7FFC;
uint32 offs;
- uint32 offsY = frame.readUint32LE() + 16;
- uint32 offsU = frame.readUint32LE() + 16;
- uint32 offsV = frame.readUint32LE() + 16;
+ uint32 offsY = stream->readUint32LE() + 16;
+ uint32 offsU = stream->readUint32LE() + 16;
+ uint32 offsV = stream->readUint32LE() + 16;
+
+ stream->skip(4);
+
+ uint32 hPos = stream->pos();
- frame.skip(4);
+ if (offsY < hPos) {
+ warning("Indeo3Decoder::decodeImage: offsY < hPos");
+ return 0;
+ }
+ if (offsU < hPos) {
+ warning("Indeo3Decoder::decodeImage: offsY < hPos");
+ return 0;
+ }
+ if (offsV < hPos) {
+ warning("Indeo3Decoder::decodeImage: offsY < hPos");
+ return 0;
+ }
- uint32 hPos = frame.pos();
+ uint32 dataSize = stream->size() - hPos;
- byte *hdr_pos = inData + hPos;
+ byte *inData = new byte[dataSize];
+
+ if (stream->read(inData, dataSize) != dataSize) {
+ delete[] inData;
+ return 0;
+ }
+
+ byte *hdr_pos = inData;
byte *buf_pos;
// Luminance Y
- frame.seek(offsY);
- buf_pos = inData + offsY + 4;
- offs = frame.readUint32LE();
+ stream->seek(offsY);
+ buf_pos = inData + offsY + 4 - hPos;
+ offs = stream->readUint32LE();
decodeChunk(_cur_frame->Ybuf, _ref_frame->Ybuf, fWidth, fHeight,
buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN<int>(fWidth, 160));
// Chrominance U
- frame.seek(offsU);
- buf_pos = inData + offsU + 4;
- offs = frame.readUint32LE();
+ stream->seek(offsU);
+ buf_pos = inData + offsU + 4 - hPos;
+ offs = stream->readUint32LE();
decodeChunk(_cur_frame->Vbuf, _ref_frame->Vbuf, chromaWidth, chromaHeight,
buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN<int>(chromaWidth, 40));
// Chrominance V
- frame.seek(offsV);
- buf_pos = inData + offsV + 4;
- offs = frame.readUint32LE();
+ stream->seek(offsV);
+ buf_pos = inData + offsV + 4 - hPos;
+ offs = stream->readUint32LE();
decodeChunk(_cur_frame->Ubuf, _ref_frame->Ubuf, chromaWidth, chromaHeight,
buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN<int>(chromaWidth, 40));
+ delete[] inData;
+
// Blit the frame onto the surface
const byte *srcY = _cur_frame->Ybuf;
const byte *srcU = _cur_frame->Ubuf;
diff --git a/graphics/video/codecs/indeo3.h b/graphics/video/codecs/indeo3.h
index 8d50b74b1e..319a8e5d42 100644
--- a/graphics/video/codecs/indeo3.h
+++ b/graphics/video/codecs/indeo3.h
@@ -49,7 +49,7 @@ public:
Surface *decodeImage(Common::SeekableReadStream *stream);
PixelFormat getPixelFormat() const;
- static bool isIndeo3(byte *data, uint32 dataLen);
+ static bool isIndeo3(Common::SeekableReadStream &stream);
private:
Surface *_surface;
diff --git a/graphics/video/coktel_decoder.cpp b/graphics/video/coktel_decoder.cpp
index 0709288091..37aad8f2c8 100644
--- a/graphics/video/coktel_decoder.cpp
+++ b/graphics/video/coktel_decoder.cpp
@@ -1837,7 +1837,7 @@ bool VMDDecoder::readFiles() {
break;
if (_frames[i].parts[j].type == kPartTypeFile) {
- File file;;
+ File file;
file.offset = _stream->pos() + 20;
file.size = _frames[i].parts[j].size;
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index 3a50b2c69c..9cc98d83ce 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -337,6 +337,9 @@ const ThemeEngine::Renderer ThemeEngine::_rendererModes[] = {
{ _s("Antialiased Renderer (16bpp)"), "aa_16bpp", kGfxAntialias16bit }
#endif
};
+
+DECLARE_TRANSLATION_ADDITIONAL_CONTEXT("Standard Renderer (16bpp)", "lowres")
+DECLARE_TRANSLATION_ADDITIONAL_CONTEXT("Antialiased Renderer (16bpp)", "lowres")
const uint ThemeEngine::_rendererModesSize = ARRAYSIZE(ThemeEngine::_rendererModes);
@@ -575,15 +578,26 @@ bool ThemeEngine::addFont(TextData textId, const Common::String &file) {
if (!_texts[textId]->_fontPtr) {
// First try to load localized font
_texts[textId]->_fontPtr = loadFont(localized);
+
+ if (_texts[textId]->_fontPtr)
+ FontMan.assignFontToName(file, _texts[textId]->_fontPtr);
// Fallback to non-localized font
- if (!_texts[textId]->_fontPtr)
- _texts[textId]->_fontPtr = loadFont(file);
-
- if (!_texts[textId]->_fontPtr)
- error("Couldn't load font '%s'", file.c_str());
-
- FontMan.assignFontToName(file, _texts[textId]->_fontPtr);
+ else {
+ // Try built-in fonts
+ _texts[textId]->_fontPtr = FontMan.getFontByName(file);
+
+ // Try to load it
+ if (!_texts[textId]->_fontPtr) {
+ _texts[textId]->_fontPtr = loadFont(file);
+
+ if (!_texts[textId]->_fontPtr)
+ error("Couldn't load font '%s'", file.c_str());
+
+ FontMan.assignFontToName(file, _texts[textId]->_fontPtr);
+ }
+ warning("Failed to load localized font '%s'. Using non-localized font instead", file.c_str());
+ }
}
}
diff --git a/gui/launcher.cpp b/gui/launcher.cpp
index ae91ae3a57..0a3aa80f58 100644
--- a/gui/launcher.cpp
+++ b/gui/launcher.cpp
@@ -191,7 +191,10 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
}
// Platform popup
- _platformPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.PlatformPopupDesc", _("Platform:"), _("Platform the game was originally designed for"));
+ if (g_system->getOverlayWidth() > 320)
+ _platformPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.PlatformPopupDesc", _("Platform:"), _("Platform the game was originally designed for"));
+ else
+ _platformPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.PlatformPopupDesc", _c("Platform:", "lowres"), _("Platform the game was originally designed for"));
_platformPopUp = new PopUpWidget(tab, "GameOptions_Game.PlatformPopup", _("Platform the game was originally designed for"));
_platformPopUp->appendEntry(_("<default>"));
_platformPopUp->appendEntry("");
@@ -205,7 +208,10 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
//
_graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX"));
- _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", _("Override global graphic settings"), 0, kCmdGlobalGraphicsOverride);
+ if (g_system->getOverlayWidth() > 320)
+ _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", _("Override global graphic settings"), 0, kCmdGlobalGraphicsOverride);
+ else
+ _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", _c("Override global graphic settings", "lowres"), 0, kCmdGlobalGraphicsOverride);
addGraphicControls(tab, "GameOptions_Graphics.");
@@ -214,7 +220,10 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
//
tab->addTab(_("Audio"));
- _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", _("Override global audio settings"), 0, kCmdGlobalAudioOverride);
+ if (g_system->getOverlayWidth() > 320)
+ _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", _("Override global audio settings"), 0, kCmdGlobalAudioOverride);
+ else
+ _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", _c("Override global audio settings", "lowres"), 0, kCmdGlobalAudioOverride);
addAudioControls(tab, "GameOptions_Audio.");
addSubtitleControls(tab, "GameOptions_Audio.");
@@ -222,9 +231,15 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
//
// 4) The volume tab
//
- tab->addTab(_("Volume"));
+ if (g_system->getOverlayWidth() > 320)
+ tab->addTab(_("Volume"));
+ else
+ tab->addTab(_c("Volume", "lowres"));
- _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", _("Override global volume settings"), 0, kCmdGlobalVolumeOverride);
+ if (g_system->getOverlayWidth() > 320)
+ _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", _("Override global volume settings"), 0, kCmdGlobalVolumeOverride);
+ else
+ _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", _c("Override global volume settings", "lowres"), 0, kCmdGlobalVolumeOverride);
addVolumeControls(tab, "GameOptions_Volume.");
@@ -233,7 +248,10 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
//
tab->addTab(_("MIDI"));
- _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _("Override global MIDI settings"), 0, kCmdGlobalMIDIOverride);
+ if (g_system->getOverlayWidth() > 320)
+ _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _("Override global MIDI settings"), 0, kCmdGlobalMIDIOverride);
+ else
+ _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _c("Override global MIDI settings", "lowres"), 0, kCmdGlobalMIDIOverride);
if (_guioptions & Common::GUIO_NOMIDI)
_globalMIDIOverride->setEnabled(false);
@@ -245,7 +263,10 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
//
tab->addTab(_("MT-32"));
- _globalMT32Override = new CheckboxWidget(tab, "GameOptions_MT32.EnableTabCheckbox", _("Override global MT-32 settings"), 0, kCmdGlobalMT32Override);
+ if (g_system->getOverlayWidth() > 320)
+ _globalMT32Override = new CheckboxWidget(tab, "GameOptions_MT32.EnableTabCheckbox", _("Override global MT-32 settings"), 0, kCmdGlobalMT32Override);
+ else
+ _globalMT32Override = new CheckboxWidget(tab, "GameOptions_MT32.EnableTabCheckbox", _c("Override global MT-32 settings", "lowres"), 0, kCmdGlobalMT32Override);
//if (_guioptions & Common::GUIO_NOMIDI)
// _globalMT32Override->setEnabled(false);
@@ -269,7 +290,10 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
_extraPathWidget = new StaticTextWidget(tab, "GameOptions_Paths.ExtrapathText", extraPath, _("Specifies path to additional data used the game"));
// GUI: Button + Label for the save path
- new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), _("Specifies where your savegames are put"), kCmdSaveBrowser);
+ if (g_system->getOverlayWidth() > 320)
+ new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), _("Specifies where your savegames are put"), kCmdSaveBrowser);
+ else
+ new ButtonWidget(tab, "GameOptions_Paths.Savepath", _c("Save Path:", "lowres"), _("Specifies where your savegames are put"), kCmdSaveBrowser);
_savePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.SavepathText", savePath, _("Specifies where your savegames are put"));
// Activate the first tab
@@ -286,7 +310,7 @@ void EditGameDialog::open() {
String extraPath(ConfMan.get("extrapath", _domain));
if (extraPath.empty() || !ConfMan.hasKey("extrapath", _domain)) {
- _extraPathWidget->setLabel(_("None"));
+ _extraPathWidget->setLabel(_c("None", "path"));
}
String savePath(ConfMan.get("savepath", _domain));
@@ -366,7 +390,7 @@ void EditGameDialog::close() {
ConfMan.set("path", gamePath, _domain);
String extraPath(_extraPathWidget->getLabel());
- if (!extraPath.empty() && (extraPath != _("None")))
+ if (!extraPath.empty() && (extraPath != _c("None", "path")))
ConfMan.set("extrapath", extraPath, _domain);
String savePath(_savePathWidget->getLabel());
@@ -415,7 +439,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
Common::FSNode file(browser.getResult());
_soundFont->setLabel(file.getPath());
- if (!file.getPath().empty() && (file.getPath() != _("None")))
+ if (!file.getPath().empty() && (file.getPath() != _c("None", "path")))
_soundFontClearButton->setEnabled(true);
else
_soundFontClearButton->setEnabled(false);
@@ -527,12 +551,21 @@ LauncherDialog::LauncherDialog()
new ButtonWidget(this, "Launcher.LoadGameButton", _("~L~oad..."), _("Load savegame for selected game"), kLoadGameCmd);
// Above the lowest button rows: two more buttons (directly below the list box)
- _addButton =
- new ButtonWidget(this, "Launcher.AddGameButton", _("~A~dd Game..."), _("Hold Shift for Mass Add"), kAddGameCmd);
- _editButton =
- new ButtonWidget(this, "Launcher.EditGameButton", _("~E~dit Game..."), _("Change game options"), kEditGameCmd);
- _removeButton =
- new ButtonWidget(this, "Launcher.RemoveGameButton", _("~R~emove Game"), _("Remove game from the list. The game data files stay intact"), kRemoveGameCmd);
+ if (g_system->getOverlayWidth() > 320) {
+ _addButton =
+ new ButtonWidget(this, "Launcher.AddGameButton", _("~A~dd Game..."), _("Hold Shift for Mass Add"), kAddGameCmd);
+ _editButton =
+ new ButtonWidget(this, "Launcher.EditGameButton", _("~E~dit Game..."), _("Change game options"), kEditGameCmd);
+ _removeButton =
+ new ButtonWidget(this, "Launcher.RemoveGameButton", _("~R~emove Game"), _("Remove game from the list. The game data files stay intact"), kRemoveGameCmd);
+ } else {
+ _addButton =
+ new ButtonWidget(this, "Launcher.AddGameButton", _c("~A~dd Game...", "lowres"), _("Hold Shift for Mass Add"), kAddGameCmd);
+ _editButton =
+ new ButtonWidget(this, "Launcher.EditGameButton", _c("~E~dit Game...", "lowres"), _("Change game options"), kEditGameCmd);
+ _removeButton =
+ new ButtonWidget(this, "Launcher.RemoveGameButton", _c("~R~emove Game", "lowres"), _("Remove game from the list. The game data files stay intact"), kRemoveGameCmd);
+ }
// Search box
_searchDesc = 0;
@@ -1010,9 +1043,11 @@ void LauncherDialog::updateButtons() {
// Update the label of the "Add" button depending on whether shift is pressed or not
int modifiers = g_system->getEventManager()->getModifierState();
const bool massAdd = (modifiers & Common::KBD_SHIFT) != 0;
+ const bool lowRes = g_system->getOverlayWidth() <= 320;
+
const char *newAddButtonLabel = massAdd
- ? _("Mass Add...")
- : _("Add Game...");
+ ? (lowRes ? _c("Mass Add...", "lowres") : _("Mass Add..."))
+ : (lowRes ? _c("Add Game...", "lowres") : _("Add Game..."));
if (_addButton->getLabel() != newAddButtonLabel)
_addButton->setLabel(newAddButtonLabel);
diff --git a/gui/options.cpp b/gui/options.cpp
index d1901e9219..7c7093fa95 100644
--- a/gui/options.cpp
+++ b/gui/options.cpp
@@ -227,7 +227,7 @@ void OptionsDialog::open() {
Common::String soundFont(ConfMan.get("soundfont", _domain));
if (soundFont.empty() || !ConfMan.hasKey("soundfont", _domain)) {
- _soundFont->setLabel(_("None"));
+ _soundFont->setLabel(_c("None", "soundfont"));
_soundFontClearButton->setEnabled(false);
} else {
_soundFont->setLabel(soundFont);
@@ -396,7 +396,7 @@ void OptionsDialog::close() {
ConfMan.setInt("midi_gain", _midiGainSlider->getValue(), _domain);
Common::String soundFont(_soundFont->getLabel());
- if (!soundFont.empty() && (soundFont != _("None")))
+ if (!soundFont.empty() && (soundFont != _c("None", "soundfont")))
ConfMan.set("soundfont", soundFont, _domain);
else
ConfMan.removeKey("soundfont", _domain);
@@ -494,7 +494,7 @@ void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data
_subSpeedLabel->draw();
break;
case kClearSoundFontCmd:
- _soundFont->setLabel(_("None"));
+ _soundFont->setLabel(_c("None", "soundfont"));
_soundFontClearButton->setEnabled(false);
draw();
break;
@@ -552,7 +552,7 @@ void OptionsDialog::setMIDISettingsState(bool enabled) {
_soundFontButton->setEnabled(enabled);
_soundFont->setEnabled(enabled);
- if (enabled && !_soundFont->getLabel().empty() && (_soundFont->getLabel() != _("None")))
+ if (enabled && !_soundFont->getLabel().empty() && (_soundFont->getLabel() != _c("None", "soundfont")))
_soundFontClearButton->setEnabled(enabled);
else
_soundFontClearButton->setEnabled(false);
@@ -627,7 +627,10 @@ void OptionsDialog::setSubtitleSettingsState(bool enabled) {
void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &prefix) {
const OSystem::GraphicsMode *gm = g_system->getSupportedGraphicsModes();
-
+ Common::String context;
+ if (g_system->getOverlayWidth() <= 320)
+ context = "lowres";
+
// The GFX mode popup
_gfxPopUpDesc = new StaticTextWidget(boss, prefix + "grModePopupDesc", _("Graphics mode:"));
_gfxPopUp = new PopUpWidget(boss, prefix + "grModePopup");
@@ -635,7 +638,7 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr
_gfxPopUp->appendEntry(_("<default>"));
_gfxPopUp->appendEntry("");
while (gm->name) {
- _gfxPopUp->appendEntry(_(gm->description), gm->id);
+ _gfxPopUp->appendEntry(_c(gm->description, context), gm->id);
gm++;
}
@@ -646,7 +649,7 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr
_renderModePopUp->appendEntry("");
const Common::RenderModeDescription *rm = Common::g_renderModes;
for (; rm->code; ++rm) {
- _renderModePopUp->appendEntry(_(rm->description), rm->id);
+ _renderModePopUp->appendEntry(_c(rm->description, context), rm->id);
}
// Fullscreen checkbox
@@ -672,15 +675,16 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref
for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) {
const uint32 deviceGuiOption = MidiDriver::musicType2GUIO(d->getMusicType());
- if ((_domain == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) // global dialog - skip useless FM-Towns option there
- || (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) // No flags are specified
- || (_guioptions & deviceGuiOption) // flag is present
- // HACK/FIXME: For now we have to show GM devices, even when the game only has GUIO_MIDIMT32 set,
- // else we would not show for example external devices connected via ALSA, since they are always
- // marked as General MIDI device.
- || (deviceGuiOption == Common::GUIO_MIDIGM && (_guioptions & Common::GUIO_MIDIMT32))
- || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device
- _midiPopUp->appendEntry(d->getCompleteName(), d->getHandle());
+ if ((_domain == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS // global dialog - skip useless FM-Towns, C64, Amiga, AppleIIGS options there
+ && d->getMusicType() != MT_C64 && d->getMusicType() != MT_AMIGA && d->getMusicType() != MT_APPLEIIGS)
+ || (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) // No flags are specified
+ || (_guioptions & deviceGuiOption) // flag is present
+ // HACK/FIXME: For now we have to show GM devices, even when the game only has GUIO_MIDIMT32 set,
+ // else we would not show for example external devices connected via ALSA, since they are always
+ // marked as General MIDI device.
+ || (deviceGuiOption == Common::GUIO_MIDIGM && (_guioptions & Common::GUIO_MIDIMT32))
+ || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device
+ _midiPopUp->appendEntry(d->getCompleteName(), d->getHandle());
}
}
@@ -728,8 +732,11 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi
}
// SoundFont
- _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), _("SoundFont is supported by some audio cards, Fluidsynth and Timidity"), kChooseSoundFontCmd);
- _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", _("None"), _("SoundFont is supported by some audio cards, Fluidsynth and Timidity"));
+ if (g_system->getOverlayWidth() > 320)
+ _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), _("SoundFont is supported by some audio cards, Fluidsynth and Timidity"), kChooseSoundFontCmd);
+ else
+ _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _c("SoundFont:", "lowres"), _("SoundFont is supported by some audio cards, Fluidsynth and Timidity"), kChooseSoundFontCmd);
+ _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", _c("None", "soundfont"), _("SoundFont is supported by some audio cards, Fluidsynth and Timidity"));
_soundFontClearButton = new ButtonWidget(boss, prefix + "mcFontClearButton", "C", _("Clear value"), kClearSoundFontCmd);
// Multi midi setting
@@ -750,7 +757,10 @@ void OptionsDialog::addMT32Controls(GuiObject *boss, const Common::String &prefi
_mt32DevicePopUp = new PopUpWidget(boss, prefix + "auPrefMt32Popup");
// Native mt32 setting
- _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)"), _("Check if you want to use your real hardware Roland-compatible sound device connected to your computer"));
+ if (g_system->getOverlayWidth() > 320)
+ _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)"), _("Check if you want to use your real hardware Roland-compatible sound device connected to your computer"));
+ else
+ _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _c("True Roland MT-32 (disable GM emulation)", "lowres"), _("Check if you want to use your real hardware Roland-compatible sound device connected to your computer"));
// GS Extensions setting
_enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode"), _("Turns off General MIDI mapping for games with Roland MT-32 soundtrack"));
@@ -777,24 +787,29 @@ void OptionsDialog::addMT32Controls(GuiObject *boss, const Common::String &prefi
// make use of the widgets. The launcher range is 0-255. SCUMM's 0-9
void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &prefix, int maxSliderVal) {
- _subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", _("Text and Speech:"));
-
if (g_system->getOverlayWidth() > 320) {
+ _subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", _("Text and Speech:"));
+
_subToggleGroup = new RadiobuttonGroup(boss, kSubtitleToggle);
_subToggleSpeechOnly = new RadiobuttonWidget(boss, prefix + "subToggleSpeechOnly", _subToggleGroup, kSubtitlesSpeech, _("Speech"));
_subToggleSubOnly = new RadiobuttonWidget(boss, prefix + "subToggleSubOnly", _subToggleGroup, kSubtitlesSubs, _("Subtitles"));
_subToggleSubBoth = new RadiobuttonWidget(boss, prefix + "subToggleSubBoth", _subToggleGroup, kSubtitlesBoth, _("Both"));
+
+ _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _("Subtitle speed:"));
} else {
+ _subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", _c("Text and Speech:", "lowres"));
+
_subToggleGroup = new RadiobuttonGroup(boss, kSubtitleToggle);
_subToggleSpeechOnly = new RadiobuttonWidget(boss, prefix + "subToggleSpeechOnly", _subToggleGroup, kSubtitlesSpeech, _("Spch"), _("Speech"));
_subToggleSubOnly = new RadiobuttonWidget(boss, prefix + "subToggleSubOnly", _subToggleGroup, kSubtitlesSubs, _("Subs"), _("Subtitles"));
- _subToggleSubBoth = new RadiobuttonWidget(boss, prefix + "subToggleSubBoth", _subToggleGroup, kSubtitlesBoth, _("Both"), _("Show subtitles and play speech"));
+ _subToggleSubBoth = new RadiobuttonWidget(boss, prefix + "subToggleSubBoth", _subToggleGroup, kSubtitlesBoth, _c("Both", "lowres"), _("Show subtitles and play speech"));
+
+ _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _c("Subtitle speed:", "lowres"));
}
// Subtitle speed
- _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _("Subtitle speed:"));
_subSpeedSlider = new SliderWidget(boss, prefix + "subSubtitleSpeedSlider", 0, kSubtitleSpeedChanged);
_subSpeedLabel = new StaticTextWidget(boss, prefix + "subSubtitleSpeedLabel", "100%");
_subSpeedSlider->setMinValue(0); _subSpeedSlider->setMaxValue(maxSliderVal);
@@ -806,7 +821,10 @@ void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &p
void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &prefix) {
// Volume controllers
- _musicVolumeDesc = new StaticTextWidget(boss, prefix + "vcMusicText", _("Music volume:"));
+ if (g_system->getOverlayWidth() > 320)
+ _musicVolumeDesc = new StaticTextWidget(boss, prefix + "vcMusicText", _("Music volume:"));
+ else
+ _musicVolumeDesc = new StaticTextWidget(boss, prefix + "vcMusicText", _c("Music volume:", "lowres"));
_musicVolumeSlider = new SliderWidget(boss, prefix + "vcMusicSlider", 0, kMusicVolumeChanged);
_musicVolumeLabel = new StaticTextWidget(boss, prefix + "vcMusicLabel", "100%");
_musicVolumeSlider->setMinValue(0);
@@ -815,15 +833,20 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre
_muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", _("Mute All"), 0, kMuteAllChanged);
-
- _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", _("SFX volume:"), _("Special sound effects volume"));
+ if (g_system->getOverlayWidth() > 320)
+ _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", _("SFX volume:"), _("Special sound effects volume"));
+ else
+ _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", _c("SFX volume:", "lowres"), _("Special sound effects volume"));
_sfxVolumeSlider = new SliderWidget(boss, prefix + "vcSfxSlider", _("Special sound effects volume"), kSfxVolumeChanged);
_sfxVolumeLabel = new StaticTextWidget(boss, prefix + "vcSfxLabel", "100%");
_sfxVolumeSlider->setMinValue(0);
_sfxVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume);
_sfxVolumeLabel->setFlags(WIDGET_CLEARBG);
- _speechVolumeDesc = new StaticTextWidget(boss, prefix + "vcSpeechText" , _("Speech volume:"));
+ if (g_system->getOverlayWidth() > 320)
+ _speechVolumeDesc = new StaticTextWidget(boss, prefix + "vcSpeechText" , _("Speech volume:"));
+ else
+ _speechVolumeDesc = new StaticTextWidget(boss, prefix + "vcSpeechText" , _c("Speech volume:", "lowres"));
_speechVolumeSlider = new SliderWidget(boss, prefix + "vcSpeechSlider", 0, kSpeechVolumeChanged);
_speechVolumeLabel = new StaticTextWidget(boss, prefix + "vcSpeechLabel", "100%");
_speechVolumeSlider->setMinValue(0);
@@ -922,7 +945,10 @@ GlobalOptionsDialog::GlobalOptionsDialog()
addAudioControls(tab, "GlobalOptions_Audio.");
addSubtitleControls(tab, "GlobalOptions_Audio.");
- tab->addTab(_("Volume"));
+ if (g_system->getOverlayWidth() > 320)
+ tab->addTab(_("Volume"));
+ else
+ tab->addTab(_c("Volume", "lowres"));
addVolumeControls(tab, "GlobalOptions_Volume.");
// TODO: cd drive setting
@@ -953,21 +979,24 @@ GlobalOptionsDialog::GlobalOptionsDialog()
_savePath = new StaticTextWidget(tab, "GlobalOptions_Paths.SavePath", "/foo/bar", _("Specifies where your savegames are put"));
new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), 0, kChooseThemeDirCmd);
- _themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", _("None"));
+ _themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", _c("None", "path"));
new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), _("Specifies path to additional data used by all games or ScummVM"), kChooseExtraDirCmd);
- _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", _("None"), _("Specifies path to additional data used by all games or ScummVM"));
+ _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", _c("None", "path"), _("Specifies path to additional data used by all games or ScummVM"));
#ifdef DYNAMIC_MODULES
new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), 0, kChoosePluginsDirCmd);
- _pluginsPath = new StaticTextWidget(tab, "GlobalOptions_Paths.PluginsPath", _("None"));
+ _pluginsPath = new StaticTextWidget(tab, "GlobalOptions_Paths.PluginsPath", _c("None", "path"));
#endif
#endif
//
// 6) The miscellaneous tab
//
- tab->addTab(_("Misc"));
+ if (g_system->getOverlayWidth() > 320)
+ tab->addTab(_("Misc"));
+ else
+ tab->addTab(_c("Misc", "lowres"));
new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", _("Theme:"), 0, kChooseThemeCmd);
_curTheme = new StaticTextWidget(tab, "GlobalOptions_Misc.CurTheme", g_gui.theme()->getThemeName());
@@ -976,10 +1005,18 @@ GlobalOptionsDialog::GlobalOptionsDialog()
_rendererPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.RendererPopupDesc", _("GUI Renderer:"));
_rendererPopUp = new PopUpWidget(tab, "GlobalOptions_Misc.RendererPopup");
- for (uint i = 1; i < GUI::ThemeEngine::_rendererModesSize; ++i)
- _rendererPopUp->appendEntry(_(GUI::ThemeEngine::_rendererModes[i].name), GUI::ThemeEngine::_rendererModes[i].mode);
+ if (g_system->getOverlayWidth() > 320) {
+ for (uint i = 1; i < GUI::ThemeEngine::_rendererModesSize; ++i)
+ _rendererPopUp->appendEntry(_(GUI::ThemeEngine::_rendererModes[i].name), GUI::ThemeEngine::_rendererModes[i].mode);
+ } else {
+ for (uint i = 1; i < GUI::ThemeEngine::_rendererModesSize; ++i)
+ _rendererPopUp->appendEntry(_c(GUI::ThemeEngine::_rendererModes[i].name, "lowres"), GUI::ThemeEngine::_rendererModes[i].mode);
+ }
- _autosavePeriodPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopupDesc", _("Autosave:"));
+ if (g_system->getOverlayWidth() > 320)
+ _autosavePeriodPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopupDesc", _("Autosave:"));
+ else
+ _autosavePeriodPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopupDesc", _c("Autosave:", "lowres"));
_autosavePeriodPopUp = new PopUpWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopup");
for (int i = 0; savePeriodLabels[i]; i++) {
@@ -999,7 +1036,7 @@ GlobalOptionsDialog::GlobalOptionsDialog()
#ifdef USE_DETECTLANG
_guiLanguagePopUp->appendEntry(_("<default>"), Common::kTranslationAutodetectId);
#endif // USE_DETECTLANG
- _guiLanguagePopUp->appendEntry(_("English"), Common::kTranslationBuiltinId);
+ _guiLanguagePopUp->appendEntry("English", Common::kTranslationBuiltinId);
_guiLanguagePopUp->appendEntry("", 0);
Common::TLangArray languages = TransMan.getSupportedLanguageNames();
Common::TLangArray::iterator lang = languages.begin();
@@ -1050,19 +1087,19 @@ void GlobalOptionsDialog::open() {
Common::String extraPath(ConfMan.get("extrapath", _domain));
if (savePath.empty() || !ConfMan.hasKey("savepath", _domain)) {
- _savePath->setLabel(_("None"));
+ _savePath->setLabel(_c("None", "path"));
} else {
_savePath->setLabel(savePath);
}
if (themePath.empty() || !ConfMan.hasKey("themepath", _domain)) {
- _themePath->setLabel(_("None"));
+ _themePath->setLabel(_c("None", "path"));
} else {
_themePath->setLabel(themePath);
}
if (extraPath.empty() || !ConfMan.hasKey("extrapath", _domain)) {
- _extraPath->setLabel(_("None"));
+ _extraPath->setLabel(_c("None", "path"));
} else {
_extraPath->setLabel(extraPath);
}
@@ -1070,7 +1107,7 @@ void GlobalOptionsDialog::open() {
#ifdef DYNAMIC_MODULES
Common::String pluginsPath(ConfMan.get("pluginspath", _domain));
if (pluginsPath.empty() || !ConfMan.hasKey("pluginspath", _domain)) {
- _pluginsPath->setLabel(_("None"));
+ _pluginsPath->setLabel(_c("None", "path"));
} else {
_pluginsPath->setLabel(pluginsPath);
}
@@ -1094,24 +1131,24 @@ void GlobalOptionsDialog::open() {
void GlobalOptionsDialog::close() {
if (getResult()) {
Common::String savePath(_savePath->getLabel());
- if (!savePath.empty() && (savePath != _("None")))
+ if (!savePath.empty() && (savePath != _c("None", "path")))
ConfMan.set("savepath", savePath, _domain);
Common::String themePath(_themePath->getLabel());
- if (!themePath.empty() && (themePath != _("None")))
+ if (!themePath.empty() && (themePath != _c("None", "path")))
ConfMan.set("themepath", themePath, _domain);
else
ConfMan.removeKey("themepath", _domain);
Common::String extraPath(_extraPath->getLabel());
- if (!extraPath.empty() && (extraPath != _("None")))
+ if (!extraPath.empty() && (extraPath != _c("None", "path")))
ConfMan.set("extrapath", extraPath, _domain);
else
ConfMan.removeKey("extrapath", _domain);
#ifdef DYNAMIC_MODULES
Common::String pluginsPath(_pluginsPath->getLabel());
- if (!pluginsPath.empty() && (pluginsPath != _("None")))
+ if (!pluginsPath.empty() && (pluginsPath != _c("None", "path")))
ConfMan.set("pluginspath", pluginsPath, _domain);
else
ConfMan.removeKey("pluginspath", _domain);
@@ -1210,7 +1247,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3
Common::FSNode file(browser.getResult());
_soundFont->setLabel(file.getPath());
- if (!file.getPath().empty() && (file.getPath() != _("None")))
+ if (!file.getPath().empty() && (file.getPath() != _c("None", "path")))
_soundFontClearButton->setEnabled(true);
else
_soundFontClearButton->setEnabled(false);
diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat
new file mode 100644
index 0000000000..e00de3b9f3
--- /dev/null
+++ b/gui/themes/translations.dat
Binary files differ
diff --git a/po/POTFILES b/po/POTFILES
index 28ca60d31b..59af170c2f 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -26,7 +26,10 @@ sound/fmopl.cpp
sound/musicplugin.cpp
sound/null.h
sound/null.cpp
+sound/mods/paula.cpp
sound/softsynth/adlib.cpp
+sound/softsynth/appleiigs.cpp
+sound/softsynth/sid.cpp
sound/softsynth/mt32.cpp
sound/softsynth/pcspk.cpp
sound/softsynth/ym2612.cpp
diff --git a/po/ca_ES.po b/po/ca_ES.po
index 6647dcc837..695bb888ae 100644
--- a/po/ca_ES.po
+++ b/po/ca_ES.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.2.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2010-07-30 22:14+0100\n"
+"POT-Creation-Date: 2010-09-01 18:36+0300\n"
"PO-Revision-Date: 2010-06-26 16:45+0100\n"
"Last-Translator: Jordi Vilalta Prat <jvprat@gmail.com>\n"
"Language-Team: Catalan <scummvm-devel@lists.sf.net>\n"
@@ -38,7 +38,7 @@ msgid "Go to previous directory level"
msgstr "Torna al nivell de directoris anterior"
#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46
-#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029
+#: gui/launcher.cpp:304 gui/massadd.cpp:95 gui/options.cpp:1066
#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56
#: backends/platform/wii/options.cpp:48
msgid "Cancel"
@@ -68,8 +68,8 @@ msgstr "Remapeja les tecles"
msgid "Map"
msgstr "Mapeja"
-#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893
-#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030
+#: gui/KeysDialog.cpp:45 gui/launcher.cpp:305 gui/launcher.cpp:926
+#: gui/launcher.cpp:930 gui/massadd.cpp:92 gui/options.cpp:1067
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "OK"
@@ -137,215 +137,281 @@ msgstr ""
"Idioma del joc. Això no convertirà la vostra versió Espanyola del joc a "
"Anglès"
-#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80
-#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000
+#: gui/launcher.cpp:185 gui/launcher.cpp:199 gui/options.cpp:80
+#: gui/options.cpp:638 gui/options.cpp:648 gui/options.cpp:1037
#: sound/null.cpp:42
msgid "<default>"
msgstr "<per defecte>"
-#: gui/launcher.cpp:194
+#: gui/launcher.cpp:195
msgid "Platform:"
msgstr "Plataforma:"
-#: gui/launcher.cpp:194 gui/launcher.cpp:195
+#: gui/launcher.cpp:195 gui/launcher.cpp:197 gui/launcher.cpp:198
msgid "Platform the game was originally designed for"
msgstr "Plataforma per la que el joc es va dissenyar originalment"
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:197
+#, fuzzy
+msgctxt "lowres"
+msgid "Platform:"
+msgstr "Plataforma:"
+
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "Graphics"
msgstr "Gràfics"
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:208
+#: gui/launcher.cpp:212
msgid "Override global graphic settings"
msgstr "Fer canvis sobre les opcions globals de gràfics"
-#: gui/launcher.cpp:215 gui/options.cpp:921
+#: gui/launcher.cpp:214
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global graphic settings"
+msgstr "Fer canvis sobre les opcions globals de gràfics"
+
+#: gui/launcher.cpp:221 gui/options.cpp:944
msgid "Audio"
msgstr "Àudio"
-#: gui/launcher.cpp:217
+#: gui/launcher.cpp:224
msgid "Override global audio settings"
msgstr "Fer canvis sobre les opcions globals d'àudio"
-#: gui/launcher.cpp:225 gui/options.cpp:925
+#: gui/launcher.cpp:226
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global audio settings"
+msgstr "Fer canvis sobre les opcions globals d'àudio"
+
+#: gui/launcher.cpp:235 gui/options.cpp:949
+msgid "Volume"
+msgstr "Volum"
+
+#: gui/launcher.cpp:237 gui/options.cpp:951
+#, fuzzy
+msgctxt "lowres"
msgid "Volume"
msgstr "Volum"
-#: gui/launcher.cpp:227
+#: gui/launcher.cpp:240
msgid "Override global volume settings"
msgstr "Fer canvis sobre les opcions globals de volum"
-#: gui/launcher.cpp:234 gui/options.cpp:933
+#: gui/launcher.cpp:242
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global volume settings"
+msgstr "Fer canvis sobre les opcions globals de volum"
+
+#: gui/launcher.cpp:249 gui/options.cpp:959
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:236
+#: gui/launcher.cpp:252
msgid "Override global MIDI settings"
msgstr "Fer canvis sobre les opcions globals de MIDI"
-#: gui/launcher.cpp:246 gui/options.cpp:939
+#: gui/launcher.cpp:254
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global MIDI settings"
+msgstr "Fer canvis sobre les opcions globals de MIDI"
+
+#: gui/launcher.cpp:264 gui/options.cpp:965
msgid "MT-32"
msgstr ""
-#: gui/launcher.cpp:248
+#: gui/launcher.cpp:267
+#, fuzzy
+msgid "Override global MT-32 settings"
+msgstr "Fer canvis sobre les opcions globals de MIDI"
+
+#: gui/launcher.cpp:269
#, fuzzy
+msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Fer canvis sobre les opcions globals de MIDI"
-#: gui/launcher.cpp:258 gui/options.cpp:945
+#: gui/launcher.cpp:279 gui/options.cpp:971
msgid "Paths"
msgstr "Camins"
-#: gui/launcher.cpp:264
+#: gui/launcher.cpp:285
msgid "Game Path:"
msgstr "Camí del Joc:"
-#: gui/launcher.cpp:268 gui/options.cpp:958
+#: gui/launcher.cpp:289 gui/options.cpp:984
msgid "Extra Path:"
msgstr "Camí Extra:"
-#: gui/launcher.cpp:268 gui/launcher.cpp:269
+#: gui/launcher.cpp:289 gui/launcher.cpp:290
msgid "Specifies path to additional data used the game"
msgstr "Especifica el camí de dades addicionals utilitzades pel joc"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:294
msgid "Save Path:"
msgstr "Camí de les Partides:"
-#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952
-#: gui/options.cpp:953
+#: gui/launcher.cpp:294 gui/launcher.cpp:296 gui/launcher.cpp:297
+#: gui/options.cpp:978 gui/options.cpp:979
msgid "Specifies where your savegames are put"
msgstr "Especifica on es desaran les partides"
-#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418
-#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
-#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956
-#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053
-#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073
-#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107
-#: gui/options.cpp:1114 gui/options.cpp:1213
+#: gui/launcher.cpp:296
+#, fuzzy
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr "Camí de les Partides:"
+
+#: gui/launcher.cpp:313 gui/launcher.cpp:393 gui/launcher.cpp:442
+#: gui/options.cpp:982 gui/options.cpp:985 gui/options.cpp:989
+#: gui/options.cpp:1090 gui/options.cpp:1096 gui/options.cpp:1102
+#: gui/options.cpp:1110 gui/options.cpp:1134 gui/options.cpp:1138
+#: gui/options.cpp:1144 gui/options.cpp:1151 gui/options.cpp:1250
+#, fuzzy
+msgctxt "path"
msgid "None"
msgstr "Cap"
-#: gui/launcher.cpp:294 gui/launcher.cpp:373
+#: gui/launcher.cpp:318 gui/launcher.cpp:397
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Per defecte"
-#: gui/launcher.cpp:411 gui/options.cpp:1207
+#: gui/launcher.cpp:435 gui/options.cpp:1244
msgid "Select SoundFont"
msgstr "Seleccioneu el fitxer SoundFont"
-#: gui/launcher.cpp:430 gui/launcher.cpp:568
+#: gui/launcher.cpp:454 gui/launcher.cpp:601
msgid "Select directory with game data"
msgstr "Seleccioneu el directori amb les dades del joc"
-#: gui/launcher.cpp:448
+#: gui/launcher.cpp:472
msgid "Select additional game directory"
msgstr "Seleccioneu el directori addicional del joc"
-#: gui/launcher.cpp:460
+#: gui/launcher.cpp:484
msgid "Select directory for saved games"
msgstr "Seleccioneu el directori de les partides desades"
-#: gui/launcher.cpp:479
+#: gui/launcher.cpp:503
msgid "This game ID is already taken. Please choose another one."
msgstr ""
"Aquest identificador de joc ja està usat. Si us plau, trieu-ne un altre."
-#: gui/launcher.cpp:520 engines/dialogs.cpp:113
+#: gui/launcher.cpp:544 engines/dialogs.cpp:116
msgid "~Q~uit"
msgstr "~T~anca"
-#: gui/launcher.cpp:520
+#: gui/launcher.cpp:544
msgid "Quit ScummVM"
msgstr "Surt de ScummVM"
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "A~b~out..."
msgstr "~Q~uant a..."
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "About ScummVM"
msgstr "Quant a ScummVM"
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "~O~ptions..."
msgstr "~O~pcions..."
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "Change global ScummVM options"
msgstr "Canvia les opcions globals de ScummVM"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "~S~tart"
msgstr "~I~nicia"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "Start selected game"
msgstr "Iniciant el joc seleccionat"
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "~L~oad..."
msgstr "~C~arrega..."
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "Load savegame for selected game"
msgstr "Carrega una partida pel joc seleccionat"
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556
msgid "~A~dd Game..."
msgstr "~A~fegeix Joc..."
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556 gui/launcher.cpp:563
msgid "Hold Shift for Mass Add"
msgstr "Mantingueu premut Shift per a l'Addició Massiva"
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558
msgid "~E~dit Game..."
msgstr "~E~dita Joc..."
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558 gui/launcher.cpp:565
msgid "Change game options"
msgstr "Canvia les opcions del joc"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560
msgid "~R~emove Game"
msgstr "~S~uprimeix Joc"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560 gui/launcher.cpp:567
msgid "Remove game from the list. The game data files stay intact"
msgstr ""
"Elimina un joc de la llista. Els fitxers de dades del joc es mantenen "
"intactes"
-#: gui/launcher.cpp:542
+#: gui/launcher.cpp:563
+#, fuzzy
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr "~A~fegeix Joc..."
+
+#: gui/launcher.cpp:565
+#, fuzzy
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr "~E~dita Joc..."
+
+#: gui/launcher.cpp:567
+#, fuzzy
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr "~S~uprimeix Joc"
+
+#: gui/launcher.cpp:575
msgid "Search in game list"
msgstr "Cerca a la llista de jocs"
-#: gui/launcher.cpp:546 gui/launcher.cpp:1057
+#: gui/launcher.cpp:579 gui/launcher.cpp:1092
msgid "Search:"
msgstr "Cerca:"
-#: gui/launcher.cpp:549 gui/options.cpp:733
+#: gui/launcher.cpp:582 gui/options.cpp:740
msgid "Clear value"
msgstr "Neteja el valor"
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
msgid "Load game:"
msgstr "Carrega partida:"
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:225
msgid "Load"
msgstr "Carrega"
-#: gui/launcher.cpp:680
+#: gui/launcher.cpp:713
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -353,7 +419,7 @@ msgstr ""
"Esteu segur que voleu executar el detector massiu de jocs? Això pot afegir "
"una gran quantitat de jocs."
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -361,7 +427,7 @@ msgstr ""
msgid "Yes"
msgstr "Sí"
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -369,36 +435,48 @@ msgstr "Sí"
msgid "No"
msgstr "No"
-#: gui/launcher.cpp:728
+#: gui/launcher.cpp:761
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM no ha pogut obrir el directori especificat!"
-#: gui/launcher.cpp:740
+#: gui/launcher.cpp:773
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM no ha pogut trobar cap joc al directori especificat!"
-#: gui/launcher.cpp:754
+#: gui/launcher.cpp:787
msgid "Pick the game:"
msgstr "Seleccioneu el joc:"
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:863
msgid "Do you really want to remove this game configuration?"
msgstr "Realment voleu suprimir la configuració d'aquest joc?"
-#: gui/launcher.cpp:893
+#: gui/launcher.cpp:926
msgid "This game does not support loading games from the launcher."
msgstr "Aquest joc no suporta la càrrega de partides des del llançador."
-#: gui/launcher.cpp:897
+#: gui/launcher.cpp:930
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM no ha pogut trobar cap motor capaç d'executar el joc seleccionat!"
-#: gui/launcher.cpp:1009
+#: gui/launcher.cpp:1044
+#, fuzzy
+msgctxt "lowres"
msgid "Mass Add..."
msgstr "Addició Massiva..."
-#: gui/launcher.cpp:1010
+#: gui/launcher.cpp:1044
+msgid "Mass Add..."
+msgstr "Addició Massiva..."
+
+#: gui/launcher.cpp:1045
+#, fuzzy
+msgctxt "lowres"
+msgid "Add Game..."
+msgstr "Afegeix Joc..."
+
+#: gui/launcher.cpp:1045
msgid "Add Game..."
msgstr "Afegeix Joc..."
@@ -465,60 +543,67 @@ msgstr "44 kHz"
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:632
+#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
+#: gui/options.cpp:555 gui/options.cpp:739
+#, fuzzy
+msgctxt "soundfont"
+msgid "None"
+msgstr "Cap"
+
+#: gui/options.cpp:635
msgid "Graphics mode:"
msgstr "Mode gràfic:"
-#: gui/options.cpp:643
+#: gui/options.cpp:646
msgid "Render mode:"
msgstr "Mode de pintat:"
-#: gui/options.cpp:643 gui/options.cpp:644
+#: gui/options.cpp:646 gui/options.cpp:647
msgid "Special dithering modes supported by some games"
msgstr "Modes de dispersió especials suportats per alguns jocs"
-#: gui/options.cpp:653
+#: gui/options.cpp:656
msgid "Fullscreen mode"
msgstr "Mode pantalla completa"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Aspect ratio correction"
msgstr "Correcció del rati d'aspecte"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Correct aspect ratio for 320x200 games"
msgstr "Corregeix la relació d'aspecte per jocs de 320x200"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Preferred Device:"
msgstr "Dispositiu Preferit:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
#, fuzzy
msgid "Music Device:"
msgstr "Dispositiu GM:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Especifica el dispositiu de so o l'emulador de tarja de so preferit"
-#: gui/options.cpp:663 gui/options.cpp:664
+#: gui/options.cpp:666 gui/options.cpp:667
msgid "Specifies output sound device or sound card emulator"
msgstr "Especifica el dispositiu de so o l'emulador de tarja de so de sortida"
-#: gui/options.cpp:688
+#: gui/options.cpp:692
msgid "AdLib emulator:"
msgstr "Emulador d'AdLib:"
-#: gui/options.cpp:688 gui/options.cpp:689
+#: gui/options.cpp:692 gui/options.cpp:693
msgid "AdLib is used for music in many games"
msgstr "AdLib s'utilitza per la música de molts jocs"
-#: gui/options.cpp:699
+#: gui/options.cpp:703
msgid "Output rate:"
msgstr "Freqüència de sortida:"
-#: gui/options.cpp:699 gui/options.cpp:700
+#: gui/options.cpp:703 gui/options.cpp:704
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -526,51 +611,57 @@ msgstr ""
"Valors més alts especifiquen millor qualitat de so però pot ser que la "
"vostra tarja de so no ho suporti"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "GM Device:"
msgstr "Dispositiu GM:"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "Specifies default sound device for General MIDI output"
msgstr ""
"Especifica el dispositiu de so per defecte per a la sortida General MIDI"
-#: gui/options.cpp:731
+#: gui/options.cpp:736
msgid "SoundFont:"
msgstr "Fitxer SoundFont:"
-#: gui/options.cpp:731 gui/options.cpp:732
+#: gui/options.cpp:736 gui/options.cpp:738 gui/options.cpp:739
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont"
-#: gui/options.cpp:736
+#: gui/options.cpp:738
+#, fuzzy
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr "Fitxer SoundFont:"
+
+#: gui/options.cpp:743
msgid "Mixed AdLib/MIDI mode"
msgstr "Mode combinat AdLib/MIDI"
-#: gui/options.cpp:736
+#: gui/options.cpp:743
msgid "Use both MIDI and AdLib sound generation"
msgstr "Utilitza MIDI i la generació de so AdLib alhora"
-#: gui/options.cpp:739
+#: gui/options.cpp:746
msgid "MIDI gain:"
msgstr "Guany MIDI:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
#, fuzzy
msgid "MT-32 Device:"
msgstr "Dispositiu MT32:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/"
"LAPC1/CM32l/CM64"
-#: gui/options.cpp:753
+#: gui/options.cpp:761
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 real (desactiva l'emulació GM)"
-#: gui/options.cpp:753
+#: gui/options.cpp:761 gui/options.cpp:763
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -578,141 +669,191 @@ msgstr ""
"Marqueu si voleu utilitzar el vostre dispositiu hardware real de so "
"compatible amb Roland connectat al vostre ordinador"
-#: gui/options.cpp:756
+#: gui/options.cpp:763
+#, fuzzy
+msgctxt "lowres"
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr "Roland MT-32 real (desactiva l'emulació GM)"
+
+#: gui/options.cpp:766
msgid "Enable Roland GS Mode"
msgstr "Activa el Mode Roland GS"
-#: gui/options.cpp:756
+#: gui/options.cpp:766
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
msgstr ""
"Desactiva la conversió General MIDI pels jocs que tenen banda sonora per a "
"Roland MT-32"
-#: gui/options.cpp:780
+#: gui/options.cpp:791
msgid "Text and Speech:"
msgstr "Text i Veus:"
-#: gui/options.cpp:785 gui/options.cpp:791
+#: gui/options.cpp:795 gui/options.cpp:805
msgid "Speech"
msgstr "Veus"
-#: gui/options.cpp:786 gui/options.cpp:792
+#: gui/options.cpp:796 gui/options.cpp:806
msgid "Subtitles"
msgstr "Subtítols"
-#: gui/options.cpp:787 gui/options.cpp:793
+#: gui/options.cpp:797
msgid "Both"
msgstr "Ambdós"
-#: gui/options.cpp:791
+#: gui/options.cpp:799
+msgid "Subtitle speed:"
+msgstr "Velocitat dels subtítols:"
+
+#: gui/options.cpp:801
+#, fuzzy
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr "Text i Veus:"
+
+#: gui/options.cpp:805
msgid "Spch"
msgstr "Veus"
-#: gui/options.cpp:792
+#: gui/options.cpp:806
msgid "Subs"
msgstr "Subt"
-#: gui/options.cpp:793
+#: gui/options.cpp:807
+#, fuzzy
+msgctxt "lowres"
+msgid "Both"
+msgstr "Ambdós"
+
+#: gui/options.cpp:807
msgid "Show subtitles and play speech"
msgstr "Mostra els subtítols i reprodueix la veu"
-#: gui/options.cpp:797
+#: gui/options.cpp:809
+#, fuzzy
+msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Velocitat dels subtítols:"
-#: gui/options.cpp:809
+#: gui/options.cpp:825
+msgid "Music volume:"
+msgstr "Volum de la música:"
+
+#: gui/options.cpp:827
+#, fuzzy
+msgctxt "lowres"
msgid "Music volume:"
msgstr "Volum de la música:"
-#: gui/options.cpp:816
+#: gui/options.cpp:834
msgid "Mute All"
msgstr "Silenciar tot"
-#: gui/options.cpp:819
+#: gui/options.cpp:837
msgid "SFX volume:"
msgstr "Volum dels efectes:"
-#: gui/options.cpp:819 gui/options.cpp:820
+#: gui/options.cpp:837 gui/options.cpp:839 gui/options.cpp:840
msgid "Special sound effects volume"
msgstr "Volum dels sons d'efectes especials"
-#: gui/options.cpp:826
+#: gui/options.cpp:839
+#, fuzzy
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr "Volum dels efectes:"
+
+#: gui/options.cpp:847
+msgid "Speech volume:"
+msgstr "Volum de la veu:"
+
+#: gui/options.cpp:849
+#, fuzzy
+msgctxt "lowres"
msgid "Speech volume:"
msgstr "Volum de la veu:"
-#: gui/options.cpp:952
+#: gui/options.cpp:978
msgid "Save Path: "
msgstr "Camí de les Partides: "
-#: gui/options.cpp:955
+#: gui/options.cpp:981
msgid "Theme Path:"
msgstr "Camí dels Temes:"
-#: gui/options.cpp:958 gui/options.cpp:959
+#: gui/options.cpp:984 gui/options.cpp:985
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Especifica el camí de les dades addicionals utilitzades per tots els jocs o "
"pel ScummVM"
-#: gui/options.cpp:962
+#: gui/options.cpp:988
msgid "Plugins Path:"
msgstr "Camí dels connectors:"
-#: gui/options.cpp:970
+#: gui/options.cpp:997
+msgid "Misc"
+msgstr "Misc"
+
+#: gui/options.cpp:999
+#, fuzzy
+msgctxt "lowres"
msgid "Misc"
msgstr "Misc"
-#: gui/options.cpp:972
+#: gui/options.cpp:1001
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:976
+#: gui/options.cpp:1005
msgid "GUI Renderer:"
msgstr "Mode de pintat de la interfície d'usuari:"
-#: gui/options.cpp:982
+#: gui/options.cpp:1017
msgid "Autosave:"
msgstr "Desat automàtic:"
-#: gui/options.cpp:990
+#: gui/options.cpp:1019
+#, fuzzy
+msgctxt "lowres"
+msgid "Autosave:"
+msgstr "Desat automàtic:"
+
+#: gui/options.cpp:1027
msgid "Keys"
msgstr "Tecles"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "GUI Language:"
msgstr "Idioma de la interfície d'usuari:"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "Language of ScummVM GUI"
msgstr "Idioma de la interfície d'usuari de ScummVM"
-#: gui/options.cpp:1002
-msgid "English"
-msgstr "Anglès"
-
-#: gui/options.cpp:1146
+#: gui/options.cpp:1183
msgid "You have to restart ScummVM to take the effect."
msgstr "Heu de reiniciar ScummVM perquè tots els canvis tingui efecte."
-#: gui/options.cpp:1159
+#: gui/options.cpp:1196
msgid "Select directory for savegames"
msgstr "Seleccioneu el directori de les partides desades"
-#: gui/options.cpp:1166
+#: gui/options.cpp:1203
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
"No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un "
"altre."
-#: gui/options.cpp:1175
+#: gui/options.cpp:1212
msgid "Select directory for GUI themes"
msgstr "Seleccioneu el directori dels temes de la Interfície d'Usuari"
-#: gui/options.cpp:1185
+#: gui/options.cpp:1222
msgid "Select directory for extra files"
msgstr "Seleccioneu el directori dels fitxers extra"
-#: gui/options.cpp:1196
+#: gui/options.cpp:1233
msgid "Select directory for plugins"
msgstr "Seleccioneu el directori dels connectors"
@@ -768,6 +909,18 @@ msgstr "Pintat estàndard (16bpp)"
msgid "Antialiased Renderer (16bpp)"
msgstr "Pintat amb antialias (16bpp)"
+#: gui/ThemeEngine.cpp:341
+#, fuzzy
+msgctxt "lowres"
+msgid "Standard Renderer (16bpp)"
+msgstr "Pintat estàndard (16bpp)"
+
+#: gui/ThemeEngine.cpp:342
+#, fuzzy
+msgctxt "lowres"
+msgid "Antialiased Renderer (16bpp)"
+msgstr "Pintat amb antialias (16bpp)"
+
#: base/main.cpp:205
#, c-format
msgid "Engine does not support debug level '%s'"
@@ -860,6 +1013,18 @@ msgstr "Hercules Verd"
msgid "Hercules Amber"
msgstr "Hercules Àmbar"
+#: common/util.cpp:262
+#, fuzzy
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr "Hercules Verd"
+
+#: common/util.cpp:263
+#, fuzzy
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr "Hercules Àmbar"
+
#: engines/dialogs.cpp:89
msgid "~R~esume"
msgstr "~C~ontinua"
@@ -884,15 +1049,21 @@ msgstr "~A~juda"
msgid "~A~bout"
msgstr "~Q~uant a"
-#: engines/dialogs.cpp:109
+#: engines/dialogs.cpp:110
msgid "~R~eturn to Launcher"
msgstr "~R~etorna al Llançador"
-#: engines/dialogs.cpp:119
+#: engines/dialogs.cpp:112
+#, fuzzy
+msgctxt "lowres"
+msgid "~R~eturn to Launcher"
+msgstr "~R~etorna al Llançador"
+
+#: engines/dialogs.cpp:122
msgid "Save game:"
msgstr "Desa la partida:"
-#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47
+#: engines/dialogs.cpp:122 backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:44
@@ -900,17 +1071,17 @@ msgstr "Desa la partida:"
msgid "Save"
msgstr "Desa"
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84
+#: engines/dialogs.cpp:304 engines/mohawk/dialogs.cpp:84
#: engines/mohawk/dialogs.cpp:118
msgid "~O~K"
msgstr "~D~'acord"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85
+#: engines/dialogs.cpp:305 engines/mohawk/dialogs.cpp:85
#: engines/mohawk/dialogs.cpp:119
msgid "~C~ancel"
msgstr "~C~ancel·la"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:308
msgid "~K~eys"
msgstr "~T~ecles"
@@ -951,10 +1122,24 @@ msgstr "Emulador OPL de DOSBox"
msgid "No music"
msgstr "Sense música"
+#: sound/mods/paula.cpp:192
+#, fuzzy
+msgid "Amiga Audio Emulator"
+msgstr "Emulador d'AdLib"
+
#: sound/softsynth/adlib.cpp:1590
msgid "AdLib Emulator"
msgstr "Emulador d'AdLib"
+#: sound/softsynth/appleiigs.cpp:36
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr ""
+
+#: sound/softsynth/sid.cpp:1434
+#, fuzzy
+msgid "C64 Audio Emulator"
+msgstr "Emulador d'AdLib"
+
#: sound/softsynth/mt32.cpp:327
msgid "Initialising MT-32 Emulator"
msgstr "Iniciant l'Emulador de MT-32"
@@ -1081,6 +1266,12 @@ msgstr "Mode Touchpad desactivat."
msgid "Normal (no scaling)"
msgstr "Normal (sense escalar)"
+#: backends/platform/sdl/graphics.cpp:59
+#, fuzzy
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal (sense escalar)"
+
#: backends/platform/symbian/src/SymbianActions.cpp:41
#: backends/platform/wince/CEActionsSmartphone.cpp:38
msgid "Up"
@@ -1245,47 +1436,47 @@ msgstr "Munta SMB"
msgid "Unmount SMB"
msgstr "Desmunta SMB"
-#: backends/platform/wii/options.cpp:145
+#: backends/platform/wii/options.cpp:143
msgid "DVD Mounted successfully"
msgstr "El DVD s'ha muntat satisfactòriament"
-#: backends/platform/wii/options.cpp:148
+#: backends/platform/wii/options.cpp:146
msgid "Error while mounting the DVD"
msgstr "Error al muntar el DVD"
-#: backends/platform/wii/options.cpp:150
+#: backends/platform/wii/options.cpp:148
msgid "DVD not mounted"
msgstr "El DVD no està muntat"
-#: backends/platform/wii/options.cpp:163
+#: backends/platform/wii/options.cpp:161
msgid "Network up, share mounted"
msgstr "Xarxa activa, compartició muntada"
-#: backends/platform/wii/options.cpp:165
+#: backends/platform/wii/options.cpp:163
msgid "Network up"
msgstr "Xarxa activa"
-#: backends/platform/wii/options.cpp:168
+#: backends/platform/wii/options.cpp:166
msgid ", error while mounting the share"
msgstr ", error al muntar la compartició"
-#: backends/platform/wii/options.cpp:170
+#: backends/platform/wii/options.cpp:168
msgid ", share not mounted"
msgstr ", compartició no muntada"
-#: backends/platform/wii/options.cpp:176
+#: backends/platform/wii/options.cpp:174
msgid "Network down"
msgstr "Xarxa inactiva"
-#: backends/platform/wii/options.cpp:180
+#: backends/platform/wii/options.cpp:178
msgid "Initialising network"
msgstr "Iniciant la xarxa"
-#: backends/platform/wii/options.cpp:184
+#: backends/platform/wii/options.cpp:182
msgid "Timeout while initialising network"
msgstr ""
-#: backends/platform/wii/options.cpp:188
+#: backends/platform/wii/options.cpp:186
#, c-format
msgid "Network not initialsed (%d)"
msgstr "Xarxa no iniciada (%d)"
@@ -1373,6 +1564,14 @@ msgstr "Pantalla"
msgid "Do you want to perform an automatic scan ?"
msgstr "Voleu fer una cerca automàtica?"
+#, fuzzy
+#~ msgctxt "lowres"
+#~ msgid "Special sound effects volume"
+#~ msgstr "Volum dels sons d'efectes especials"
+
+#~ msgid "English"
+#~ msgstr "Anglès"
+
#~ msgid "Failed to load any GUI theme, aborting"
#~ msgstr "No s'ha pogut carregar cap tema de la interfície d'usuari, avortant"
diff --git a/po/de_DE.po b/po/de_DE.po
index 63e2307b43..a6db88eedb 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.2.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2010-07-30 22:14+0100\n"
-"PO-Revision-Date: 2010-07-09 20:37+0100\n"
-"Last-Translator: Simon Sawatzki\n"
+"POT-Creation-Date: 2010-09-01 18:36+0300\n"
+"PO-Revision-Date: 2010-09-02 16:01+0100\n"
+"Last-Translator: Simon Sawatzki <SimSaw@gmx.de>\n"
"Language-Team: Lothar Serra Mari <Lothar@Windowsbase.de> & Simon Sawatzki "
"<SimSaw@gmx.de>\n"
+"Language: Deutsch\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Deutsch\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#: gui/about.cpp:96
@@ -40,7 +40,7 @@ msgid "Go to previous directory level"
msgstr "Zu höherer Pfadebene wechseln"
#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46
-#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029
+#: gui/launcher.cpp:304 gui/massadd.cpp:95 gui/options.cpp:1066
#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56
#: backends/platform/wii/options.cpp:48
msgid "Cancel"
@@ -70,8 +70,8 @@ msgstr "Tasten neu zuweisen"
msgid "Map"
msgstr "Zuweisen"
-#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893
-#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030
+#: gui/KeysDialog.cpp:45 gui/launcher.cpp:305 gui/launcher.cpp:926
+#: gui/launcher.cpp:930 gui/massadd.cpp:92 gui/options.cpp:1067
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "OK"
@@ -139,214 +139,267 @@ msgstr ""
"Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des "
"Spiels in eine deutsche verwandeln."
-#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80
-#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000
+#: gui/launcher.cpp:185 gui/launcher.cpp:199 gui/options.cpp:80
+#: gui/options.cpp:638 gui/options.cpp:648 gui/options.cpp:1037
#: sound/null.cpp:42
msgid "<default>"
msgstr "<Standard>"
-#: gui/launcher.cpp:194
+#: gui/launcher.cpp:195
msgid "Platform:"
msgstr "Plattform:"
-#: gui/launcher.cpp:194 gui/launcher.cpp:195
+#: gui/launcher.cpp:195 gui/launcher.cpp:197 gui/launcher.cpp:198
msgid "Platform the game was originally designed for"
msgstr "Plattform, für die das Spiel ursprünglich erstellt wurde"
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:197
+msgctxt "lowres"
+msgid "Platform:"
+msgstr "Plattform:"
+
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "Graphics"
msgstr "Grafik"
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:208
+#: gui/launcher.cpp:212
+msgid "Override global graphic settings"
+msgstr "Globale Grafikeinstellungen übergehen"
+
+#: gui/launcher.cpp:214
+msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Globale Grafikeinstellungen übergehen"
-#: gui/launcher.cpp:215 gui/options.cpp:921
+#: gui/launcher.cpp:221 gui/options.cpp:944
msgid "Audio"
msgstr "Audio"
-#: gui/launcher.cpp:217
+#: gui/launcher.cpp:224
msgid "Override global audio settings"
msgstr "Globale Audioeinstellungen übergehen"
-#: gui/launcher.cpp:225 gui/options.cpp:925
+#: gui/launcher.cpp:226
+msgctxt "lowres"
+msgid "Override global audio settings"
+msgstr "Globale Audioeinstellungen übergehen"
+
+#: gui/launcher.cpp:235 gui/options.cpp:949
msgid "Volume"
msgstr "Lautstärke"
-#: gui/launcher.cpp:227
+#: gui/launcher.cpp:237 gui/options.cpp:951
+msgctxt "lowres"
+msgid "Volume"
+msgstr "Lautst."
+
+#: gui/launcher.cpp:240
msgid "Override global volume settings"
msgstr "Globale Lautstärke-Einstellungen übergehen"
-#: gui/launcher.cpp:234 gui/options.cpp:933
+#: gui/launcher.cpp:242
+msgctxt "lowres"
+msgid "Override global volume settings"
+msgstr "Globale Lautstärkeeinstellungen übergehen"
+
+#: gui/launcher.cpp:249 gui/options.cpp:959
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:236
+#: gui/launcher.cpp:252
msgid "Override global MIDI settings"
msgstr "Globale MIDI-Einstellungen übergehen"
-#: gui/launcher.cpp:246 gui/options.cpp:939
+#: gui/launcher.cpp:254
+msgctxt "lowres"
+msgid "Override global MIDI settings"
+msgstr "Globale MIDI-Einstellungen übergehen"
+
+#: gui/launcher.cpp:264 gui/options.cpp:965
msgid "MT-32"
-msgstr ""
+msgstr "MT-32"
-#: gui/launcher.cpp:248
-#, fuzzy
+#: gui/launcher.cpp:267
msgid "Override global MT-32 settings"
-msgstr "Globale MIDI-Einstellungen übergehen"
+msgstr "Globale MT-32-Einstellungen übergehen"
+
+#: gui/launcher.cpp:269
+msgctxt "lowres"
+msgid "Override global MT-32 settings"
+msgstr "Globale MT-32-Einstellungen übergehen"
-#: gui/launcher.cpp:258 gui/options.cpp:945
+#: gui/launcher.cpp:279 gui/options.cpp:971
msgid "Paths"
msgstr "Pfade"
-#: gui/launcher.cpp:264
+#: gui/launcher.cpp:285
msgid "Game Path:"
msgstr "Spielpfad:"
-#: gui/launcher.cpp:268 gui/options.cpp:958
+#: gui/launcher.cpp:289 gui/options.cpp:984
msgid "Extra Path:"
msgstr "Extrapfad:"
-#: gui/launcher.cpp:268 gui/launcher.cpp:269
+#: gui/launcher.cpp:289 gui/launcher.cpp:290
msgid "Specifies path to additional data used the game"
msgstr "Legt das Verzeichnis für zusätzliche Spieldateien fest."
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:294
msgid "Save Path:"
msgstr "Spielstände:"
-#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952
-#: gui/options.cpp:953
+#: gui/launcher.cpp:294 gui/launcher.cpp:296 gui/launcher.cpp:297
+#: gui/options.cpp:978 gui/options.cpp:979
msgid "Specifies where your savegames are put"
msgstr "Legt fest, wo die Spielstände abgelegt werden."
-#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418
-#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
-#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956
-#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053
-#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073
-#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107
-#: gui/options.cpp:1114 gui/options.cpp:1213
+#: gui/launcher.cpp:296
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr "Speichern:"
+
+#: gui/launcher.cpp:313 gui/launcher.cpp:393 gui/launcher.cpp:442
+#: gui/options.cpp:982 gui/options.cpp:985 gui/options.cpp:989
+#: gui/options.cpp:1090 gui/options.cpp:1096 gui/options.cpp:1102
+#: gui/options.cpp:1110 gui/options.cpp:1134 gui/options.cpp:1138
+#: gui/options.cpp:1144 gui/options.cpp:1151 gui/options.cpp:1250
+msgctxt "path"
msgid "None"
-msgstr "-"
+msgstr "Keiner"
-#: gui/launcher.cpp:294 gui/launcher.cpp:373
+#: gui/launcher.cpp:318 gui/launcher.cpp:397
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Standard"
-#: gui/launcher.cpp:411 gui/options.cpp:1207
+#: gui/launcher.cpp:435 gui/options.cpp:1244
msgid "Select SoundFont"
msgstr "SoundFont auswählen"
-#: gui/launcher.cpp:430 gui/launcher.cpp:568
+#: gui/launcher.cpp:454 gui/launcher.cpp:601
msgid "Select directory with game data"
msgstr "Verzeichnis mit Spieldateien auswählen"
-#: gui/launcher.cpp:448
+#: gui/launcher.cpp:472
msgid "Select additional game directory"
msgstr "Verzeichnis mit zusätzlichen Dateien auswählen"
-#: gui/launcher.cpp:460
+#: gui/launcher.cpp:484
msgid "Select directory for saved games"
msgstr "Verzeichnis für Spielstände auswählen"
-#: gui/launcher.cpp:479
+#: gui/launcher.cpp:503
msgid "This game ID is already taken. Please choose another one."
msgstr "Diese Spielkennung ist schon vergeben. Bitte eine andere wählen."
-#: gui/launcher.cpp:520 engines/dialogs.cpp:113
+#: gui/launcher.cpp:544 engines/dialogs.cpp:116
msgid "~Q~uit"
msgstr "~B~eenden"
-#: gui/launcher.cpp:520
+#: gui/launcher.cpp:544
msgid "Quit ScummVM"
msgstr "ScummVM beenden"
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "A~b~out..."
msgstr "Übe~r~"
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "About ScummVM"
msgstr "Über ScummVM"
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "~O~ptions..."
msgstr "~O~ptionen"
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "Change global ScummVM options"
msgstr "Globale ScummVM-Einstellungen bearbeiten"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "~S~tart"
msgstr "~S~tarten"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "Start selected game"
msgstr "Ausgewähltes Spiel starten"
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "~L~oad..."
msgstr "~L~aden..."
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "Load savegame for selected game"
msgstr "Spielstand für ausgewähltes Spiel laden"
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556
msgid "~A~dd Game..."
msgstr "Spiel ~h~inzufügen"
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556 gui/launcher.cpp:563
msgid "Hold Shift for Mass Add"
msgstr ""
"Umschalttaste (Shift) gedrückt halten, um Verzeichnisse nach Spielen zu "
"durchsuchen"
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558
msgid "~E~dit Game..."
msgstr "Spielo~p~tionen"
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558 gui/launcher.cpp:565
msgid "Change game options"
msgstr "Spieloptionen ändern"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560
msgid "~R~emove Game"
msgstr "Spiel ~e~ntfernen"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560 gui/launcher.cpp:567
msgid "Remove game from the list. The game data files stay intact"
msgstr "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten."
-#: gui/launcher.cpp:542
+#: gui/launcher.cpp:563
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr "~H~inzufügen"
+
+#: gui/launcher.cpp:565
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr "Spielo~p~tion"
+
+#: gui/launcher.cpp:567
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr "~E~ntfernen"
+
+#: gui/launcher.cpp:575
msgid "Search in game list"
msgstr "In Spieleliste suchen"
-#: gui/launcher.cpp:546 gui/launcher.cpp:1057
+#: gui/launcher.cpp:579 gui/launcher.cpp:1092
msgid "Search:"
msgstr "Suchen:"
-#: gui/launcher.cpp:549 gui/options.cpp:733
+#: gui/launcher.cpp:582 gui/options.cpp:740
msgid "Clear value"
msgstr "Wert löschen"
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
msgid "Load game:"
msgstr "Spiel laden:"
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:225
msgid "Load"
msgstr "Laden"
-#: gui/launcher.cpp:680
+#: gui/launcher.cpp:713
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -354,7 +407,7 @@ msgstr ""
"Möchten Sie wirklich den PC nach Spielen durchsuchen? Möglicherweise wird "
"dabei eine größere Menge an Spielen hinzugefügt."
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -362,7 +415,7 @@ msgstr ""
msgid "Yes"
msgstr "Ja"
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -370,36 +423,46 @@ msgstr "Ja"
msgid "No"
msgstr "Nein"
-#: gui/launcher.cpp:728
+#: gui/launcher.cpp:761
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM kann das gewählte Verzeichnis nicht öffnen!"
-#: gui/launcher.cpp:740
+#: gui/launcher.cpp:773
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM kann in dem gewählten Verzeichnis kein Spiel finden!"
-#: gui/launcher.cpp:754
+#: gui/launcher.cpp:787
msgid "Pick the game:"
msgstr "Spiel auswählen:"
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:863
msgid "Do you really want to remove this game configuration?"
msgstr "Möchten Sie wirklich diese Spielkonfiguration entfernen?"
-#: gui/launcher.cpp:893
+#: gui/launcher.cpp:926
msgid "This game does not support loading games from the launcher."
msgstr ""
"Für dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterstützt."
-#: gui/launcher.cpp:897
+#: gui/launcher.cpp:930
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM konnte keine Engine finden, um das Spiel zu starten!"
-#: gui/launcher.cpp:1009
+#: gui/launcher.cpp:1044
+msgctxt "lowres"
+msgid "Mass Add..."
+msgstr "Durchsuchen"
+
+#: gui/launcher.cpp:1044
msgid "Mass Add..."
msgstr "Durchsuchen"
-#: gui/launcher.cpp:1010
+#: gui/launcher.cpp:1045
+msgctxt "lowres"
+msgid "Add Game..."
+msgstr "Hinzufügen"
+
+#: gui/launcher.cpp:1045
msgid "Add Game..."
msgstr "Spiel hinzufügen"
@@ -466,61 +529,67 @@ msgstr "44 kHz"
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:632
+#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
+#: gui/options.cpp:555 gui/options.cpp:739
+msgctxt "soundfont"
+msgid "None"
+msgstr "-"
+
+#: gui/options.cpp:635
msgid "Graphics mode:"
msgstr "Grafikmodus:"
-#: gui/options.cpp:643
+#: gui/options.cpp:646
msgid "Render mode:"
msgstr "Render-Modus:"
-#: gui/options.cpp:643 gui/options.cpp:644
+#: gui/options.cpp:646 gui/options.cpp:647
msgid "Special dithering modes supported by some games"
msgstr ""
"Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt."
-#: gui/options.cpp:653
+#: gui/options.cpp:656
msgid "Fullscreen mode"
msgstr "Vollbildmodus"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Aspect ratio correction"
msgstr "Seitenverhältnis korrigieren"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Correct aspect ratio for 320x200 games"
msgstr "Seitenverhältnis für Spiele mit der Auflösung 320x200 korrigieren"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Preferred Device:"
msgstr "Standard-Gerät:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Music Device:"
msgstr "Musikgerät:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
"Legt das bevorzugte Tonwiedergabe-Gerät oder den Soundkarten-Emulator fest."
-#: gui/options.cpp:663 gui/options.cpp:664
+#: gui/options.cpp:666 gui/options.cpp:667
msgid "Specifies output sound device or sound card emulator"
msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest."
-#: gui/options.cpp:688
+#: gui/options.cpp:692
msgid "AdLib emulator:"
msgstr "AdLib-Emulator"
-#: gui/options.cpp:688 gui/options.cpp:689
+#: gui/options.cpp:692 gui/options.cpp:693
msgid "AdLib is used for music in many games"
msgstr "AdLib wird für die Musik in vielen Spielen verwendet."
-#: gui/options.cpp:699
+#: gui/options.cpp:703
msgid "Output rate:"
msgstr "Ausgabefrequenz:"
-#: gui/options.cpp:699 gui/options.cpp:700
+#: gui/options.cpp:703 gui/options.cpp:704
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -528,52 +597,56 @@ msgstr ""
"Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise "
"nicht von jeder Soundkarte unterstützt."
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "GM Device:"
msgstr "GM-Gerät:"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "Specifies default sound device for General MIDI output"
msgstr ""
"Legt das standardmäßige Musikwiedergabe-Gerät für General-MIDI-Ausgabe fest."
-#: gui/options.cpp:731
+#: gui/options.cpp:736
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:731 gui/options.cpp:732
+#: gui/options.cpp:736 gui/options.cpp:738 gui/options.cpp:739
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterstützt."
-#: gui/options.cpp:736
+#: gui/options.cpp:738
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr "SoundFont:"
+
+#: gui/options.cpp:743
msgid "Mixed AdLib/MIDI mode"
msgstr "AdLib-/MIDI-Modus"
-#: gui/options.cpp:736
+#: gui/options.cpp:743
msgid "Use both MIDI and AdLib sound generation"
msgstr "Benutzt MIDI und AdLib zur Sounderzeugung."
-#: gui/options.cpp:739
+#: gui/options.cpp:746
msgid "MIDI gain:"
msgstr "MIDI-Lautstärke:"
-#: gui/options.cpp:749
-#, fuzzy
+#: gui/options.cpp:756
msgid "MT-32 Device:"
-msgstr "MT32-Gerät:"
+msgstr "MT-32-Gerät:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Legt das standardmäßige Tonwiedergabe-Gerät für die Ausgabe von Roland MT-32/"
"LAPC1/CM32l/CM64 fest."
-#: gui/options.cpp:753
+#: gui/options.cpp:761
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)"
-#: gui/options.cpp:753
+#: gui/options.cpp:761 gui/options.cpp:763
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -581,141 +654,182 @@ msgstr ""
"Wählen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-"
"kompatiblen Soundkarte verbunden ist, verwenden möchten."
-#: gui/options.cpp:756
+#: gui/options.cpp:763
+msgctxt "lowres"
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr "Echte Roland-MT-32-Emulation (kein GM)"
+
+#: gui/options.cpp:766
msgid "Enable Roland GS Mode"
msgstr "Roland-GS-Modus"
-#: gui/options.cpp:756
+#: gui/options.cpp:766
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
msgstr ""
"Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur "
"aus."
-#: gui/options.cpp:780
+#: gui/options.cpp:791
msgid "Text and Speech:"
-msgstr "Text und Sprache:"
+msgstr "Sprache und Text:"
-#: gui/options.cpp:785 gui/options.cpp:791
+#: gui/options.cpp:795 gui/options.cpp:805
msgid "Speech"
msgstr "Sprache"
-#: gui/options.cpp:786 gui/options.cpp:792
+#: gui/options.cpp:796 gui/options.cpp:806
msgid "Subtitles"
msgstr "Untertitel"
-#: gui/options.cpp:787 gui/options.cpp:793
+#: gui/options.cpp:797
msgid "Both"
msgstr "Beides"
-#: gui/options.cpp:791
+#: gui/options.cpp:799
+msgid "Subtitle speed:"
+msgstr "Untertitel-Tempo:"
+
+#: gui/options.cpp:801
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr "Sprache + Text:"
+
+#: gui/options.cpp:805
msgid "Spch"
msgstr "Spr."
-#: gui/options.cpp:792
+#: gui/options.cpp:806
msgid "Subs"
-msgstr "Untert."
+msgstr "TXT"
+
+#: gui/options.cpp:807
+msgctxt "lowres"
+msgid "Both"
+msgstr "S+T"
-#: gui/options.cpp:793
+#: gui/options.cpp:807
msgid "Show subtitles and play speech"
msgstr "Untertitel anzeigen und Sprachausgabe aktivieren"
-#: gui/options.cpp:797
+#: gui/options.cpp:809
+msgctxt "lowres"
msgid "Subtitle speed:"
-msgstr "Untertitel-Tempo:"
+msgstr "Text-Tempo:"
-#: gui/options.cpp:809
+#: gui/options.cpp:825
msgid "Music volume:"
msgstr "Musiklautstärke:"
-#: gui/options.cpp:816
+#: gui/options.cpp:827
+msgctxt "lowres"
+msgid "Music volume:"
+msgstr "Musiklautstärke:"
+
+#: gui/options.cpp:834
msgid "Mute All"
msgstr "Alles aus"
-#: gui/options.cpp:819
+#: gui/options.cpp:837
msgid "SFX volume:"
msgstr "Effektlautstärke:"
-#: gui/options.cpp:819 gui/options.cpp:820
+#: gui/options.cpp:837 gui/options.cpp:839 gui/options.cpp:840
msgid "Special sound effects volume"
msgstr "Lautstärke spezieller Soundeffekte"
-#: gui/options.cpp:826
+#: gui/options.cpp:839
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr "Effektlautst.:"
+
+#: gui/options.cpp:847
msgid "Speech volume:"
msgstr "Sprachlautstärke:"
-#: gui/options.cpp:952
+#: gui/options.cpp:849
+msgctxt "lowres"
+msgid "Speech volume:"
+msgstr "Sprachlautst.:"
+
+#: gui/options.cpp:978
msgid "Save Path: "
msgstr "Spielstände: "
-#: gui/options.cpp:955
+#: gui/options.cpp:981
msgid "Theme Path:"
msgstr "Themenpfad:"
-#: gui/options.cpp:958 gui/options.cpp:959
+#: gui/options.cpp:984 gui/options.cpp:985
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Legt das Verzeichnis für zusätzliche Spieldateien für alle Spiele in ScummVM "
"fest."
-#: gui/options.cpp:962
+#: gui/options.cpp:988
msgid "Plugins Path:"
msgstr "Plugin-Pfad:"
-#: gui/options.cpp:970
+#: gui/options.cpp:997
msgid "Misc"
msgstr "Sonstiges"
-#: gui/options.cpp:972
+#: gui/options.cpp:999
+msgctxt "lowres"
+msgid "Misc"
+msgstr "Andere"
+
+#: gui/options.cpp:1001
msgid "Theme:"
msgstr "Thema:"
-#: gui/options.cpp:976
+#: gui/options.cpp:1005
msgid "GUI Renderer:"
msgstr "GUI-Renderer:"
-#: gui/options.cpp:982
+#: gui/options.cpp:1017
msgid "Autosave:"
msgstr "Autom. Speichern:"
-#: gui/options.cpp:990
+#: gui/options.cpp:1019
+msgctxt "lowres"
+msgid "Autosave:"
+msgstr "Autom. Sich.:"
+
+#: gui/options.cpp:1027
msgid "Keys"
msgstr "Tasten"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "GUI Language:"
msgstr "GUI-Sprache:"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "Language of ScummVM GUI"
msgstr "Sprache der ScummVM-Oberfläche"
-#: gui/options.cpp:1002
-msgid "English"
-msgstr "English"
-
-#: gui/options.cpp:1146
+#: gui/options.cpp:1183
msgid "You have to restart ScummVM to take the effect."
msgstr "Sie müssen ScummVM neustarten, um die Einstellungen zu übernehmen."
-#: gui/options.cpp:1159
+#: gui/options.cpp:1196
msgid "Select directory for savegames"
msgstr "Verzeichnis für Spielstände auswählen"
-#: gui/options.cpp:1166
+#: gui/options.cpp:1203
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
"In das gewählte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes "
"auswählen."
-#: gui/options.cpp:1175
+#: gui/options.cpp:1212
msgid "Select directory for GUI themes"
msgstr "Verzeichnis für Oberflächen-Themen"
-#: gui/options.cpp:1185
+#: gui/options.cpp:1222
msgid "Select directory for extra files"
msgstr "Verzeichnis für zusätzliche Dateien auswählen"
-#: gui/options.cpp:1196
+#: gui/options.cpp:1233
msgid "Select directory for plugins"
msgstr "Verzeichnis für Erweiterungen auswählen"
@@ -771,6 +885,16 @@ msgstr "Standard-Renderer (16bpp)"
msgid "Antialiased Renderer (16bpp)"
msgstr "Kantenglättung (16bpp)"
+#: gui/ThemeEngine.cpp:341
+msgctxt "lowres"
+msgid "Standard Renderer (16bpp)"
+msgstr "Standard-Renderer(16bpp)"
+
+#: gui/ThemeEngine.cpp:342
+msgctxt "lowres"
+msgid "Antialiased Renderer (16bpp)"
+msgstr "Kantenglättung (16bpp)"
+
#: base/main.cpp:205
#, c-format
msgid "Engine does not support debug level '%s'"
@@ -861,7 +985,17 @@ msgstr "Hercules-Grün"
#: common/util.cpp:255
msgid "Hercules Amber"
-msgstr "Hercules Bernsteingelb"
+msgstr "Hercules-Bernsteingelb"
+
+#: common/util.cpp:262
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr "Hercules-Grün"
+
+#: common/util.cpp:263
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr "Hercules-Gelb"
#: engines/dialogs.cpp:89
msgid "~R~esume"
@@ -887,15 +1021,20 @@ msgstr "~H~ilfe"
msgid "~A~bout"
msgstr "Übe~r~"
-#: engines/dialogs.cpp:109
+#: engines/dialogs.cpp:110
msgid "~R~eturn to Launcher"
msgstr "Zur Spiele~l~iste zurück"
-#: engines/dialogs.cpp:119
+#: engines/dialogs.cpp:112
+msgctxt "lowres"
+msgid "~R~eturn to Launcher"
+msgstr "Zur Spiele~l~iste"
+
+#: engines/dialogs.cpp:122
msgid "Save game:"
msgstr "Speichern:"
-#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47
+#: engines/dialogs.cpp:122 backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:44
@@ -903,17 +1042,17 @@ msgstr "Speichern:"
msgid "Save"
msgstr "Speichern"
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84
+#: engines/dialogs.cpp:304 engines/mohawk/dialogs.cpp:84
#: engines/mohawk/dialogs.cpp:118
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85
+#: engines/dialogs.cpp:305 engines/mohawk/dialogs.cpp:85
#: engines/mohawk/dialogs.cpp:119
msgid "~C~ancel"
msgstr "~A~bbrechen"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:308
msgid "~K~eys"
msgstr "~T~asten"
@@ -954,10 +1093,22 @@ msgstr "DOSBox-OPL-Emulator"
msgid "No music"
msgstr "Keine Musik"
+#: sound/mods/paula.cpp:192
+msgid "Amiga Audio Emulator"
+msgstr "Amiga-Audio-Emulator"
+
#: sound/softsynth/adlib.cpp:1590
msgid "AdLib Emulator"
msgstr "AdLib-Emulator"
+#: sound/softsynth/appleiigs.cpp:36
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple-II-GS-Emulator (NICHT INTEGRIERT)"
+
+#: sound/softsynth/sid.cpp:1434
+msgid "C64 Audio Emulator"
+msgstr "C64-Audio-Emulator"
+
#: sound/softsynth/mt32.cpp:327
msgid "Initialising MT-32 Emulator"
msgstr "MT-32-Emulator wird gestartet..."
@@ -1084,6 +1235,11 @@ msgstr "Touchpad-Modus ausgeschaltet."
msgid "Normal (no scaling)"
msgstr "Normal (keine Skalierung)"
+#: backends/platform/sdl/graphics.cpp:59
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal ohn.Skalieren"
+
#: backends/platform/symbian/src/SymbianActions.cpp:41
#: backends/platform/wince/CEActionsSmartphone.cpp:38
msgid "Up"
@@ -1248,47 +1404,47 @@ msgstr "SMB einbinden"
msgid "Unmount SMB"
msgstr "SMB aushängen"
-#: backends/platform/wii/options.cpp:145
+#: backends/platform/wii/options.cpp:143
msgid "DVD Mounted successfully"
msgstr "DVD erfolgreich eingebunden"
-#: backends/platform/wii/options.cpp:148
+#: backends/platform/wii/options.cpp:146
msgid "Error while mounting the DVD"
msgstr "Fehler beim Einbinden der DVD"
-#: backends/platform/wii/options.cpp:150
+#: backends/platform/wii/options.cpp:148
msgid "DVD not mounted"
msgstr "DVD nicht eingebunden"
-#: backends/platform/wii/options.cpp:163
+#: backends/platform/wii/options.cpp:161
msgid "Network up, share mounted"
msgstr "Netzwerk gestartet, öffentliches Verzeichnis eingebunden"
-#: backends/platform/wii/options.cpp:165
+#: backends/platform/wii/options.cpp:163
msgid "Network up"
msgstr "Netzwerk gestartet"
-#: backends/platform/wii/options.cpp:168
+#: backends/platform/wii/options.cpp:166
msgid ", error while mounting the share"
msgstr ", Fehler beim Einbinden des öffentlichen Verzeichnisses"
-#: backends/platform/wii/options.cpp:170
+#: backends/platform/wii/options.cpp:168
msgid ", share not mounted"
msgstr ", öffentliches Verzeichnis nicht eingebunden"
-#: backends/platform/wii/options.cpp:176
+#: backends/platform/wii/options.cpp:174
msgid "Network down"
msgstr "Netzwerk ist aus."
-#: backends/platform/wii/options.cpp:180
+#: backends/platform/wii/options.cpp:178
msgid "Initialising network"
msgstr "Netzwerk wird gestartet..."
-#: backends/platform/wii/options.cpp:184
+#: backends/platform/wii/options.cpp:182
msgid "Timeout while initialising network"
msgstr "Zeitüberschreitung beim Starten des Netzwerks"
-#: backends/platform/wii/options.cpp:188
+#: backends/platform/wii/options.cpp:186
#, c-format
msgid "Network not initialsed (%d)"
msgstr "Netzwerk nicht gestartet (%d)"
@@ -1376,6 +1532,14 @@ msgstr "Anzeige"
msgid "Do you want to perform an automatic scan ?"
msgstr "Möchten Sie eine automatische Durchsuchung vornehmen?"
+#, fuzzy
+#~ msgctxt "lowres"
+#~ msgid "Special sound effects volume"
+#~ msgstr "Lautstärke spezieller Soundeffekte"
+
+#~ msgid "English"
+#~ msgstr "English"
+
#~ msgid "Failed to load any GUI theme, aborting"
#~ msgstr "Fehler: Konnte kein Benutzeroberflächen-Thema laden. Abbruch..."
diff --git a/po/es_ES.po b/po/es_ES.po
index de9374f844..f8e2d0f87c 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.2.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2010-07-30 22:14+0100\n"
+"POT-Creation-Date: 2010-09-01 18:36+0300\n"
"PO-Revision-Date: 2010-07-30 22:17+0100\n"
"Last-Translator: Tomás Maidagan\n"
"Language-Team: \n"
@@ -37,27 +37,18 @@ msgstr "Arriba"
msgid "Go to previous directory level"
msgstr "Ir al directorio anterior"
-#: gui/browser.cpp:70
-#: gui/chooser.cpp:49
-#: gui/KeysDialog.cpp:46
-#: gui/launcher.cpp:280
-#: gui/massadd.cpp:95
-#: gui/options.cpp:1029
-#: gui/saveload.cpp:65
-#: gui/saveload.cpp:157
-#: gui/themebrowser.cpp:56
+#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46
+#: gui/launcher.cpp:304 gui/massadd.cpp:95 gui/options.cpp:1066
+#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56
#: backends/platform/wii/options.cpp:48
msgid "Cancel"
msgstr "Cancelar"
-#: gui/browser.cpp:71
-#: gui/chooser.cpp:50
-#: gui/themebrowser.cpp:57
+#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57
msgid "Choose"
msgstr "Elegir"
-#: gui/GuiManager.cpp:103
-#: backends/keymapper/remap-dialog.cpp:54
+#: gui/GuiManager.cpp:103 backends/keymapper/remap-dialog.cpp:54
msgid "Close"
msgstr "Cerrar"
@@ -65,13 +56,11 @@ msgstr "Cerrar"
msgid "Mouse click"
msgstr "Clic de ratón"
-#: gui/GuiManager.cpp:109
-#: base/main.cpp:285
+#: gui/GuiManager.cpp:109 base/main.cpp:285
msgid "Display keyboard"
msgstr "Mostrar el teclado"
-#: gui/GuiManager.cpp:112
-#: base/main.cpp:288
+#: gui/GuiManager.cpp:112 base/main.cpp:288
msgid "Remap keys"
msgstr "Asignar teclas"
@@ -79,12 +68,8 @@ msgstr "Asignar teclas"
msgid "Map"
msgstr "Asignar"
-#: gui/KeysDialog.cpp:45
-#: gui/launcher.cpp:281
-#: gui/launcher.cpp:893
-#: gui/launcher.cpp:897
-#: gui/massadd.cpp:92
-#: gui/options.cpp:1030
+#: gui/KeysDialog.cpp:45 gui/launcher.cpp:305 gui/launcher.cpp:926
+#: gui/launcher.cpp:930 gui/massadd.cpp:92 gui/options.cpp:1067
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "OK"
@@ -94,16 +79,12 @@ msgstr "De acuerdo"
msgid "Select an action and click 'Map'"
msgstr "Selecciona una acción y pulsa \"Asignar\""
-#: gui/KeysDialog.cpp:83
-#: gui/KeysDialog.cpp:105
-#: gui/KeysDialog.cpp:144
+#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144
#, c-format
msgid "Associated key : %s"
msgstr "Tecla asociada: %s"
-#: gui/KeysDialog.cpp:85
-#: gui/KeysDialog.cpp:107
-#: gui/KeysDialog.cpp:146
+#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146
#, c-format
msgid "Associated key : none"
msgstr "Tecla asociada: ninguna"
@@ -128,17 +109,19 @@ msgstr "Juego"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:175
-#: gui/launcher.cpp:176
-msgid "Short game identifier used for referring to savegames and running the game from the command line"
-msgstr "Identificador usado para las partidas guardadas y para ejecutar el juego desde la línea de comando"
+#: gui/launcher.cpp:175 gui/launcher.cpp:176
+msgid ""
+"Short game identifier used for referring to savegames and running the game "
+"from the command line"
+msgstr ""
+"Identificador usado para las partidas guardadas y para ejecutar el juego "
+"desde la línea de comando"
#: gui/launcher.cpp:179
msgid "Name:"
msgstr "Nombre:"
-#: gui/launcher.cpp:179
-#: gui/launcher.cpp:180
+#: gui/launcher.cpp:179 gui/launcher.cpp:180
msgid "Full title of the game"
msgstr "Título completo del juego"
@@ -146,260 +129,293 @@ msgstr "Título completo del juego"
msgid "Language:"
msgstr "Idioma:"
-#: gui/launcher.cpp:183
-#: gui/launcher.cpp:184
-msgid "Language of the game. This will not turn your Spanish game version into English"
-msgstr "Idioma del juego. No sirve para pasar al inglés la versión española de un juego"
+#: gui/launcher.cpp:183 gui/launcher.cpp:184
+msgid ""
+"Language of the game. This will not turn your Spanish game version into "
+"English"
+msgstr ""
+"Idioma del juego. No sirve para pasar al inglés la versión española de un "
+"juego"
-#: gui/launcher.cpp:185
-#: gui/launcher.cpp:196
-#: gui/options.cpp:80
-#: gui/options.cpp:635
-#: gui/options.cpp:645
-#: gui/options.cpp:1000
+#: gui/launcher.cpp:185 gui/launcher.cpp:199 gui/options.cpp:80
+#: gui/options.cpp:638 gui/options.cpp:648 gui/options.cpp:1037
#: sound/null.cpp:42
msgid "<default>"
msgstr "<por defecto>"
-#: gui/launcher.cpp:194
+#: gui/launcher.cpp:195
msgid "Platform:"
msgstr "Plataforma:"
-#: gui/launcher.cpp:194
-#: gui/launcher.cpp:195
+#: gui/launcher.cpp:195 gui/launcher.cpp:197 gui/launcher.cpp:198
msgid "Platform the game was originally designed for"
msgstr "Plataforma para la que se diseñó el juego"
-#: gui/launcher.cpp:206
-#: gui/options.cpp:898
-#: gui/options.cpp:915
+#: gui/launcher.cpp:197
+#, fuzzy
+msgctxt "lowres"
+msgid "Platform:"
+msgstr "Plataforma:"
+
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "Graphics"
msgstr "Gráficos"
-#: gui/launcher.cpp:206
-#: gui/options.cpp:898
-#: gui/options.cpp:915
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:208
+#: gui/launcher.cpp:212
+msgid "Override global graphic settings"
+msgstr "Ignorar opciones gráficas generales"
+
+#: gui/launcher.cpp:214
+#, fuzzy
+msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Ignorar opciones gráficas generales"
-#: gui/launcher.cpp:215
-#: gui/options.cpp:921
+#: gui/launcher.cpp:221 gui/options.cpp:944
msgid "Audio"
msgstr "Sonido"
-#: gui/launcher.cpp:217
+#: gui/launcher.cpp:224
+msgid "Override global audio settings"
+msgstr "Ignorar opciones de sonido generales"
+
+#: gui/launcher.cpp:226
+#, fuzzy
+msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Ignorar opciones de sonido generales"
-#: gui/launcher.cpp:225
-#: gui/options.cpp:925
+#: gui/launcher.cpp:235 gui/options.cpp:949
msgid "Volume"
msgstr "Volumen"
-#: gui/launcher.cpp:227
+#: gui/launcher.cpp:237 gui/options.cpp:951
+#, fuzzy
+msgctxt "lowres"
+msgid "Volume"
+msgstr "Volumen"
+
+#: gui/launcher.cpp:240
+msgid "Override global volume settings"
+msgstr "Ignorar opciones de volumen generales"
+
+#: gui/launcher.cpp:242
+#, fuzzy
+msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Ignorar opciones de volumen generales"
-#: gui/launcher.cpp:234
-#: gui/options.cpp:933
+#: gui/launcher.cpp:249 gui/options.cpp:959
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:236
+#: gui/launcher.cpp:252
msgid "Override global MIDI settings"
msgstr "Ignorar opciones MIDI generales"
-#: gui/launcher.cpp:246
-#: gui/options.cpp:939
+#: gui/launcher.cpp:254
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global MIDI settings"
+msgstr "Ignorar opciones MIDI generales"
+
+#: gui/launcher.cpp:264 gui/options.cpp:965
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:248
+#: gui/launcher.cpp:267
msgid "Override global MT-32 settings"
msgstr "Ignorar opciones MT-32 generales"
-#: gui/launcher.cpp:258
-#: gui/options.cpp:945
+#: gui/launcher.cpp:269
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global MT-32 settings"
+msgstr "Ignorar opciones MT-32 generales"
+
+#: gui/launcher.cpp:279 gui/options.cpp:971
msgid "Paths"
msgstr "Rutas"
-#: gui/launcher.cpp:264
+#: gui/launcher.cpp:285
msgid "Game Path:"
msgstr "Juego:"
-#: gui/launcher.cpp:268
-#: gui/options.cpp:958
+#: gui/launcher.cpp:289 gui/options.cpp:984
msgid "Extra Path:"
msgstr "Adicional:"
-#: gui/launcher.cpp:268
-#: gui/launcher.cpp:269
+#: gui/launcher.cpp:289 gui/launcher.cpp:290
msgid "Specifies path to additional data used the game"
msgstr "Especifica un directorio para datos adicionales del juego"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:294
msgid "Save Path:"
msgstr "Partidas:"
-#: gui/launcher.cpp:272
-#: gui/launcher.cpp:273
-#: gui/options.cpp:952
-#: gui/options.cpp:953
+#: gui/launcher.cpp:294 gui/launcher.cpp:296 gui/launcher.cpp:297
+#: gui/options.cpp:978 gui/options.cpp:979
msgid "Specifies where your savegames are put"
msgstr "Especifica dónde guardar tus partidas"
-#: gui/launcher.cpp:289
-#: gui/launcher.cpp:369
-#: gui/launcher.cpp:418
-#: gui/options.cpp:230
-#: gui/options.cpp:399
-#: gui/options.cpp:497
-#: gui/options.cpp:555
-#: gui/options.cpp:732
-#: gui/options.cpp:956
-#: gui/options.cpp:959
-#: gui/options.cpp:963
-#: gui/options.cpp:1053
-#: gui/options.cpp:1059
-#: gui/options.cpp:1065
-#: gui/options.cpp:1073
-#: gui/options.cpp:1097
-#: gui/options.cpp:1101
-#: gui/options.cpp:1107
-#: gui/options.cpp:1114
-#: gui/options.cpp:1213
+#: gui/launcher.cpp:296
+#, fuzzy
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr "Partidas:"
+
+#: gui/launcher.cpp:313 gui/launcher.cpp:393 gui/launcher.cpp:442
+#: gui/options.cpp:982 gui/options.cpp:985 gui/options.cpp:989
+#: gui/options.cpp:1090 gui/options.cpp:1096 gui/options.cpp:1102
+#: gui/options.cpp:1110 gui/options.cpp:1134 gui/options.cpp:1138
+#: gui/options.cpp:1144 gui/options.cpp:1151 gui/options.cpp:1250
+#, fuzzy
+msgctxt "path"
msgid "None"
msgstr "Ninguno"
-#: gui/launcher.cpp:294
-#: gui/launcher.cpp:373
+#: gui/launcher.cpp:318 gui/launcher.cpp:397
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Por defecto"
-#: gui/launcher.cpp:411
-#: gui/options.cpp:1207
+#: gui/launcher.cpp:435 gui/options.cpp:1244
msgid "Select SoundFont"
msgstr "Seleccionar SoundFont"
-#: gui/launcher.cpp:430
-#: gui/launcher.cpp:568
+#: gui/launcher.cpp:454 gui/launcher.cpp:601
msgid "Select directory with game data"
msgstr "Seleccionar directorio con los archivos del juego"
-#: gui/launcher.cpp:448
+#: gui/launcher.cpp:472
msgid "Select additional game directory"
msgstr "Seleccionar directorio de juego adicional"
-#: gui/launcher.cpp:460
+#: gui/launcher.cpp:484
msgid "Select directory for saved games"
msgstr "Seleccionar directorio para partidas guardadas"
-#: gui/launcher.cpp:479
+#: gui/launcher.cpp:503
msgid "This game ID is already taken. Please choose another one."
msgstr "Esta ID ya está siendo usada. Por favor, elige otra."
-#: gui/launcher.cpp:520
-#: engines/dialogs.cpp:113
+#: gui/launcher.cpp:544 engines/dialogs.cpp:116
msgid "~Q~uit"
msgstr "~S~alir"
-#: gui/launcher.cpp:520
+#: gui/launcher.cpp:544
msgid "Quit ScummVM"
msgstr "Cerrar ScummVM"
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "A~b~out..."
msgstr "Acerca ~d~e"
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "About ScummVM"
msgstr "Acerca de ScummVM"
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "~O~ptions..."
msgstr "~O~opciones..."
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "Change global ScummVM options"
msgstr "Cambiar opciones generales de ScummVM"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "~S~tart"
msgstr "~J~ugar"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "Start selected game"
msgstr "Jugar al juego seleccionado"
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "~L~oad..."
msgstr "~C~argar..."
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "Load savegame for selected game"
msgstr "Cargar partida del juego seleccionado"
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556
msgid "~A~dd Game..."
msgstr "~A~ñadir juego..."
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556 gui/launcher.cpp:563
msgid "Hold Shift for Mass Add"
msgstr "Mantén pulsado Mayús para añadir varios"
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558
msgid "~E~dit Game..."
msgstr "~E~ditar juego..."
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558 gui/launcher.cpp:565
msgid "Change game options"
msgstr "Cambiar opciones de juego"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560
msgid "~R~emove Game"
msgstr "E~l~iminar juego"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560 gui/launcher.cpp:567
msgid "Remove game from the list. The game data files stay intact"
msgstr "Elimina el juego de la lista. Los archivos no se borran"
-#: gui/launcher.cpp:542
+#: gui/launcher.cpp:563
+#, fuzzy
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr "~A~ñadir juego..."
+
+#: gui/launcher.cpp:565
+#, fuzzy
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr "~E~ditar juego..."
+
+#: gui/launcher.cpp:567
+#, fuzzy
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr "E~l~iminar juego"
+
+#: gui/launcher.cpp:575
msgid "Search in game list"
msgstr "Buscar en la lista de juegos"
-#: gui/launcher.cpp:546
-#: gui/launcher.cpp:1057
+#: gui/launcher.cpp:579 gui/launcher.cpp:1092
msgid "Search:"
msgstr "Buscar:"
-#: gui/launcher.cpp:549
-#: gui/options.cpp:733
+#: gui/launcher.cpp:582 gui/options.cpp:740
msgid "Clear value"
msgstr "Eliminar valor"
-#: gui/launcher.cpp:571
-#: engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
msgid "Load game:"
msgstr "Cargar juego:"
-#: gui/launcher.cpp:571
-#: engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:225
msgid "Load"
msgstr "Cargar"
-#: gui/launcher.cpp:680
-msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games."
-msgstr "¿Seguro que quieres ejecutar la detección masiva? Puede que se añada un gran número de juegos."
+#: gui/launcher.cpp:713
+msgid ""
+"Do you really want to run the mass game detector? This could potentially add "
+"a huge number of games."
+msgstr ""
+"¿Seguro que quieres ejecutar la detección masiva? Puede que se añada un gran "
+"número de juegos."
-#: gui/launcher.cpp:681
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -407,8 +423,7 @@ msgstr "¿Seguro que quieres ejecutar la detección masiva? Puede que se añada un
msgid "Yes"
msgstr "Sí"
-#: gui/launcher.cpp:681
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -416,40 +431,52 @@ msgstr "Sí"
msgid "No"
msgstr "No"
-#: gui/launcher.cpp:728
+#: gui/launcher.cpp:761
msgid "ScummVM couldn't open the specified directory!"
msgstr "¡ScummVM no ha podido abrir el directorio!"
-#: gui/launcher.cpp:740
+#: gui/launcher.cpp:773
msgid "ScummVM could not find any game in the specified directory!"
msgstr "¡ScummVM no ha encontrado ningún juego en el directorio!"
-#: gui/launcher.cpp:754
+#: gui/launcher.cpp:787
msgid "Pick the game:"
msgstr "Elige el juego:"
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:863
msgid "Do you really want to remove this game configuration?"
msgstr "¿Seguro que quieres eliminar la configuración de este juego?"
-#: gui/launcher.cpp:893
+#: gui/launcher.cpp:926
msgid "This game does not support loading games from the launcher."
msgstr "Este juego no permite cargar partidas desde el lanzador."
-#: gui/launcher.cpp:897
+#: gui/launcher.cpp:930
msgid "ScummVM could not find any engine capable of running the selected game!"
-msgstr "¡ScummVM no ha podido encontrar ningún motor capaz de ejecutar el juego!"
+msgstr ""
+"¡ScummVM no ha podido encontrar ningún motor capaz de ejecutar el juego!"
-#: gui/launcher.cpp:1009
+#: gui/launcher.cpp:1044
+#, fuzzy
+msgctxt "lowres"
msgid "Mass Add..."
msgstr "Añadir varios..."
-#: gui/launcher.cpp:1010
+#: gui/launcher.cpp:1044
+msgid "Mass Add..."
+msgstr "Añadir varios..."
+
+#: gui/launcher.cpp:1045
+#, fuzzy
+msgctxt "lowres"
msgid "Add Game..."
msgstr "Añadir juego..."
-#: gui/massadd.cpp:79
-#: gui/massadd.cpp:82
+#: gui/launcher.cpp:1045
+msgid "Add Game..."
+msgstr "Añadir juego..."
+
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... progreso..."
@@ -512,265 +539,328 @@ msgstr "44 kHz"
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:632
+#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
+#: gui/options.cpp:555 gui/options.cpp:739
+#, fuzzy
+msgctxt "soundfont"
+msgid "None"
+msgstr "Ninguno"
+
+#: gui/options.cpp:635
msgid "Graphics mode:"
msgstr "Modo gráfico:"
-#: gui/options.cpp:643
+#: gui/options.cpp:646
msgid "Render mode:"
msgstr "Modo de renderizado:"
-#: gui/options.cpp:643
-#: gui/options.cpp:644
+#: gui/options.cpp:646 gui/options.cpp:647
msgid "Special dithering modes supported by some games"
msgstr "Modos especiales de expansión soportados por algunos juegos"
-#: gui/options.cpp:653
+#: gui/options.cpp:656
msgid "Fullscreen mode"
msgstr "Pantalla completa"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Aspect ratio correction"
msgstr "Corrección de aspecto"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Correct aspect ratio for 320x200 games"
msgstr "Corregir relación de aspecto en juegos 320x200"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Preferred Device:"
msgstr "Dispositivo preferido:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Music Device:"
msgstr "Dispositivo de música:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Specifies preferred sound device or sound card emulator"
-msgstr "Especifica qué dispositivo de sonido o emulador de tarjeta de sonido prefieres"
+msgstr ""
+"Especifica qué dispositivo de sonido o emulador de tarjeta de sonido "
+"prefieres"
-#: gui/options.cpp:663
-#: gui/options.cpp:664
+#: gui/options.cpp:666 gui/options.cpp:667
msgid "Specifies output sound device or sound card emulator"
-msgstr "Especifica el dispositivo de sonido o emulador de tarjeta de sonido de salida"
+msgstr ""
+"Especifica el dispositivo de sonido o emulador de tarjeta de sonido de salida"
-#: gui/options.cpp:688
+#: gui/options.cpp:692
msgid "AdLib emulator:"
msgstr "Emulador de AdLib:"
-#: gui/options.cpp:688
-#: gui/options.cpp:689
+#: gui/options.cpp:692 gui/options.cpp:693
msgid "AdLib is used for music in many games"
msgstr "AdLib se usa para la música en muchos juegos"
-#: gui/options.cpp:699
+#: gui/options.cpp:703
msgid "Output rate:"
msgstr "Frecuencia de salida:"
-#: gui/options.cpp:699
-#: gui/options.cpp:700
-msgid "Higher value specifies better sound quality but may be not supported by your soundcard"
-msgstr "Los valores más altos ofrecen mayor calidad, pero puede que tu tarjeta de sonido no sea compatible"
+#: gui/options.cpp:703 gui/options.cpp:704
+msgid ""
+"Higher value specifies better sound quality but may be not supported by your "
+"soundcard"
+msgstr ""
+"Los valores más altos ofrecen mayor calidad, pero puede que tu tarjeta de "
+"sonido no sea compatible"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "GM Device:"
msgstr "Dispositivo GM:"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "Specifies default sound device for General MIDI output"
msgstr "Especifica el dispositivo de salida General MIDI por defecto"
-#: gui/options.cpp:731
+#: gui/options.cpp:736
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:731
-#: gui/options.cpp:732
+#: gui/options.cpp:736 gui/options.cpp:738 gui/options.cpp:739
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "Algunas tarjetas de sonido, Fluidsynth y Timidity soportan SoundFont"
-#: gui/options.cpp:736
+#: gui/options.cpp:738
+#, fuzzy
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr "SoundFont:"
+
+#: gui/options.cpp:743
msgid "Mixed AdLib/MIDI mode"
msgstr "Modo AdLib/MIDI"
-#: gui/options.cpp:736
+#: gui/options.cpp:743
msgid "Use both MIDI and AdLib sound generation"
msgstr "Usar tanto MIDI como AdLib en la generación de sonido"
-#: gui/options.cpp:739
+#: gui/options.cpp:746
msgid "MIDI gain:"
msgstr "Ganancia MIDI:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "MT-32 Device:"
msgstr "Dispositivo MT-32:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
-msgstr "Especifica el dispositivo de sonido para la salida Roland MT-32/LAPC1/CM32l/CM64 por defecto"
+msgstr ""
+"Especifica el dispositivo de sonido para la salida Roland MT-32/LAPC1/CM32l/"
+"CM64 por defecto"
-#: gui/options.cpp:753
+#: gui/options.cpp:761
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 auténtica (desactivar emulación GM)"
-#: gui/options.cpp:753
-msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer"
-msgstr "Marcar si se quiere usar un dispositivo de sonido real conectado al ordenador y compatible con Roland"
+#: gui/options.cpp:761 gui/options.cpp:763
+msgid ""
+"Check if you want to use your real hardware Roland-compatible sound device "
+"connected to your computer"
+msgstr ""
+"Marcar si se quiere usar un dispositivo de sonido real conectado al "
+"ordenador y compatible con Roland"
-#: gui/options.cpp:756
+#: gui/options.cpp:763
+#, fuzzy
+msgctxt "lowres"
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr "Roland MT-32 auténtica (desactivar emulación GM)"
+
+#: gui/options.cpp:766
msgid "Enable Roland GS Mode"
msgstr "Activar modo Roland GS"
-#: gui/options.cpp:756
+#: gui/options.cpp:766
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
msgstr "Desactiva la conversión General MIDI en juegos con sonido Roland MT-32"
-#: gui/options.cpp:780
+#: gui/options.cpp:791
msgid "Text and Speech:"
msgstr "Texto y voces:"
-#: gui/options.cpp:785
-#: gui/options.cpp:791
+#: gui/options.cpp:795 gui/options.cpp:805
msgid "Speech"
msgstr "Voces"
-#: gui/options.cpp:786
-#: gui/options.cpp:792
+#: gui/options.cpp:796 gui/options.cpp:806
msgid "Subtitles"
msgstr "Subtítulos"
-#: gui/options.cpp:787
-#: gui/options.cpp:793
+#: gui/options.cpp:797
msgid "Both"
msgstr "Ambos"
-#: gui/options.cpp:791
+#: gui/options.cpp:799
+msgid "Subtitle speed:"
+msgstr "Velocidad de los subtítulos:"
+
+#: gui/options.cpp:801
+#, fuzzy
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr "Texto y voces:"
+
+#: gui/options.cpp:805
msgid "Spch"
msgstr "Voces"
-#: gui/options.cpp:792
+#: gui/options.cpp:806
msgid "Subs"
msgstr "Subt."
-#: gui/options.cpp:793
+#: gui/options.cpp:807
+#, fuzzy
+msgctxt "lowres"
+msgid "Both"
+msgstr "Ambos"
+
+#: gui/options.cpp:807
msgid "Show subtitles and play speech"
msgstr "Reproducir voces y subtítulos"
-#: gui/options.cpp:797
+#: gui/options.cpp:809
+#, fuzzy
+msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Velocidad de los subtítulos:"
-#: gui/options.cpp:809
+#: gui/options.cpp:825
msgid "Music volume:"
msgstr "Volumen de la música:"
-#: gui/options.cpp:816
+#: gui/options.cpp:827
+#, fuzzy
+msgctxt "lowres"
+msgid "Music volume:"
+msgstr "Volumen de la música:"
+
+#: gui/options.cpp:834
msgid "Mute All"
msgstr "Silenciar"
-#: gui/options.cpp:819
+#: gui/options.cpp:837
msgid "SFX volume:"
msgstr "Volumen de los efectos"
-#: gui/options.cpp:819
-#: gui/options.cpp:820
+#: gui/options.cpp:837 gui/options.cpp:839 gui/options.cpp:840
msgid "Special sound effects volume"
msgstr "Volumen de los efectos de sonido"
-#: gui/options.cpp:826
+#: gui/options.cpp:839
+#, fuzzy
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr "Volumen de los efectos"
+
+#: gui/options.cpp:847
msgid "Speech volume:"
msgstr "Volumen de las voces"
-#: gui/options.cpp:952
+#: gui/options.cpp:849
+#, fuzzy
+msgctxt "lowres"
+msgid "Speech volume:"
+msgstr "Volumen de las voces"
+
+#: gui/options.cpp:978
msgid "Save Path: "
msgstr "Partidas:"
-#: gui/options.cpp:955
+#: gui/options.cpp:981
msgid "Theme Path:"
msgstr "Temas:"
-#: gui/options.cpp:958
-#: gui/options.cpp:959
+#: gui/options.cpp:984 gui/options.cpp:985
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr "Especifica el directorio adicional usado por los juegos y ScummVM"
-#: gui/options.cpp:962
+#: gui/options.cpp:988
msgid "Plugins Path:"
msgstr "Plugins:"
-#: gui/options.cpp:970
+#: gui/options.cpp:997
msgid "Misc"
msgstr "Otros"
-#: gui/options.cpp:972
+#: gui/options.cpp:999
+#, fuzzy
+msgctxt "lowres"
+msgid "Misc"
+msgstr "Otros"
+
+#: gui/options.cpp:1001
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:976
+#: gui/options.cpp:1005
msgid "GUI Renderer:"
msgstr "Render de la interfaz"
-#: gui/options.cpp:982
+#: gui/options.cpp:1017
+msgid "Autosave:"
+msgstr "Autoguardado:"
+
+#: gui/options.cpp:1019
+#, fuzzy
+msgctxt "lowres"
msgid "Autosave:"
msgstr "Autoguardado:"
-#: gui/options.cpp:990
+#: gui/options.cpp:1027
msgid "Keys"
msgstr "Teclas"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "GUI Language:"
msgstr "Idioma de la interfaz:"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "Language of ScummVM GUI"
msgstr "Idioma de la interfaz de ScummVM"
-#: gui/options.cpp:1002
-msgid "English"
-msgstr "Inglés"
-
-#: gui/options.cpp:1146
+#: gui/options.cpp:1183
msgid "You have to restart ScummVM to take the effect."
msgstr "Tienes que reiniciar ScummVM para aplicar los cambios."
-#: gui/options.cpp:1159
+#: gui/options.cpp:1196
msgid "Select directory for savegames"
msgstr "Selecciona el directorio para partidas guardadas."
-#: gui/options.cpp:1166
+#: gui/options.cpp:1203
msgid "The chosen directory cannot be written to. Please select another one."
-msgstr "No se puede escribir en el directorio elegido. Por favor, selecciona otro."
+msgstr ""
+"No se puede escribir en el directorio elegido. Por favor, selecciona otro."
-#: gui/options.cpp:1175
+#: gui/options.cpp:1212
msgid "Select directory for GUI themes"
msgstr "Selecciona el directorio para temas de interfaz"
-#: gui/options.cpp:1185
+#: gui/options.cpp:1222
msgid "Select directory for extra files"
msgstr "Selecciona el directorio para archivos adicionales"
-#: gui/options.cpp:1196
+#: gui/options.cpp:1233
msgid "Select directory for plugins"
msgstr "Selecciona el directorio para plugins"
-#: gui/saveload.cpp:60
-#: gui/saveload.cpp:241
+#: gui/saveload.cpp:60 gui/saveload.cpp:241
msgid "No date saved"
msgstr "No hay fecha guardada"
-#: gui/saveload.cpp:61
-#: gui/saveload.cpp:242
+#: gui/saveload.cpp:61 gui/saveload.cpp:242
msgid "No time saved"
msgstr "No hay hora guardada"
-#: gui/saveload.cpp:62
-#: gui/saveload.cpp:243
+#: gui/saveload.cpp:62 gui/saveload.cpp:243
msgid "No playtime saved"
msgstr "No hay tiempo de juego guardado"
-#: gui/saveload.cpp:69
-#: gui/saveload.cpp:157
+#: gui/saveload.cpp:69 gui/saveload.cpp:157
msgid "Delete"
msgstr "Borrar"
@@ -790,8 +880,7 @@ msgstr "Hora:"
msgid "Playtime: "
msgstr "Tiempo de juego:"
-#: gui/saveload.cpp:286
-#: gui/saveload.cpp:353
+#: gui/saveload.cpp:286 gui/saveload.cpp:353
msgid "Untitled savestate"
msgstr "Partida sin nombre"
@@ -811,6 +900,18 @@ msgstr "Estándar (16bpp)"
msgid "Antialiased Renderer (16bpp)"
msgstr "Antialiasing (16bpp)"
+#: gui/ThemeEngine.cpp:341
+#, fuzzy
+msgctxt "lowres"
+msgid "Standard Renderer (16bpp)"
+msgstr "Estándar (16bpp)"
+
+#: gui/ThemeEngine.cpp:342
+#, fuzzy
+msgctxt "lowres"
+msgid "Antialiased Renderer (16bpp)"
+msgstr "Antialiasing (16bpp)"
+
#: base/main.cpp:205
#, c-format
msgid "Engine does not support debug level '%s'"
@@ -820,15 +921,13 @@ msgstr "El motor no soporta el nivel de debug '%s'"
msgid "Menu"
msgstr "Menú"
-#: base/main.cpp:276
-#: backends/platform/symbian/src/SymbianActions.cpp:48
+#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48
#: backends/platform/wince/CEActionsPocket.cpp:44
#: backends/platform/wince/CEActionsSmartphone.cpp:45
msgid "Skip"
msgstr "Saltar"
-#: base/main.cpp:279
-#: backends/platform/symbian/src/SymbianActions.cpp:53
+#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53
#: backends/platform/wince/CEActionsPocket.cpp:41
msgid "Pause"
msgstr "Pausar"
@@ -841,8 +940,7 @@ msgstr "Saltar frase"
msgid "Error running game:"
msgstr "Error al ejecutar el juego:"
-#: base/main.cpp:430
-#: base/main.cpp:431
+#: base/main.cpp:430 base/main.cpp:431
msgid "Could not find any engine capable of running the selected game"
msgstr "No se ha podido encontrar ningún motor capaz de ejecutar el juego"
@@ -894,8 +992,7 @@ msgstr "Lectura fallida"
msgid "Writing data failed"
msgstr "Escritura de datos fallida"
-#: common/error.cpp:60
-#: common/error.cpp:71
+#: common/error.cpp:60 common/error.cpp:71
msgid "Unknown Error"
msgstr "Error desconocido"
@@ -907,6 +1004,18 @@ msgstr "Hercules verde"
msgid "Hercules Amber"
msgstr "Hercules ámbar"
+#: common/util.cpp:262
+#, fuzzy
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr "Hercules verde"
+
+#: common/util.cpp:263
+#, fuzzy
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr "Hercules ámbar"
+
#: engines/dialogs.cpp:89
msgid "~R~esume"
msgstr "~R~eanudar"
@@ -931,16 +1040,21 @@ msgstr "~A~yuda"
msgid "~A~bout"
msgstr "Acerca ~d~e"
-#: engines/dialogs.cpp:109
+#: engines/dialogs.cpp:110
msgid "~R~eturn to Launcher"
msgstr "~V~olver al lanzador"
-#: engines/dialogs.cpp:119
+#: engines/dialogs.cpp:112
+#, fuzzy
+msgctxt "lowres"
+msgid "~R~eturn to Launcher"
+msgstr "~V~olver al lanzador"
+
+#: engines/dialogs.cpp:122
msgid "Save game:"
msgstr "Guardar partida"
-#: engines/dialogs.cpp:119
-#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: engines/dialogs.cpp:122 backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:44
@@ -948,19 +1062,17 @@ msgstr "Guardar partida"
msgid "Save"
msgstr "Guardar"
-#: engines/dialogs.cpp:301
-#: engines/mohawk/dialogs.cpp:84
+#: engines/dialogs.cpp:304 engines/mohawk/dialogs.cpp:84
#: engines/mohawk/dialogs.cpp:118
msgid "~O~K"
msgstr "~S~í"
-#: engines/dialogs.cpp:302
-#: engines/mohawk/dialogs.cpp:85
+#: engines/dialogs.cpp:305 engines/mohawk/dialogs.cpp:85
#: engines/mohawk/dialogs.cpp:119
msgid "~C~ancel"
msgstr "~C~ancelar"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:308
msgid "~K~eys"
msgstr "~T~eclas"
@@ -977,8 +1089,7 @@ msgstr "Si~g~uiente"
msgid "~C~lose"
msgstr "Cerra~r~"
-#: engines/mohawk/dialogs.cpp:81
-#: engines/mohawk/dialogs.cpp:115
+#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115
msgid "~Z~ip Mode Activated"
msgstr "Modo ~Z~ip activado"
@@ -1002,10 +1113,24 @@ msgstr "Emulador de DOSBox OPL"
msgid "No music"
msgstr "Sin música"
+#: sound/mods/paula.cpp:192
+#, fuzzy
+msgid "Amiga Audio Emulator"
+msgstr "Emulador de AdLib"
+
#: sound/softsynth/adlib.cpp:1590
msgid "AdLib Emulator"
msgstr "Emulador de AdLib"
+#: sound/softsynth/appleiigs.cpp:36
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr ""
+
+#: sound/softsynth/sid.cpp:1434
+#, fuzzy
+msgid "C64 Audio Emulator"
+msgstr "Emulador de AdLib"
+
#: sound/softsynth/mt32.cpp:327
msgid "Initialising MT-32 Emulator"
msgstr "Iniciando emulador de MT-32"
@@ -1132,6 +1257,12 @@ msgstr "Modo Touchpad desactivado."
msgid "Normal (no scaling)"
msgstr "Normal (sin escalado)"
+#: backends/platform/sdl/graphics.cpp:59
+#, fuzzy
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal (sin escalado)"
+
#: backends/platform/symbian/src/SymbianActions.cpp:41
#: backends/platform/wince/CEActionsSmartphone.cpp:38
msgid "Up"
@@ -1248,13 +1379,11 @@ msgstr "Aceleración del pad GC:"
msgid "DVD"
msgstr "DVD"
-#: backends/platform/wii/options.cpp:89
-#: backends/platform/wii/options.cpp:101
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
msgid "Status:"
msgstr "Estado:"
-#: backends/platform/wii/options.cpp:90
-#: backends/platform/wii/options.cpp:102
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
msgid "Unknown"
msgstr "Desconocido"
@@ -1298,47 +1427,47 @@ msgstr "Montar SMB"
msgid "Unmount SMB"
msgstr "Desmontar SMB"
-#: backends/platform/wii/options.cpp:145
+#: backends/platform/wii/options.cpp:143
msgid "DVD Mounted successfully"
msgstr "DVD montado con éxito"
-#: backends/platform/wii/options.cpp:148
+#: backends/platform/wii/options.cpp:146
msgid "Error while mounting the DVD"
msgstr "Error al montar el DVD"
-#: backends/platform/wii/options.cpp:150
+#: backends/platform/wii/options.cpp:148
msgid "DVD not mounted"
msgstr "DVD no montado"
-#: backends/platform/wii/options.cpp:163
+#: backends/platform/wii/options.cpp:161
msgid "Network up, share mounted"
msgstr "Red conectada, disco compartido montado"
-#: backends/platform/wii/options.cpp:165
+#: backends/platform/wii/options.cpp:163
msgid "Network up"
msgstr "Red conectada"
-#: backends/platform/wii/options.cpp:168
+#: backends/platform/wii/options.cpp:166
msgid ", error while mounting the share"
msgstr ", error al montar el disco compartido"
-#: backends/platform/wii/options.cpp:170
+#: backends/platform/wii/options.cpp:168
msgid ", share not mounted"
msgstr ", disco compartido no montado"
-#: backends/platform/wii/options.cpp:176
+#: backends/platform/wii/options.cpp:174
msgid "Network down"
msgstr "Red desconectada"
-#: backends/platform/wii/options.cpp:180
+#: backends/platform/wii/options.cpp:178
msgid "Initialising network"
msgstr "Inicializando red"
-#: backends/platform/wii/options.cpp:184
+#: backends/platform/wii/options.cpp:182
msgid "Timeout while initialising network"
msgstr "Se ha excedido el tiempo de inicialización de red"
-#: backends/platform/wii/options.cpp:188
+#: backends/platform/wii/options.cpp:186
#, c-format
msgid "Network not initialsed (%d)"
msgstr "Red no inicializada (%d)"
@@ -1426,3 +1555,10 @@ msgstr "Pantalla"
msgid "Do you want to perform an automatic scan ?"
msgstr "¿Quieres realizar una búsqueda automática?"
+#, fuzzy
+#~ msgctxt "lowres"
+#~ msgid "Special sound effects volume"
+#~ msgstr "Volumen de los efectos de sonido"
+
+#~ msgid "English"
+#~ msgstr "Inglés"
diff --git a/po/fr_FR.po b/po/fr_FR.po
index 51af254072..8d0af1d8b7 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.2.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2010-07-30 22:14+0100\n"
-"PO-Revision-Date: 2010-07-30 22:18+0100\n"
+"POT-Creation-Date: 2010-09-01 18:36+0300\n"
+"PO-Revision-Date: 2010-08-11 22:14+0100\n"
"Last-Translator: Thierry Crozat <criezy@scummvm.org>\n"
"Language-Team: French <scummvm-devel@lists.sf.net>\n"
"MIME-Version: 1.0\n"
@@ -38,27 +38,18 @@ msgstr "Remonter"
msgid "Go to previous directory level"
msgstr "Remonte d'un niveau dans la hiérarchie de répertoire"
-#: gui/browser.cpp:70
-#: gui/chooser.cpp:49
-#: gui/KeysDialog.cpp:46
-#: gui/launcher.cpp:280
-#: gui/massadd.cpp:95
-#: gui/options.cpp:1029
-#: gui/saveload.cpp:65
-#: gui/saveload.cpp:157
-#: gui/themebrowser.cpp:56
+#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46
+#: gui/launcher.cpp:304 gui/massadd.cpp:95 gui/options.cpp:1066
+#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56
#: backends/platform/wii/options.cpp:48
msgid "Cancel"
msgstr "Annuler"
-#: gui/browser.cpp:71
-#: gui/chooser.cpp:50
-#: gui/themebrowser.cpp:57
+#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57
msgid "Choose"
msgstr "Choisir"
-#: gui/GuiManager.cpp:103
-#: backends/keymapper/remap-dialog.cpp:54
+#: gui/GuiManager.cpp:103 backends/keymapper/remap-dialog.cpp:54
msgid "Close"
msgstr "Fermer"
@@ -66,13 +57,11 @@ msgstr "Fermer"
msgid "Mouse click"
msgstr "Clic de souris"
-#: gui/GuiManager.cpp:109
-#: base/main.cpp:285
+#: gui/GuiManager.cpp:109 base/main.cpp:285
msgid "Display keyboard"
msgstr "Afficher le clavier"
-#: gui/GuiManager.cpp:112
-#: base/main.cpp:288
+#: gui/GuiManager.cpp:112 base/main.cpp:288
msgid "Remap keys"
msgstr "Changer l'affectation des touches"
@@ -80,12 +69,8 @@ msgstr "Changer l'affectation des touches"
msgid "Map"
msgstr "Affecter"
-#: gui/KeysDialog.cpp:45
-#: gui/launcher.cpp:281
-#: gui/launcher.cpp:893
-#: gui/launcher.cpp:897
-#: gui/massadd.cpp:92
-#: gui/options.cpp:1030
+#: gui/KeysDialog.cpp:45 gui/launcher.cpp:305 gui/launcher.cpp:926
+#: gui/launcher.cpp:930 gui/massadd.cpp:92 gui/options.cpp:1067
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "OK"
@@ -95,16 +80,12 @@ msgstr "OK"
msgid "Select an action and click 'Map'"
msgstr "Selectionez une action et cliquez 'Affecter'"
-#: gui/KeysDialog.cpp:83
-#: gui/KeysDialog.cpp:105
-#: gui/KeysDialog.cpp:144
+#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144
#, c-format
msgid "Associated key : %s"
msgstr "Touche associée: %s"
-#: gui/KeysDialog.cpp:85
-#: gui/KeysDialog.cpp:107
-#: gui/KeysDialog.cpp:146
+#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146
#, c-format
msgid "Associated key : none"
msgstr "Touche associée: aucune"
@@ -129,17 +110,19 @@ msgstr "Jeu"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:175
-#: gui/launcher.cpp:176
-msgid "Short game identifier used for referring to savegames and running the game from the command line"
-msgstr "ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu depuis la ligne de commande"
+#: gui/launcher.cpp:175 gui/launcher.cpp:176
+msgid ""
+"Short game identifier used for referring to savegames and running the game "
+"from the command line"
+msgstr ""
+"ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu "
+"depuis la ligne de commande"
#: gui/launcher.cpp:179
msgid "Name:"
msgstr "Nom:"
-#: gui/launcher.cpp:179
-#: gui/launcher.cpp:180
+#: gui/launcher.cpp:179 gui/launcher.cpp:180
msgid "Full title of the game"
msgstr "Nom complet du jeu"
@@ -147,260 +130,283 @@ msgstr "Nom complet du jeu"
msgid "Language:"
msgstr "Langue:"
-#: gui/launcher.cpp:183
-#: gui/launcher.cpp:184
-msgid "Language of the game. This will not turn your Spanish game version into English"
-msgstr "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu."
+#: gui/launcher.cpp:183 gui/launcher.cpp:184
+msgid ""
+"Language of the game. This will not turn your Spanish game version into "
+"English"
+msgstr ""
+"Langue du jeu. Cela ne traduira pas en anglais par magie votre version "
+"espagnole du jeu."
-#: gui/launcher.cpp:185
-#: gui/launcher.cpp:196
-#: gui/options.cpp:80
-#: gui/options.cpp:635
-#: gui/options.cpp:645
-#: gui/options.cpp:1000
+#: gui/launcher.cpp:185 gui/launcher.cpp:199 gui/options.cpp:80
+#: gui/options.cpp:638 gui/options.cpp:648 gui/options.cpp:1037
#: sound/null.cpp:42
msgid "<default>"
msgstr "<defaut>"
-#: gui/launcher.cpp:194
+#: gui/launcher.cpp:195
msgid "Platform:"
msgstr "Plateforme:"
-#: gui/launcher.cpp:194
-#: gui/launcher.cpp:195
+#: gui/launcher.cpp:195 gui/launcher.cpp:197 gui/launcher.cpp:198
msgid "Platform the game was originally designed for"
msgstr "Plateforme pour laquelle votre jeu a été conçu"
-#: gui/launcher.cpp:206
-#: gui/options.cpp:898
-#: gui/options.cpp:915
+#: gui/launcher.cpp:197
+#, fuzzy
+msgctxt "lowres"
+msgid "Platform:"
+msgstr "Système:"
+
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "Graphics"
msgstr "Graphique"
-#: gui/launcher.cpp:206
-#: gui/options.cpp:898
-#: gui/options.cpp:915
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:208
+#: gui/launcher.cpp:212
msgid "Override global graphic settings"
msgstr "Utiliser des réglages graphiques spécifiques à ce jeux"
-#: gui/launcher.cpp:215
-#: gui/options.cpp:921
+#: gui/launcher.cpp:214
+msgctxt "lowres"
+msgid "Override global graphic settings"
+msgstr "Réglages spécifiques à ce jeux"
+
+#: gui/launcher.cpp:221 gui/options.cpp:944
msgid "Audio"
msgstr "Audio"
-#: gui/launcher.cpp:217
+#: gui/launcher.cpp:224
msgid "Override global audio settings"
msgstr "Utiliser des réglages audio spécifiques à ce jeux"
-#: gui/launcher.cpp:225
-#: gui/options.cpp:925
+#: gui/launcher.cpp:226
+msgctxt "lowres"
+msgid "Override global audio settings"
+msgstr "Réglages spécifiques à ce jeux"
+
+#: gui/launcher.cpp:235 gui/options.cpp:949
+msgid "Volume"
+msgstr "Volume"
+
+#: gui/launcher.cpp:237 gui/options.cpp:951
+msgctxt "lowres"
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:227
+#: gui/launcher.cpp:240
msgid "Override global volume settings"
msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeux"
-#: gui/launcher.cpp:234
-#: gui/options.cpp:933
+#: gui/launcher.cpp:242
+msgctxt "lowres"
+msgid "Override global volume settings"
+msgstr "Réglages spécifiques à ce jeux"
+
+#: gui/launcher.cpp:249 gui/options.cpp:959
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:236
+#: gui/launcher.cpp:252
msgid "Override global MIDI settings"
msgstr "Utiliser des réglages MIDI spécifiques à ce jeux"
-#: gui/launcher.cpp:246
-#: gui/options.cpp:939
+#: gui/launcher.cpp:254
+msgctxt "lowres"
+msgid "Override global MIDI settings"
+msgstr "Réglages spécifiques à ce jeux"
+
+#: gui/launcher.cpp:264 gui/options.cpp:965
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:248
+#: gui/launcher.cpp:267
msgid "Override global MT-32 settings"
msgstr "Utiliser des réglages MT-32 spécifiques à ce jeux"
-#: gui/launcher.cpp:258
-#: gui/options.cpp:945
+#: gui/launcher.cpp:269
+msgctxt "lowres"
+msgid "Override global MT-32 settings"
+msgstr "Réglages spécifiques à ce jeux"
+
+#: gui/launcher.cpp:279 gui/options.cpp:971
msgid "Paths"
msgstr "Chemins"
-#: gui/launcher.cpp:264
+#: gui/launcher.cpp:285
msgid "Game Path:"
msgstr "Chemin du Jeu:"
-#: gui/launcher.cpp:268
-#: gui/options.cpp:958
+#: gui/launcher.cpp:289 gui/options.cpp:984
msgid "Extra Path:"
msgstr "Extra:"
-#: gui/launcher.cpp:268
-#: gui/launcher.cpp:269
+#: gui/launcher.cpp:289 gui/launcher.cpp:290
msgid "Specifies path to additional data used the game"
msgstr "Définie un chemin vers des données suplémentaires utilisées par le jeu"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:294
msgid "Save Path:"
msgstr "Sauvegardes:"
-#: gui/launcher.cpp:272
-#: gui/launcher.cpp:273
-#: gui/options.cpp:952
-#: gui/options.cpp:953
+#: gui/launcher.cpp:294 gui/launcher.cpp:296 gui/launcher.cpp:297
+#: gui/options.cpp:978 gui/options.cpp:979
msgid "Specifies where your savegames are put"
msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés"
-#: gui/launcher.cpp:289
-#: gui/launcher.cpp:369
-#: gui/launcher.cpp:418
-#: gui/options.cpp:230
-#: gui/options.cpp:399
-#: gui/options.cpp:497
-#: gui/options.cpp:555
-#: gui/options.cpp:732
-#: gui/options.cpp:956
-#: gui/options.cpp:959
-#: gui/options.cpp:963
-#: gui/options.cpp:1053
-#: gui/options.cpp:1059
-#: gui/options.cpp:1065
-#: gui/options.cpp:1073
-#: gui/options.cpp:1097
-#: gui/options.cpp:1101
-#: gui/options.cpp:1107
-#: gui/options.cpp:1114
-#: gui/options.cpp:1213
+#: gui/launcher.cpp:296
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr "Sauvegardes:"
+
+#: gui/launcher.cpp:313 gui/launcher.cpp:393 gui/launcher.cpp:442
+#: gui/options.cpp:982 gui/options.cpp:985 gui/options.cpp:989
+#: gui/options.cpp:1090 gui/options.cpp:1096 gui/options.cpp:1102
+#: gui/options.cpp:1110 gui/options.cpp:1134 gui/options.cpp:1138
+#: gui/options.cpp:1144 gui/options.cpp:1151 gui/options.cpp:1250
+msgctxt "path"
msgid "None"
msgstr "Aucun"
-#: gui/launcher.cpp:294
-#: gui/launcher.cpp:373
+#: gui/launcher.cpp:318 gui/launcher.cpp:397
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Défaut"
-#: gui/launcher.cpp:411
-#: gui/options.cpp:1207
+#: gui/launcher.cpp:435 gui/options.cpp:1244
msgid "Select SoundFont"
msgstr "Choisir une banque de sons"
-#: gui/launcher.cpp:430
-#: gui/launcher.cpp:568
+#: gui/launcher.cpp:454 gui/launcher.cpp:601
msgid "Select directory with game data"
msgstr "Sélectionner le répertoire contenant les données du jeu"
-#: gui/launcher.cpp:448
+#: gui/launcher.cpp:472
msgid "Select additional game directory"
msgstr "Sélectionner un répertoire supplémentaire"
-#: gui/launcher.cpp:460
+#: gui/launcher.cpp:484
msgid "Select directory for saved games"
msgstr "Sélectionner le répertoire pour les sauvegardes"
-#: gui/launcher.cpp:479
+#: gui/launcher.cpp:503
msgid "This game ID is already taken. Please choose another one."
msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez en un autre svp."
-#: gui/launcher.cpp:520
-#: engines/dialogs.cpp:113
+#: gui/launcher.cpp:544 engines/dialogs.cpp:116
msgid "~Q~uit"
msgstr "~Q~uitter"
-#: gui/launcher.cpp:520
+#: gui/launcher.cpp:544
msgid "Quit ScummVM"
msgstr "Quitter ScummVM"
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "A~b~out..."
msgstr "À ~P~ropos..."
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "About ScummVM"
msgstr "À propos de ScummVM"
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "~O~ptions..."
msgstr "~O~ptions..."
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "Change global ScummVM options"
msgstr "Change les options globales de ScummVM"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "~S~tart"
msgstr "~D~émarrer"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "Start selected game"
msgstr "Démarre le jeu sélectionné"
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "~L~oad..."
msgstr "~C~harger"
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "Load savegame for selected game"
msgstr "Charge une sauvegarde pour le jeu sélectionné"
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556
msgid "~A~dd Game..."
msgstr "~A~jouter..."
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556 gui/launcher.cpp:563
msgid "Hold Shift for Mass Add"
-msgstr "Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif"
+msgstr ""
+"Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif"
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558
msgid "~E~dit Game..."
msgstr "~E~diter..."
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558 gui/launcher.cpp:565
msgid "Change game options"
msgstr "Change les options du jeu"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560
msgid "~R~emove Game"
msgstr "~S~upprimer"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560 gui/launcher.cpp:567
msgid "Remove game from the list. The game data files stay intact"
msgstr "Supprime le jeu de la liste. Les fichiers sont conservés"
-#: gui/launcher.cpp:542
+#: gui/launcher.cpp:563
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr "~A~jouter..."
+
+#: gui/launcher.cpp:565
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr "~E~diter..."
+
+#: gui/launcher.cpp:567
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr "~S~upprimer"
+
+#: gui/launcher.cpp:575
msgid "Search in game list"
msgstr "Recherche dans la liste de jeux"
-#: gui/launcher.cpp:546
-#: gui/launcher.cpp:1057
+#: gui/launcher.cpp:579 gui/launcher.cpp:1092
msgid "Search:"
msgstr "Filtre:"
-#: gui/launcher.cpp:549
-#: gui/options.cpp:733
+#: gui/launcher.cpp:582 gui/options.cpp:740
msgid "Clear value"
msgstr "Effacer la valeur"
-#: gui/launcher.cpp:571
-#: engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
msgid "Load game:"
msgstr "Charger le jeu:"
-#: gui/launcher.cpp:571
-#: engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:225
msgid "Load"
msgstr "Charger"
-#: gui/launcher.cpp:680
-msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games."
-msgstr "Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux."
+#: gui/launcher.cpp:713
+msgid ""
+"Do you really want to run the mass game detector? This could potentially add "
+"a huge number of games."
+msgstr ""
+"Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut "
+"potentiellement ajouter un grand nombre de jeux."
-#: gui/launcher.cpp:681
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -408,8 +414,7 @@ msgstr "Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut
msgid "Yes"
msgstr "Oui"
-#: gui/launcher.cpp:681
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -417,40 +422,52 @@ msgstr "Oui"
msgid "No"
msgstr "Non"
-#: gui/launcher.cpp:728
+#: gui/launcher.cpp:761
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM n'a pas pu ouvrir le répertoire sélectionné."
-#: gui/launcher.cpp:740
+#: gui/launcher.cpp:773
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM n'a pas trouvé de jeux dans le répertoire sélectionné."
-#: gui/launcher.cpp:754
+#: gui/launcher.cpp:787
msgid "Pick the game:"
msgstr "Choisissez le jeu:"
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:863
msgid "Do you really want to remove this game configuration?"
msgstr "Voulez-vous vraiment supprimer ce jeu?"
-#: gui/launcher.cpp:893
+#: gui/launcher.cpp:926
msgid "This game does not support loading games from the launcher."
-msgstr "Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu."
+msgstr ""
+"Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu."
-#: gui/launcher.cpp:897
+#: gui/launcher.cpp:930
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM n'a pas pu trouvé de moteur pour lancer le jeu sélectionné."
-#: gui/launcher.cpp:1009
+#: gui/launcher.cpp:1044
+#, fuzzy
+msgctxt "lowres"
msgid "Mass Add..."
msgstr "Ajout Massif..."
-#: gui/launcher.cpp:1010
+#: gui/launcher.cpp:1044
+msgid "Mass Add..."
+msgstr "Ajout Massif..."
+
+#: gui/launcher.cpp:1045
+#, fuzzy
+msgctxt "lowres"
msgid "Add Game..."
msgstr "Ajouter..."
-#: gui/massadd.cpp:79
-#: gui/massadd.cpp:82
+#: gui/launcher.cpp:1045
+msgid "Add Game..."
+msgstr "Ajouter..."
+
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... en cours ..."
@@ -513,265 +530,324 @@ msgstr "44 kHz"
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:632
+#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
+#: gui/options.cpp:555 gui/options.cpp:739
+msgctxt "soundfont"
+msgid "None"
+msgstr "Aucune"
+
+#: gui/options.cpp:635
msgid "Graphics mode:"
msgstr "Mode graphique:"
-#: gui/options.cpp:643
+#: gui/options.cpp:646
msgid "Render mode:"
msgstr "Mode de rendu:"
-#: gui/options.cpp:643
-#: gui/options.cpp:644
+#: gui/options.cpp:646 gui/options.cpp:647
msgid "Special dithering modes supported by some games"
msgstr "Mode spécial de tramage supporté par certains jeux"
-#: gui/options.cpp:653
+#: gui/options.cpp:656
msgid "Fullscreen mode"
msgstr "Plein écran"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Aspect ratio correction"
msgstr "Correction du rapport d'aspect"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Correct aspect ratio for 320x200 games"
msgstr "Corrige le rapport d'aspect pour les jeu 320x200"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Preferred Device:"
msgstr "Sortie Préféré:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Music Device:"
msgstr "Sortie Audio:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Specifies preferred sound device or sound card emulator"
-msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio préféré"
+msgstr ""
+"Spécifie le périphérique de sortie audio ou l'émulateur de carte audio "
+"préféré"
-#: gui/options.cpp:663
-#: gui/options.cpp:664
+#: gui/options.cpp:666 gui/options.cpp:667
msgid "Specifies output sound device or sound card emulator"
msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio"
-#: gui/options.cpp:688
+#: gui/options.cpp:692
msgid "AdLib emulator:"
msgstr "Émulateur AdLib:"
-#: gui/options.cpp:688
-#: gui/options.cpp:689
+#: gui/options.cpp:692 gui/options.cpp:693
msgid "AdLib is used for music in many games"
msgstr "AdLib est utilisé pour la musique dans de nombreux jeux"
-#: gui/options.cpp:699
+#: gui/options.cpp:703
msgid "Output rate:"
msgstr "Fréquence:"
-#: gui/options.cpp:699
-#: gui/options.cpp:700
-msgid "Higher value specifies better sound quality but may be not supported by your soundcard"
-msgstr "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas être supporté par votre carte son"
+#: gui/options.cpp:703 gui/options.cpp:704
+msgid ""
+"Higher value specifies better sound quality but may be not supported by your "
+"soundcard"
+msgstr ""
+"Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas "
+"être supporté par votre carte son"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "GM Device:"
msgstr "Sortie GM:"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "Specifies default sound device for General MIDI output"
msgstr "Spécifie le périphérique audio par défaut pour la sortie General MIDI"
-#: gui/options.cpp:731
+#: gui/options.cpp:736
msgid "SoundFont:"
msgstr "Banque de sons:"
-#: gui/options.cpp:731
-#: gui/options.cpp:732
+#: gui/options.cpp:736 gui/options.cpp:738 gui/options.cpp:739
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
-msgstr "La banque de sons est utilisée par certaines cartes audio, Fluidsynth et Timidity"
+msgstr ""
+"La banque de sons (SoundFont) est utilisée par certaines cartes audio, "
+"Fluidsynth et Timidity"
-#: gui/options.cpp:736
+#: gui/options.cpp:738
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr "SoundFont:"
+
+#: gui/options.cpp:743
msgid "Mixed AdLib/MIDI mode"
msgstr "Mode mixe AdLib/MIDI"
-#: gui/options.cpp:736
+#: gui/options.cpp:743
msgid "Use both MIDI and AdLib sound generation"
msgstr "Utiliser à la fois MIDI et AdLib"
-#: gui/options.cpp:739
+#: gui/options.cpp:746
msgid "MIDI gain:"
msgstr "Gain MIDI:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "MT-32 Device:"
msgstr "Sortie MT-32:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
-msgstr "Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/CM32l/CM64"
+msgstr ""
+"Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/"
+"CM32l/CM64"
-#: gui/options.cpp:753
+#: gui/options.cpp:761
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 exacte (désactive l'émulation GM)"
-#: gui/options.cpp:753
-msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer"
-msgstr "Vérifie si vous voulez utiliser un périphérique audio compatible Roland connecté à l'ordinateur"
+#: gui/options.cpp:761 gui/options.cpp:763
+msgid ""
+"Check if you want to use your real hardware Roland-compatible sound device "
+"connected to your computer"
+msgstr ""
+"Vérifie si vous voulez utiliser un périphérique audio compatible Roland "
+"connecté à l'ordinateur"
-#: gui/options.cpp:756
+#: gui/options.cpp:763
+msgctxt "lowres"
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr "Roland MT-32 exacte (pas d'ému GM)"
+
+#: gui/options.cpp:766
msgid "Enable Roland GS Mode"
msgstr "Activer le mode Roland GS"
-#: gui/options.cpp:756
+#: gui/options.cpp:766
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
msgstr "Désactiver la conversion des pistes MT-32 en General MIDI"
-#: gui/options.cpp:780
+#: gui/options.cpp:791
msgid "Text and Speech:"
msgstr "Dialogue:"
-#: gui/options.cpp:785
-#: gui/options.cpp:791
+#: gui/options.cpp:795 gui/options.cpp:805
msgid "Speech"
msgstr "Audio"
-#: gui/options.cpp:786
-#: gui/options.cpp:792
+#: gui/options.cpp:796 gui/options.cpp:806
msgid "Subtitles"
msgstr "Sous-titres"
-#: gui/options.cpp:787
-#: gui/options.cpp:793
+#: gui/options.cpp:797
msgid "Both"
msgstr "Les deux"
-#: gui/options.cpp:791
+#: gui/options.cpp:799
+msgid "Subtitle speed:"
+msgstr "Vitesse des ST:"
+
+#: gui/options.cpp:801
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr "Dialogue:"
+
+#: gui/options.cpp:805
msgid "Spch"
msgstr "Audio"
-#: gui/options.cpp:792
+#: gui/options.cpp:806
msgid "Subs"
msgstr "Subs"
-#: gui/options.cpp:793
+#: gui/options.cpp:807
+#, fuzzy
+msgctxt "lowres"
+msgid "Both"
+msgstr "Les deux"
+
+#: gui/options.cpp:807
msgid "Show subtitles and play speech"
msgstr "Affiche les sous-titres et joue les dialogues audio"
-#: gui/options.cpp:797
+#: gui/options.cpp:809
+msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Vitesse des ST:"
-#: gui/options.cpp:809
+#: gui/options.cpp:825
msgid "Music volume:"
msgstr "Volume Musique:"
-#: gui/options.cpp:816
+#: gui/options.cpp:827
+msgctxt "lowres"
+msgid "Music volume:"
+msgstr "Musique:"
+
+#: gui/options.cpp:834
msgid "Mute All"
msgstr "Silence"
-#: gui/options.cpp:819
+#: gui/options.cpp:837
msgid "SFX volume:"
msgstr "Volume Bruitage:"
-#: gui/options.cpp:819
-#: gui/options.cpp:820
+#: gui/options.cpp:837 gui/options.cpp:839 gui/options.cpp:840
msgid "Special sound effects volume"
msgstr "Volume des effets spéciaux sonores"
-#: gui/options.cpp:826
+#: gui/options.cpp:839
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr "Bruitage:"
+
+#: gui/options.cpp:847
msgid "Speech volume:"
msgstr "Volume Dialogues:"
-#: gui/options.cpp:952
+#: gui/options.cpp:849
+msgctxt "lowres"
+msgid "Speech volume:"
+msgstr "Dialogues:"
+
+#: gui/options.cpp:978
msgid "Save Path: "
msgstr "Sauvegardes:"
-#: gui/options.cpp:955
+#: gui/options.cpp:981
msgid "Theme Path:"
msgstr "Thèmes:"
-#: gui/options.cpp:958
-#: gui/options.cpp:959
+#: gui/options.cpp:984 gui/options.cpp:985
msgid "Specifies path to additional data used by all games or ScummVM"
-msgstr "Spécifie un chemin vers des données supplémentaires utilisées par tous les jeux ou ScummVM"
+msgstr ""
+"Spécifie un chemin vers des données supplémentaires utilisées par tous les "
+"jeux ou ScummVM"
-#: gui/options.cpp:962
+#: gui/options.cpp:988
msgid "Plugins Path:"
msgstr "Plugins:"
-#: gui/options.cpp:970
+#: gui/options.cpp:997
msgid "Misc"
msgstr "Divers"
-#: gui/options.cpp:972
+#: gui/options.cpp:999
+msgctxt "lowres"
+msgid "Misc"
+msgstr "Divers"
+
+#: gui/options.cpp:1001
msgid "Theme:"
msgstr "Thème:"
-#: gui/options.cpp:976
+#: gui/options.cpp:1005
msgid "GUI Renderer:"
msgstr "Interface:"
-#: gui/options.cpp:982
+#: gui/options.cpp:1017
msgid "Autosave:"
msgstr "Sauvegarde auto:"
-#: gui/options.cpp:990
+#: gui/options.cpp:1019
+#, fuzzy
+msgctxt "lowres"
+msgid "Autosave:"
+msgstr "Sauvegarde:"
+
+#: gui/options.cpp:1027
msgid "Keys"
msgstr "Touches"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "GUI Language:"
msgstr "Langue:"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "Language of ScummVM GUI"
msgstr "Langue de l'interface graphique de ScummVM"
-#: gui/options.cpp:1002
-msgid "English"
-msgstr "Anglais"
-
-#: gui/options.cpp:1146
+#: gui/options.cpp:1183
msgid "You have to restart ScummVM to take the effect."
-msgstr "Vous devez relancer ScummVM pour que le changement soit pris en compte."
+msgstr ""
+"Vous devez relancer ScummVM pour que le changement soit pris en compte."
-#: gui/options.cpp:1159
+#: gui/options.cpp:1196
msgid "Select directory for savegames"
msgstr "Sélectionner le répertoire pour les sauvegardes"
-#: gui/options.cpp:1166
+#: gui/options.cpp:1203
msgid "The chosen directory cannot be written to. Please select another one."
-msgstr "Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre répertoire."
+msgstr ""
+"Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre "
+"répertoire."
-#: gui/options.cpp:1175
+#: gui/options.cpp:1212
msgid "Select directory for GUI themes"
msgstr "Sélectionner le répertoire des thèmes d'interface"
-#: gui/options.cpp:1185
+#: gui/options.cpp:1222
msgid "Select directory for extra files"
msgstr "Sélectionner le répertoire pour les fichiers suplémentaires"
-#: gui/options.cpp:1196
+#: gui/options.cpp:1233
msgid "Select directory for plugins"
msgstr "Sélectionner le répertoire des plugins"
-#: gui/saveload.cpp:60
-#: gui/saveload.cpp:241
+#: gui/saveload.cpp:60 gui/saveload.cpp:241
msgid "No date saved"
msgstr "Date non sauvée"
-#: gui/saveload.cpp:61
-#: gui/saveload.cpp:242
+#: gui/saveload.cpp:61 gui/saveload.cpp:242
msgid "No time saved"
msgstr "Heure non sauvée"
-#: gui/saveload.cpp:62
-#: gui/saveload.cpp:243
+#: gui/saveload.cpp:62 gui/saveload.cpp:243
msgid "No playtime saved"
msgstr "Durée de jeu non sauvée"
-#: gui/saveload.cpp:69
-#: gui/saveload.cpp:157
+#: gui/saveload.cpp:69 gui/saveload.cpp:157
msgid "Delete"
msgstr "Supprimer"
@@ -791,8 +867,7 @@ msgstr "Heure:"
msgid "Playtime: "
msgstr "Durée de jeu:"
-#: gui/saveload.cpp:286
-#: gui/saveload.cpp:353
+#: gui/saveload.cpp:286 gui/saveload.cpp:353
msgid "Untitled savestate"
msgstr "Sauvegarde sans nom"
@@ -812,6 +887,16 @@ msgstr "Standard (16bpp)"
msgid "Antialiased Renderer (16bpp)"
msgstr "Anti-crénelé (16 bpp)"
+#: gui/ThemeEngine.cpp:341
+msgctxt "lowres"
+msgid "Standard Renderer (16bpp)"
+msgstr "Standard (16bpp)"
+
+#: gui/ThemeEngine.cpp:342
+msgctxt "lowres"
+msgid "Antialiased Renderer (16bpp)"
+msgstr "Anti-crénelé (16 bpp)"
+
#: base/main.cpp:205
#, c-format
msgid "Engine does not support debug level '%s'"
@@ -821,15 +906,13 @@ msgstr "Le niveau de debug '%s' n'est pas supporté par ce moteur de jeu"
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:276
-#: backends/platform/symbian/src/SymbianActions.cpp:48
+#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48
#: backends/platform/wince/CEActionsPocket.cpp:44
#: backends/platform/wince/CEActionsSmartphone.cpp:45
msgid "Skip"
msgstr "Passer"
-#: base/main.cpp:279
-#: backends/platform/symbian/src/SymbianActions.cpp:53
+#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53
#: backends/platform/wince/CEActionsPocket.cpp:41
msgid "Pause"
msgstr "Mettre en pause"
@@ -842,8 +925,7 @@ msgstr "Passer la phrase"
msgid "Error running game:"
msgstr "Erreur lors de l'éxécution du jeu:"
-#: base/main.cpp:430
-#: base/main.cpp:431
+#: base/main.cpp:430 base/main.cpp:431
msgid "Could not find any engine capable of running the selected game"
msgstr "Impossible de trouver un moteur pour exécuter le jeu sélectionné"
@@ -895,8 +977,7 @@ msgstr "Echec de la lecture"
msgid "Writing data failed"
msgstr "Echec de l'écriture des données"
-#: common/error.cpp:60
-#: common/error.cpp:71
+#: common/error.cpp:60 common/error.cpp:71
msgid "Unknown Error"
msgstr "Erreur inconnue"
@@ -908,6 +989,16 @@ msgstr "Hercules Vert"
msgid "Hercules Amber"
msgstr "Hercules Ambre"
+#: common/util.cpp:262
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr "Hercules Vert"
+
+#: common/util.cpp:263
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr "Hercules Ambre"
+
#: engines/dialogs.cpp:89
msgid "~R~esume"
msgstr "~R~eprendre"
@@ -932,16 +1023,20 @@ msgstr "~A~ide"
msgid "~A~bout"
msgstr "À ~P~ropos"
-#: engines/dialogs.cpp:109
+#: engines/dialogs.cpp:110
+msgid "~R~eturn to Launcher"
+msgstr "Retour au ~L~anceur"
+
+#: engines/dialogs.cpp:112
+msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "Retour au ~L~anceur"
-#: engines/dialogs.cpp:119
+#: engines/dialogs.cpp:122
msgid "Save game:"
msgstr "Sauvegarde:"
-#: engines/dialogs.cpp:119
-#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: engines/dialogs.cpp:122 backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:44
@@ -949,19 +1044,17 @@ msgstr "Sauvegarde:"
msgid "Save"
msgstr "Sauver"
-#: engines/dialogs.cpp:301
-#: engines/mohawk/dialogs.cpp:84
+#: engines/dialogs.cpp:304 engines/mohawk/dialogs.cpp:84
#: engines/mohawk/dialogs.cpp:118
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302
-#: engines/mohawk/dialogs.cpp:85
+#: engines/dialogs.cpp:305 engines/mohawk/dialogs.cpp:85
#: engines/mohawk/dialogs.cpp:119
msgid "~C~ancel"
msgstr "~A~nnuler"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:308
msgid "~K~eys"
msgstr "~T~ouches"
@@ -978,8 +1071,7 @@ msgstr "~S~uivant"
msgid "~C~lose"
msgstr "~F~ermer"
-#: engines/mohawk/dialogs.cpp:81
-#: engines/mohawk/dialogs.cpp:115
+#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115
msgid "~Z~ip Mode Activated"
msgstr "Mode ~Z~ip Activé"
@@ -1003,10 +1095,22 @@ msgstr "Émulateur DOSBox OPL"
msgid "No music"
msgstr "Pas de musique"
+#: sound/mods/paula.cpp:192
+msgid "Amiga Audio Emulator"
+msgstr "Émulateur Amiga Audio"
+
#: sound/softsynth/adlib.cpp:1590
msgid "AdLib Emulator"
msgstr "Émulateur AdLib"
+#: sound/softsynth/appleiigs.cpp:36
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Émulateur Apple II GS (PAS IMPLÉMENTÉ)"
+
+#: sound/softsynth/sid.cpp:1434
+msgid "C64 Audio Emulator"
+msgstr "Émulateur C64 Audio"
+
#: sound/softsynth/mt32.cpp:327
msgid "Initialising MT-32 Emulator"
msgstr "Initialisation de l'Émulateur MT-32"
@@ -1133,6 +1237,11 @@ msgstr "Mode touchpad désactivé"
msgid "Normal (no scaling)"
msgstr "Normal (échelle d'origine)"
+#: backends/platform/sdl/graphics.cpp:59
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal"
+
#: backends/platform/symbian/src/SymbianActions.cpp:41
#: backends/platform/wince/CEActionsSmartphone.cpp:38
msgid "Up"
@@ -1251,13 +1360,11 @@ msgstr "Acceleration du pad GC:"
msgid "DVD"
msgstr "DVD"
-#: backends/platform/wii/options.cpp:89
-#: backends/platform/wii/options.cpp:101
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
msgid "Status:"
msgstr "Status:"
-#: backends/platform/wii/options.cpp:90
-#: backends/platform/wii/options.cpp:102
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
msgid "Unknown"
msgstr "Inconue"
@@ -1302,52 +1409,52 @@ msgstr "Monter SMB"
msgid "Unmount SMB"
msgstr "Démonter SMB"
-#: backends/platform/wii/options.cpp:145
+#: backends/platform/wii/options.cpp:143
msgid "DVD Mounted successfully"
msgstr "DVD monté avec succès"
-#: backends/platform/wii/options.cpp:148
+#: backends/platform/wii/options.cpp:146
msgid "Error while mounting the DVD"
msgstr "Échec du montage du DVD"
-#: backends/platform/wii/options.cpp:150
+#: backends/platform/wii/options.cpp:148
msgid "DVD not mounted"
msgstr "DVD non monté"
-#: backends/platform/wii/options.cpp:163
+#: backends/platform/wii/options.cpp:161
#, fuzzy
msgid "Network up, share mounted"
msgstr "Réseau connecté, disque partagé monté"
-#: backends/platform/wii/options.cpp:165
+#: backends/platform/wii/options.cpp:163
#, fuzzy
msgid "Network up"
msgstr "Réseau connecté"
-#: backends/platform/wii/options.cpp:168
+#: backends/platform/wii/options.cpp:166
#, fuzzy
msgid ", error while mounting the share"
msgstr ", échec du montage du disque partagé"
-#: backends/platform/wii/options.cpp:170
+#: backends/platform/wii/options.cpp:168
#, fuzzy
msgid ", share not mounted"
msgstr ", disque partagé non monté"
-#: backends/platform/wii/options.cpp:176
+#: backends/platform/wii/options.cpp:174
#, fuzzy
msgid "Network down"
msgstr "Réseau déconnecté"
-#: backends/platform/wii/options.cpp:180
+#: backends/platform/wii/options.cpp:178
msgid "Initialising network"
msgstr "Initialisation du réseau"
-#: backends/platform/wii/options.cpp:184
+#: backends/platform/wii/options.cpp:182
msgid "Timeout while initialising network"
msgstr "Dépassement du délai lors de l'initialisation du réseau"
-#: backends/platform/wii/options.cpp:188
+#: backends/platform/wii/options.cpp:186
#, c-format
msgid "Network not initialsed (%d)"
msgstr "Réseau non initialisé (%d)"
@@ -1443,6 +1550,13 @@ msgstr "Affichage"
msgid "Do you want to perform an automatic scan ?"
msgstr "Voulez-vous exécuter une recherche automatique?"
+#~ msgctxt "lowres"
+#~ msgid "Special sound effects volume"
+#~ msgstr "Volume des effets spéciaux sonores"
+
+#~ msgid "English"
+#~ msgstr "Anglais"
+
#~ msgid "Failed to load any GUI theme, aborting"
#~ msgstr "Aucun thème GUI n'a pu être chargé; abandon"
diff --git a/po/hu_HU.po b/po/hu_HU.po
index 8478f2ffaa..2ddaf1adae 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM VERSION\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2010-07-30 22:14+0100\n"
+"POT-Creation-Date: 2010-09-01 18:36+0300\n"
"PO-Revision-Date: 2009-11-25 07:42-0500\n"
"Last-Translator: Alex Bevilacqua <alexbevi@gmail.com>\n"
"Language-Team: Hungarian\n"
@@ -39,7 +39,7 @@ msgid "Go to previous directory level"
msgstr ""
#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46
-#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029
+#: gui/launcher.cpp:304 gui/massadd.cpp:95 gui/options.cpp:1066
#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56
#: backends/platform/wii/options.cpp:48
msgid "Cancel"
@@ -69,8 +69,8 @@ msgstr ""
msgid "Map"
msgstr ""
-#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893
-#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030
+#: gui/KeysDialog.cpp:45 gui/launcher.cpp:305 gui/launcher.cpp:926
+#: gui/launcher.cpp:930 gui/massadd.cpp:92 gui/options.cpp:1067
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "OK"
@@ -134,220 +134,277 @@ msgid ""
"English"
msgstr ""
-#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80
-#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000
+#: gui/launcher.cpp:185 gui/launcher.cpp:199 gui/options.cpp:80
+#: gui/options.cpp:638 gui/options.cpp:648 gui/options.cpp:1037
#: sound/null.cpp:42
msgid "<default>"
msgstr "<alapértelmezett>"
-#: gui/launcher.cpp:194
+#: gui/launcher.cpp:195
msgid "Platform:"
msgstr ""
-#: gui/launcher.cpp:194 gui/launcher.cpp:195
+#: gui/launcher.cpp:195 gui/launcher.cpp:197 gui/launcher.cpp:198
msgid "Platform the game was originally designed for"
msgstr ""
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:197
+msgctxt "lowres"
+msgid "Platform:"
+msgstr ""
+
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "Graphics"
msgstr "Grafikával"
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "GFX"
msgstr ""
-#: gui/launcher.cpp:208
+#: gui/launcher.cpp:212
msgid "Override global graphic settings"
msgstr ""
-#: gui/launcher.cpp:215 gui/options.cpp:921
+#: gui/launcher.cpp:214
+msgctxt "lowres"
+msgid "Override global graphic settings"
+msgstr ""
+
+#: gui/launcher.cpp:221 gui/options.cpp:944
msgid "Audio"
msgstr "Hang"
-#: gui/launcher.cpp:217
+#: gui/launcher.cpp:224
+msgid "Override global audio settings"
+msgstr ""
+
+#: gui/launcher.cpp:226
+msgctxt "lowres"
msgid "Override global audio settings"
msgstr ""
-#: gui/launcher.cpp:225 gui/options.cpp:925
+#: gui/launcher.cpp:235 gui/options.cpp:949
msgid "Volume"
msgstr "Volumene"
-#: gui/launcher.cpp:227
+#: gui/launcher.cpp:237 gui/options.cpp:951
+#, fuzzy
+msgctxt "lowres"
+msgid "Volume"
+msgstr "Volumene"
+
+#: gui/launcher.cpp:240
msgid "Override global volume settings"
msgstr ""
-#: gui/launcher.cpp:234 gui/options.cpp:933
+#: gui/launcher.cpp:242
+msgctxt "lowres"
+msgid "Override global volume settings"
+msgstr ""
+
+#: gui/launcher.cpp:249 gui/options.cpp:959
msgid "MIDI"
msgstr ""
-#: gui/launcher.cpp:236
+#: gui/launcher.cpp:252
msgid "Override global MIDI settings"
msgstr ""
-#: gui/launcher.cpp:246 gui/options.cpp:939
+#: gui/launcher.cpp:254
+msgctxt "lowres"
+msgid "Override global MIDI settings"
+msgstr ""
+
+#: gui/launcher.cpp:264 gui/options.cpp:965
msgid "MT-32"
msgstr ""
-#: gui/launcher.cpp:248
+#: gui/launcher.cpp:267
msgid "Override global MT-32 settings"
msgstr ""
-#: gui/launcher.cpp:258 gui/options.cpp:945
+#: gui/launcher.cpp:269
+msgctxt "lowres"
+msgid "Override global MT-32 settings"
+msgstr ""
+
+#: gui/launcher.cpp:279 gui/options.cpp:971
msgid "Paths"
msgstr "Ösvények"
-#: gui/launcher.cpp:264
+#: gui/launcher.cpp:285
#, fuzzy
msgid "Game Path:"
msgstr "Extra Útvonal:"
-#: gui/launcher.cpp:268 gui/options.cpp:958
+#: gui/launcher.cpp:289 gui/options.cpp:984
msgid "Extra Path:"
msgstr "Extra Útvonal:"
-#: gui/launcher.cpp:268 gui/launcher.cpp:269
+#: gui/launcher.cpp:289 gui/launcher.cpp:290
msgid "Specifies path to additional data used the game"
msgstr ""
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:294
#, fuzzy
msgid "Save Path:"
msgstr "Extra Útvonal:"
-#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952
-#: gui/options.cpp:953
+#: gui/launcher.cpp:294 gui/launcher.cpp:296 gui/launcher.cpp:297
+#: gui/options.cpp:978 gui/options.cpp:979
msgid "Specifies where your savegames are put"
msgstr ""
-#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418
-#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
-#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956
-#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053
-#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073
-#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107
-#: gui/options.cpp:1114 gui/options.cpp:1213
+#: gui/launcher.cpp:296
+#, fuzzy
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr "Extra Útvonal:"
+
+#: gui/launcher.cpp:313 gui/launcher.cpp:393 gui/launcher.cpp:442
+#: gui/options.cpp:982 gui/options.cpp:985 gui/options.cpp:989
+#: gui/options.cpp:1090 gui/options.cpp:1096 gui/options.cpp:1102
+#: gui/options.cpp:1110 gui/options.cpp:1134 gui/options.cpp:1138
+#: gui/options.cpp:1144 gui/options.cpp:1151 gui/options.cpp:1250
+#, fuzzy
+msgctxt "path"
msgid "None"
msgstr "Semmi"
-#: gui/launcher.cpp:294 gui/launcher.cpp:373
+#: gui/launcher.cpp:318 gui/launcher.cpp:397
#: backends/platform/wii/options.cpp:56
#, fuzzy
msgid "Default"
msgstr "<alapértelmezett>"
-#: gui/launcher.cpp:411 gui/options.cpp:1207
+#: gui/launcher.cpp:435 gui/options.cpp:1244
msgid "Select SoundFont"
msgstr ""
-#: gui/launcher.cpp:430 gui/launcher.cpp:568
+#: gui/launcher.cpp:454 gui/launcher.cpp:601
msgid "Select directory with game data"
msgstr ""
-#: gui/launcher.cpp:448
+#: gui/launcher.cpp:472
msgid "Select additional game directory"
msgstr ""
-#: gui/launcher.cpp:460
+#: gui/launcher.cpp:484
msgid "Select directory for saved games"
msgstr ""
-#: gui/launcher.cpp:479
+#: gui/launcher.cpp:503
msgid "This game ID is already taken. Please choose another one."
msgstr ""
-#: gui/launcher.cpp:520 engines/dialogs.cpp:113
+#: gui/launcher.cpp:544 engines/dialogs.cpp:116
msgid "~Q~uit"
msgstr ""
-#: gui/launcher.cpp:520
+#: gui/launcher.cpp:544
msgid "Quit ScummVM"
msgstr ""
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "A~b~out..."
msgstr ""
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "About ScummVM"
msgstr ""
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "~O~ptions..."
msgstr ""
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "Change global ScummVM options"
msgstr ""
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "~S~tart"
msgstr ""
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "Start selected game"
msgstr ""
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "~L~oad..."
msgstr ""
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "Load savegame for selected game"
msgstr ""
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556
msgid "~A~dd Game..."
msgstr ""
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556 gui/launcher.cpp:563
msgid "Hold Shift for Mass Add"
msgstr ""
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558
msgid "~E~dit Game..."
msgstr ""
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558 gui/launcher.cpp:565
msgid "Change game options"
msgstr ""
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560
msgid "~R~emove Game"
msgstr ""
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560 gui/launcher.cpp:567
msgid "Remove game from the list. The game data files stay intact"
msgstr ""
-#: gui/launcher.cpp:542
+#: gui/launcher.cpp:563
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr ""
+
+#: gui/launcher.cpp:565
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr ""
+
+#: gui/launcher.cpp:567
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr ""
+
+#: gui/launcher.cpp:575
msgid "Search in game list"
msgstr ""
-#: gui/launcher.cpp:546 gui/launcher.cpp:1057
+#: gui/launcher.cpp:579 gui/launcher.cpp:1092
msgid "Search:"
msgstr ""
-#: gui/launcher.cpp:549 gui/options.cpp:733
+#: gui/launcher.cpp:582 gui/options.cpp:740
msgid "Clear value"
msgstr ""
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
msgid "Load game:"
msgstr ""
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:225
msgid "Load"
msgstr ""
-#: gui/launcher.cpp:680
+#: gui/launcher.cpp:713
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
msgstr ""
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -355,7 +412,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -364,35 +421,45 @@ msgstr ""
msgid "No"
msgstr "Semmi"
-#: gui/launcher.cpp:728
+#: gui/launcher.cpp:761
msgid "ScummVM couldn't open the specified directory!"
msgstr ""
-#: gui/launcher.cpp:740
+#: gui/launcher.cpp:773
msgid "ScummVM could not find any game in the specified directory!"
msgstr ""
-#: gui/launcher.cpp:754
+#: gui/launcher.cpp:787
msgid "Pick the game:"
msgstr ""
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:863
msgid "Do you really want to remove this game configuration?"
msgstr ""
-#: gui/launcher.cpp:893
+#: gui/launcher.cpp:926
msgid "This game does not support loading games from the launcher."
msgstr ""
-#: gui/launcher.cpp:897
+#: gui/launcher.cpp:930
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
-#: gui/launcher.cpp:1009
+#: gui/launcher.cpp:1044
+msgctxt "lowres"
+msgid "Mass Add..."
+msgstr ""
+
+#: gui/launcher.cpp:1044
msgid "Mass Add..."
msgstr ""
-#: gui/launcher.cpp:1010
+#: gui/launcher.cpp:1045
+msgctxt "lowres"
+msgid "Add Game..."
+msgstr ""
+
+#: gui/launcher.cpp:1045
msgid "Add Game..."
msgstr ""
@@ -459,243 +526,303 @@ msgstr ""
msgid "48 kHz"
msgstr ""
-#: gui/options.cpp:632
+#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
+#: gui/options.cpp:555 gui/options.cpp:739
+#, fuzzy
+msgctxt "soundfont"
+msgid "None"
+msgstr "Semmi"
+
+#: gui/options.cpp:635
msgid "Graphics mode:"
msgstr "Grafikus mód:"
-#: gui/options.cpp:643
+#: gui/options.cpp:646
msgid "Render mode:"
msgstr "Renderelési mód:"
-#: gui/options.cpp:643 gui/options.cpp:644
+#: gui/options.cpp:646 gui/options.cpp:647
msgid "Special dithering modes supported by some games"
msgstr ""
-#: gui/options.cpp:653
+#: gui/options.cpp:656
msgid "Fullscreen mode"
msgstr "Teljes képerny s mód:"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Aspect ratio correction"
msgstr "Aspect adag korrekció"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Correct aspect ratio for 320x200 games"
msgstr ""
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Preferred Device:"
msgstr ""
-#: gui/options.cpp:663
+#: gui/options.cpp:666
#, fuzzy
msgid "Music Device:"
msgstr "Zene mennyiség:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
-#: gui/options.cpp:663 gui/options.cpp:664
+#: gui/options.cpp:666 gui/options.cpp:667
msgid "Specifies output sound device or sound card emulator"
msgstr ""
-#: gui/options.cpp:688
+#: gui/options.cpp:692
msgid "AdLib emulator:"
msgstr "AdLib vezet :"
-#: gui/options.cpp:688 gui/options.cpp:689
+#: gui/options.cpp:692 gui/options.cpp:693
msgid "AdLib is used for music in many games"
msgstr ""
-#: gui/options.cpp:699
+#: gui/options.cpp:703
msgid "Output rate:"
msgstr "Kimeneti teljesítmény:"
-#: gui/options.cpp:699 gui/options.cpp:700
+#: gui/options.cpp:703 gui/options.cpp:704
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
msgstr ""
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "GM Device:"
msgstr ""
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "Specifies default sound device for General MIDI output"
msgstr ""
-#: gui/options.cpp:731
+#: gui/options.cpp:736
msgid "SoundFont:"
msgstr ""
-#: gui/options.cpp:731 gui/options.cpp:732
+#: gui/options.cpp:736 gui/options.cpp:738 gui/options.cpp:739
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
-#: gui/options.cpp:736
+#: gui/options.cpp:738
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr ""
+
+#: gui/options.cpp:743
msgid "Mixed AdLib/MIDI mode"
msgstr "Vegyes AdLib/MIDI mód"
-#: gui/options.cpp:736
+#: gui/options.cpp:743
msgid "Use both MIDI and AdLib sound generation"
msgstr ""
-#: gui/options.cpp:739
+#: gui/options.cpp:746
msgid "MIDI gain:"
msgstr "MIDI nyereség:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
#, fuzzy
msgid "MT-32 Device:"
msgstr "Zene mennyiség:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
-#: gui/options.cpp:753
+#: gui/options.cpp:761
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Igaz Roland MT-32 (megbénít GM emuláció)"
-#: gui/options.cpp:753
+#: gui/options.cpp:761 gui/options.cpp:763
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
msgstr ""
-#: gui/options.cpp:756
+#: gui/options.cpp:763
+#, fuzzy
+msgctxt "lowres"
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr "Igaz Roland MT-32 (megbénít GM emuláció)"
+
+#: gui/options.cpp:766
msgid "Enable Roland GS Mode"
msgstr "Képessé Roland GS Mode"
-#: gui/options.cpp:756
+#: gui/options.cpp:766
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
msgstr ""
-#: gui/options.cpp:780
+#: gui/options.cpp:791
msgid "Text and Speech:"
msgstr "Szöveg és beszéd:"
-#: gui/options.cpp:785 gui/options.cpp:791
+#: gui/options.cpp:795 gui/options.cpp:805
#, fuzzy
msgid "Speech"
msgstr "Csak a beszéd"
-#: gui/options.cpp:786 gui/options.cpp:792
+#: gui/options.cpp:796 gui/options.cpp:806
#, fuzzy
msgid "Subtitles"
msgstr "Csak feliratok"
-#: gui/options.cpp:787 gui/options.cpp:793
+#: gui/options.cpp:797
msgid "Both"
msgstr ""
-#: gui/options.cpp:791
+#: gui/options.cpp:799
+msgid "Subtitle speed:"
+msgstr "Felirat sebesség:"
+
+#: gui/options.cpp:801
+#, fuzzy
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr "Szöveg és beszéd:"
+
+#: gui/options.cpp:805
msgid "Spch"
msgstr ""
-#: gui/options.cpp:792
+#: gui/options.cpp:806
msgid "Subs"
msgstr ""
-#: gui/options.cpp:793
+#: gui/options.cpp:807
+msgctxt "lowres"
+msgid "Both"
+msgstr ""
+
+#: gui/options.cpp:807
msgid "Show subtitles and play speech"
msgstr ""
-#: gui/options.cpp:797
+#: gui/options.cpp:809
+#, fuzzy
+msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Felirat sebesség:"
-#: gui/options.cpp:809
+#: gui/options.cpp:825
msgid "Music volume:"
msgstr "Zene mennyiség:"
-#: gui/options.cpp:816
+#: gui/options.cpp:827
+#, fuzzy
+msgctxt "lowres"
+msgid "Music volume:"
+msgstr "Zene mennyiség:"
+
+#: gui/options.cpp:834
msgid "Mute All"
msgstr "Muta Összes"
-#: gui/options.cpp:819
+#: gui/options.cpp:837
msgid "SFX volume:"
msgstr "SFX mennyisége"
-#: gui/options.cpp:819 gui/options.cpp:820
+#: gui/options.cpp:837 gui/options.cpp:839 gui/options.cpp:840
msgid "Special sound effects volume"
msgstr ""
-#: gui/options.cpp:826
+#: gui/options.cpp:839
+#, fuzzy
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr "SFX mennyisége"
+
+#: gui/options.cpp:847
msgid "Speech volume:"
msgstr "Beszéd mennyiség:"
-#: gui/options.cpp:952
+#: gui/options.cpp:849
+#, fuzzy
+msgctxt "lowres"
+msgid "Speech volume:"
+msgstr "Beszéd mennyiség:"
+
+#: gui/options.cpp:978
msgid "Save Path: "
msgstr ""
-#: gui/options.cpp:955
+#: gui/options.cpp:981
msgid "Theme Path:"
msgstr ""
-#: gui/options.cpp:958 gui/options.cpp:959
+#: gui/options.cpp:984 gui/options.cpp:985
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
-#: gui/options.cpp:962
+#: gui/options.cpp:988
msgid "Plugins Path:"
msgstr ""
-#: gui/options.cpp:970
+#: gui/options.cpp:997
msgid "Misc"
msgstr ""
-#: gui/options.cpp:972
+#: gui/options.cpp:999
+msgctxt "lowres"
+msgid "Misc"
+msgstr ""
+
+#: gui/options.cpp:1001
msgid "Theme:"
msgstr "Téma:"
-#: gui/options.cpp:976
+#: gui/options.cpp:1005
msgid "GUI Renderer:"
msgstr "Leképez eszköz GUI:"
-#: gui/options.cpp:982
+#: gui/options.cpp:1017
+msgid "Autosave:"
+msgstr "Automatikus mentés:"
+
+#: gui/options.cpp:1019
+#, fuzzy
+msgctxt "lowres"
msgid "Autosave:"
msgstr "Automatikus mentés:"
-#: gui/options.cpp:990
+#: gui/options.cpp:1027
msgid "Keys"
msgstr "Kulcsok"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "GUI Language:"
msgstr ""
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "Language of ScummVM GUI"
msgstr ""
-#: gui/options.cpp:1002
-msgid "English"
-msgstr ""
-
-#: gui/options.cpp:1146
+#: gui/options.cpp:1183
msgid "You have to restart ScummVM to take the effect."
msgstr ""
-#: gui/options.cpp:1159
+#: gui/options.cpp:1196
msgid "Select directory for savegames"
msgstr ""
-#: gui/options.cpp:1166
+#: gui/options.cpp:1203
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
-#: gui/options.cpp:1175
+#: gui/options.cpp:1212
msgid "Select directory for GUI themes"
msgstr ""
-#: gui/options.cpp:1185
+#: gui/options.cpp:1222
msgid "Select directory for extra files"
msgstr ""
-#: gui/options.cpp:1196
+#: gui/options.cpp:1233
msgid "Select directory for plugins"
msgstr ""
@@ -752,6 +879,16 @@ msgstr ""
msgid "Antialiased Renderer (16bpp)"
msgstr ""
+#: gui/ThemeEngine.cpp:341
+msgctxt "lowres"
+msgid "Standard Renderer (16bpp)"
+msgstr ""
+
+#: gui/ThemeEngine.cpp:342
+msgctxt "lowres"
+msgid "Antialiased Renderer (16bpp)"
+msgstr ""
+
#: base/main.cpp:205
#, c-format
msgid "Engine does not support debug level '%s'"
@@ -845,6 +982,16 @@ msgstr ""
msgid "Hercules Amber"
msgstr ""
+#: common/util.cpp:262
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr ""
+
+#: common/util.cpp:263
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr ""
+
#: engines/dialogs.cpp:89
msgid "~R~esume"
msgstr ""
@@ -869,15 +1016,20 @@ msgstr ""
msgid "~A~bout"
msgstr ""
-#: engines/dialogs.cpp:109
+#: engines/dialogs.cpp:110
+msgid "~R~eturn to Launcher"
+msgstr ""
+
+#: engines/dialogs.cpp:112
+msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr ""
-#: engines/dialogs.cpp:119
+#: engines/dialogs.cpp:122
msgid "Save game:"
msgstr ""
-#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47
+#: engines/dialogs.cpp:122 backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:44
@@ -885,18 +1037,18 @@ msgstr ""
msgid "Save"
msgstr ""
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84
+#: engines/dialogs.cpp:304 engines/mohawk/dialogs.cpp:84
#: engines/mohawk/dialogs.cpp:118
#, fuzzy
msgid "~O~K"
msgstr "Igen"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85
+#: engines/dialogs.cpp:305 engines/mohawk/dialogs.cpp:85
#: engines/mohawk/dialogs.cpp:119
msgid "~C~ancel"
msgstr ""
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:308
#, fuzzy
msgid "~K~eys"
msgstr "Kulcsok"
@@ -939,11 +1091,25 @@ msgstr ""
msgid "No music"
msgstr ""
+#: sound/mods/paula.cpp:192
+#, fuzzy
+msgid "Amiga Audio Emulator"
+msgstr "AdLib vezet :"
+
#: sound/softsynth/adlib.cpp:1590
#, fuzzy
msgid "AdLib Emulator"
msgstr "AdLib vezet :"
+#: sound/softsynth/appleiigs.cpp:36
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr ""
+
+#: sound/softsynth/sid.cpp:1434
+#, fuzzy
+msgid "C64 Audio Emulator"
+msgstr "AdLib vezet :"
+
#: sound/softsynth/mt32.cpp:327
msgid "Initialising MT-32 Emulator"
msgstr ""
@@ -1071,6 +1237,11 @@ msgstr ""
msgid "Normal (no scaling)"
msgstr ""
+#: backends/platform/sdl/graphics.cpp:59
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr ""
+
#: backends/platform/symbian/src/SymbianActions.cpp:41
#: backends/platform/wince/CEActionsSmartphone.cpp:38
msgid "Up"
@@ -1239,47 +1410,47 @@ msgstr ""
msgid "Unmount SMB"
msgstr ""
-#: backends/platform/wii/options.cpp:145
+#: backends/platform/wii/options.cpp:143
msgid "DVD Mounted successfully"
msgstr ""
-#: backends/platform/wii/options.cpp:148
+#: backends/platform/wii/options.cpp:146
msgid "Error while mounting the DVD"
msgstr ""
-#: backends/platform/wii/options.cpp:150
+#: backends/platform/wii/options.cpp:148
msgid "DVD not mounted"
msgstr ""
-#: backends/platform/wii/options.cpp:163
+#: backends/platform/wii/options.cpp:161
msgid "Network up, share mounted"
msgstr ""
-#: backends/platform/wii/options.cpp:165
+#: backends/platform/wii/options.cpp:163
msgid "Network up"
msgstr ""
-#: backends/platform/wii/options.cpp:168
+#: backends/platform/wii/options.cpp:166
msgid ", error while mounting the share"
msgstr ""
-#: backends/platform/wii/options.cpp:170
+#: backends/platform/wii/options.cpp:168
msgid ", share not mounted"
msgstr ""
-#: backends/platform/wii/options.cpp:176
+#: backends/platform/wii/options.cpp:174
msgid "Network down"
msgstr ""
-#: backends/platform/wii/options.cpp:180
+#: backends/platform/wii/options.cpp:178
msgid "Initialising network"
msgstr ""
-#: backends/platform/wii/options.cpp:184
+#: backends/platform/wii/options.cpp:182
msgid "Timeout while initialising network"
msgstr ""
-#: backends/platform/wii/options.cpp:188
+#: backends/platform/wii/options.cpp:186
#, c-format
msgid "Network not initialsed (%d)"
msgstr ""
diff --git a/po/it_IT.po b/po/it_IT.po
index efb92c9db9..ba6ec80fd4 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.2.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2010-07-30 22:14+0100\n"
+"POT-Creation-Date: 2010-09-01 18:36+0300\n"
"PO-Revision-Date: 2010-06-30 23:56+0100\n"
"Last-Translator: Maff <matteo.maff at gmail dot com>\n"
"Language-Team: Italian\n"
@@ -38,7 +38,7 @@ msgid "Go to previous directory level"
msgstr "Vai alla cartella superiore"
#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46
-#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029
+#: gui/launcher.cpp:304 gui/massadd.cpp:95 gui/options.cpp:1066
#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56
#: backends/platform/wii/options.cpp:48
msgid "Cancel"
@@ -68,8 +68,8 @@ msgstr "Riprogramma tasti"
msgid "Map"
msgstr "Mappa"
-#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893
-#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030
+#: gui/KeysDialog.cpp:45 gui/launcher.cpp:305 gui/launcher.cpp:926
+#: gui/launcher.cpp:930 gui/massadd.cpp:92 gui/options.cpp:1067
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "OK"
@@ -136,212 +136,278 @@ msgid ""
msgstr ""
"Lingua del gioco. Un gioco inglese non potrà risultare tradotto in italiano"
-#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80
-#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000
+#: gui/launcher.cpp:185 gui/launcher.cpp:199 gui/options.cpp:80
+#: gui/options.cpp:638 gui/options.cpp:648 gui/options.cpp:1037
#: sound/null.cpp:42
msgid "<default>"
msgstr "<predefinito>"
-#: gui/launcher.cpp:194
+#: gui/launcher.cpp:195
msgid "Platform:"
msgstr "Piattaforma:"
-#: gui/launcher.cpp:194 gui/launcher.cpp:195
+#: gui/launcher.cpp:195 gui/launcher.cpp:197 gui/launcher.cpp:198
msgid "Platform the game was originally designed for"
msgstr "La piattaforma per la quale il gioco è stato concepito"
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:197
+#, fuzzy
+msgctxt "lowres"
+msgid "Platform:"
+msgstr "Piattaforma:"
+
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "Graphics"
msgstr "Grafica"
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "GFX"
msgstr "Grafica"
-#: gui/launcher.cpp:208
+#: gui/launcher.cpp:212
msgid "Override global graphic settings"
msgstr "Ignora le impostazioni grafiche globali"
-#: gui/launcher.cpp:215 gui/options.cpp:921
+#: gui/launcher.cpp:214
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global graphic settings"
+msgstr "Ignora le impostazioni grafiche globali"
+
+#: gui/launcher.cpp:221 gui/options.cpp:944
msgid "Audio"
msgstr "Audio"
-#: gui/launcher.cpp:217
+#: gui/launcher.cpp:224
msgid "Override global audio settings"
msgstr "Ignora le impostazioni audio globali"
-#: gui/launcher.cpp:225 gui/options.cpp:925
+#: gui/launcher.cpp:226
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global audio settings"
+msgstr "Ignora le impostazioni audio globali"
+
+#: gui/launcher.cpp:235 gui/options.cpp:949
+msgid "Volume"
+msgstr "Volume"
+
+#: gui/launcher.cpp:237 gui/options.cpp:951
+#, fuzzy
+msgctxt "lowres"
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:227
+#: gui/launcher.cpp:240
msgid "Override global volume settings"
msgstr "Ignora le impostazioni globali di volume"
-#: gui/launcher.cpp:234 gui/options.cpp:933
+#: gui/launcher.cpp:242
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global volume settings"
+msgstr "Ignora le impostazioni globali di volume"
+
+#: gui/launcher.cpp:249 gui/options.cpp:959
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:236
+#: gui/launcher.cpp:252
msgid "Override global MIDI settings"
msgstr "Ignora le impostazioni MIDI globali"
-#: gui/launcher.cpp:246 gui/options.cpp:939
+#: gui/launcher.cpp:254
+#, fuzzy
+msgctxt "lowres"
+msgid "Override global MIDI settings"
+msgstr "Ignora le impostazioni MIDI globali"
+
+#: gui/launcher.cpp:264 gui/options.cpp:965
msgid "MT-32"
msgstr ""
-#: gui/launcher.cpp:248
+#: gui/launcher.cpp:267
+#, fuzzy
+msgid "Override global MT-32 settings"
+msgstr "Ignora le impostazioni MIDI globali"
+
+#: gui/launcher.cpp:269
#, fuzzy
+msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Ignora le impostazioni MIDI globali"
-#: gui/launcher.cpp:258 gui/options.cpp:945
+#: gui/launcher.cpp:279 gui/options.cpp:971
msgid "Paths"
msgstr "Percorsi"
-#: gui/launcher.cpp:264
+#: gui/launcher.cpp:285
msgid "Game Path:"
msgstr "Percorso gioco:"
-#: gui/launcher.cpp:268 gui/options.cpp:958
+#: gui/launcher.cpp:289 gui/options.cpp:984
msgid "Extra Path:"
msgstr "Percorso extra:"
-#: gui/launcher.cpp:268 gui/launcher.cpp:269
+#: gui/launcher.cpp:289 gui/launcher.cpp:290
msgid "Specifies path to additional data used the game"
msgstr "Specifica il percorso di ulteriori dati usati dal gioco"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:294
msgid "Save Path:"
msgstr "Salvataggi:"
-#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952
-#: gui/options.cpp:953
+#: gui/launcher.cpp:294 gui/launcher.cpp:296 gui/launcher.cpp:297
+#: gui/options.cpp:978 gui/options.cpp:979
msgid "Specifies where your savegames are put"
msgstr "Specifica dove archiviare i salvataggi"
-#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418
-#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
-#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956
-#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053
-#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073
-#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107
-#: gui/options.cpp:1114 gui/options.cpp:1213
+#: gui/launcher.cpp:296
+#, fuzzy
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr "Salvataggi:"
+
+#: gui/launcher.cpp:313 gui/launcher.cpp:393 gui/launcher.cpp:442
+#: gui/options.cpp:982 gui/options.cpp:985 gui/options.cpp:989
+#: gui/options.cpp:1090 gui/options.cpp:1096 gui/options.cpp:1102
+#: gui/options.cpp:1110 gui/options.cpp:1134 gui/options.cpp:1138
+#: gui/options.cpp:1144 gui/options.cpp:1151 gui/options.cpp:1250
+#, fuzzy
+msgctxt "path"
msgid "None"
msgstr "Nessuno"
-#: gui/launcher.cpp:294 gui/launcher.cpp:373
+#: gui/launcher.cpp:318 gui/launcher.cpp:397
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Predefinito"
-#: gui/launcher.cpp:411 gui/options.cpp:1207
+#: gui/launcher.cpp:435 gui/options.cpp:1244
msgid "Select SoundFont"
msgstr "Seleziona SoundFont"
-#: gui/launcher.cpp:430 gui/launcher.cpp:568
+#: gui/launcher.cpp:454 gui/launcher.cpp:601
msgid "Select directory with game data"
msgstr "Seleziona la cartella contenente i file di gioco"
-#: gui/launcher.cpp:448
+#: gui/launcher.cpp:472
msgid "Select additional game directory"
msgstr "Seleziona la cartella di gioco aggiuntiva"
-#: gui/launcher.cpp:460
+#: gui/launcher.cpp:484
msgid "Select directory for saved games"
msgstr "Seleziona la cartella dei salvataggi"
-#: gui/launcher.cpp:479
+#: gui/launcher.cpp:503
msgid "This game ID is already taken. Please choose another one."
msgstr "Questo ID di gioco è già in uso. Si prega di sceglierne un'altro."
-#: gui/launcher.cpp:520 engines/dialogs.cpp:113
+#: gui/launcher.cpp:544 engines/dialogs.cpp:116
msgid "~Q~uit"
msgstr "C~h~iudi"
-#: gui/launcher.cpp:520
+#: gui/launcher.cpp:544
msgid "Quit ScummVM"
msgstr "Chiudi ScummVM"
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "A~b~out..."
msgstr "~I~nfo..."
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "About ScummVM"
msgstr "Informazioni su ScummVM"
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "~O~ptions..."
msgstr "~O~pzioni..."
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "Change global ScummVM options"
msgstr "Modifica le opzioni globali di ScummVM"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "~S~tart"
msgstr "~G~ioca"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "Start selected game"
msgstr "Esegue il gioco selezionato"
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "~L~oad..."
msgstr "~C~arica..."
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "Load savegame for selected game"
msgstr "Carica un salvataggio del gioco selezionato"
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556
msgid "~A~dd Game..."
msgstr "~A~ggiungi gioco..."
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556 gui/launcher.cpp:563
msgid "Hold Shift for Mass Add"
msgstr "Tieni premuto Shift per l'aggiunta in massa"
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558
msgid "~E~dit Game..."
msgstr "~M~odifica gioco..."
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558 gui/launcher.cpp:565
msgid "Change game options"
msgstr "Modifica le opzioni di gioco"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560
msgid "~R~emove Game"
msgstr "~R~imuovi gioco"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560 gui/launcher.cpp:567
msgid "Remove game from the list. The game data files stay intact"
msgstr "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti"
-#: gui/launcher.cpp:542
+#: gui/launcher.cpp:563
+#, fuzzy
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr "~A~ggiungi gioco..."
+
+#: gui/launcher.cpp:565
+#, fuzzy
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr "~M~odifica gioco..."
+
+#: gui/launcher.cpp:567
+#, fuzzy
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr "~R~imuovi gioco"
+
+#: gui/launcher.cpp:575
msgid "Search in game list"
msgstr "Cerca nella lista dei giochi"
-#: gui/launcher.cpp:546 gui/launcher.cpp:1057
+#: gui/launcher.cpp:579 gui/launcher.cpp:1092
msgid "Search:"
msgstr "Cerca:"
-#: gui/launcher.cpp:549 gui/options.cpp:733
+#: gui/launcher.cpp:582 gui/options.cpp:740
msgid "Clear value"
msgstr "Cancella"
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
msgid "Load game:"
msgstr "Carica gioco:"
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:225
msgid "Load"
msgstr "Carica"
-#: gui/launcher.cpp:680
+#: gui/launcher.cpp:713
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -349,7 +415,7 @@ msgstr ""
"Vuoi davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere "
"un numero enorme di giochi."
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -357,7 +423,7 @@ msgstr ""
msgid "Yes"
msgstr "Sì"
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -365,39 +431,51 @@ msgstr "Sì"
msgid "No"
msgstr "No"
-#: gui/launcher.cpp:728
+#: gui/launcher.cpp:761
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM non ha potuto aprire la cartella specificata!"
-#: gui/launcher.cpp:740
+#: gui/launcher.cpp:773
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!"
-#: gui/launcher.cpp:754
+#: gui/launcher.cpp:787
msgid "Pick the game:"
msgstr "Scegli il gioco:"
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:863
msgid "Do you really want to remove this game configuration?"
msgstr "Sei sicuro di voler rimuovere questa configurazione di gioco?"
-#: gui/launcher.cpp:893
+#: gui/launcher.cpp:926
msgid "This game does not support loading games from the launcher."
msgstr ""
"Questo gioco non supporta il caricamento di salvataggi dalla schermata di "
"avvio."
-#: gui/launcher.cpp:897
+#: gui/launcher.cpp:930
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM non ha potuto trovare un motore in grado di eseguire il gioco "
"selezionato!"
-#: gui/launcher.cpp:1009
+#: gui/launcher.cpp:1044
+#, fuzzy
+msgctxt "lowres"
msgid "Mass Add..."
msgstr "Agg. in massa..."
-#: gui/launcher.cpp:1010
+#: gui/launcher.cpp:1044
+msgid "Mass Add..."
+msgstr "Agg. in massa..."
+
+#: gui/launcher.cpp:1045
+#, fuzzy
+msgctxt "lowres"
+msgid "Add Game..."
+msgstr "Aggiungi gioco..."
+
+#: gui/launcher.cpp:1045
msgid "Add Game..."
msgstr "Aggiungi gioco..."
@@ -464,62 +542,69 @@ msgstr "44 kHz"
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:632
+#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
+#: gui/options.cpp:555 gui/options.cpp:739
+#, fuzzy
+msgctxt "soundfont"
+msgid "None"
+msgstr "Nessuno"
+
+#: gui/options.cpp:635
msgid "Graphics mode:"
msgstr "Modalità:"
-#: gui/options.cpp:643
+#: gui/options.cpp:646
msgid "Render mode:"
msgstr "Resa grafica:"
-#: gui/options.cpp:643 gui/options.cpp:644
+#: gui/options.cpp:646 gui/options.cpp:647
msgid "Special dithering modes supported by some games"
msgstr "Modalità di resa grafica speciali supportate da alcuni giochi"
-#: gui/options.cpp:653
+#: gui/options.cpp:656
msgid "Fullscreen mode"
msgstr "Modalità a schermo intero"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Aspect ratio correction"
msgstr "Correzione proporzioni"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Correct aspect ratio for 320x200 games"
msgstr "Corregge le proporzioni dei giochi 320x200"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Preferred Device:"
msgstr "Disp. preferito:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
#, fuzzy
msgid "Music Device:"
msgstr "Dispositivo GM:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
"Specifica il dispositivo audio o l'emulatore della scheda audio preferiti"
-#: gui/options.cpp:663 gui/options.cpp:664
+#: gui/options.cpp:666 gui/options.cpp:667
msgid "Specifies output sound device or sound card emulator"
msgstr ""
"Specifica il dispositivo di output audio o l'emulatore della scheda audio"
-#: gui/options.cpp:688
+#: gui/options.cpp:692
msgid "AdLib emulator:"
msgstr "Emulatore AdLib:"
-#: gui/options.cpp:688 gui/options.cpp:689
+#: gui/options.cpp:692 gui/options.cpp:693
msgid "AdLib is used for music in many games"
msgstr "AdLib è utilizzato per la musica in molti giochi"
-#: gui/options.cpp:699
+#: gui/options.cpp:703
msgid "Output rate:"
msgstr "Frequenza:"
-#: gui/options.cpp:699 gui/options.cpp:700
+#: gui/options.cpp:703 gui/options.cpp:704
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -527,50 +612,56 @@ msgstr ""
"Valori più alti restituiscono un suono di maggior qualità, ma potrebbero non "
"essere supportati dalla tua scheda audio"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "GM Device:"
msgstr "Dispositivo GM:"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "Specifies default sound device for General MIDI output"
msgstr "Specifica il dispositivo audio predefinito per l'output General MIDI"
-#: gui/options.cpp:731
+#: gui/options.cpp:736
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:731 gui/options.cpp:732
+#: gui/options.cpp:736 gui/options.cpp:738 gui/options.cpp:739
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "SoundFont è supportato da alcune schede audio, Fluidsynth e Timidity"
-#: gui/options.cpp:736
+#: gui/options.cpp:738
+#, fuzzy
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr "SoundFont:"
+
+#: gui/options.cpp:743
msgid "Mixed AdLib/MIDI mode"
msgstr "Modalità mista AdLib/MIDI"
-#: gui/options.cpp:736
+#: gui/options.cpp:743
msgid "Use both MIDI and AdLib sound generation"
msgstr "Utilizza generazione di suono sia MIDI che AdLib"
-#: gui/options.cpp:739
+#: gui/options.cpp:746
msgid "MIDI gain:"
msgstr "Guadagno MIDI:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
#, fuzzy
msgid "MT-32 Device:"
msgstr "Disposit. MT32:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/"
"CM32l/CM64"
-#: gui/options.cpp:753
+#: gui/options.cpp:761
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 effettivo (disattiva emulazione GM)"
-#: gui/options.cpp:753
+#: gui/options.cpp:761 gui/options.cpp:763
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -578,137 +669,187 @@ msgstr ""
"Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland "
"che è connesso al tuo computer"
-#: gui/options.cpp:756
+#: gui/options.cpp:763
+#, fuzzy
+msgctxt "lowres"
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr "Roland MT-32 effettivo (disattiva emulazione GM)"
+
+#: gui/options.cpp:766
msgid "Enable Roland GS Mode"
msgstr "Attiva la modalità Roland GS"
-#: gui/options.cpp:756
+#: gui/options.cpp:766
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
msgstr ""
"Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland "
"MT-32"
-#: gui/options.cpp:780
+#: gui/options.cpp:791
msgid "Text and Speech:"
msgstr "Testo e voci:"
-#: gui/options.cpp:785 gui/options.cpp:791
+#: gui/options.cpp:795 gui/options.cpp:805
msgid "Speech"
msgstr "Voci"
-#: gui/options.cpp:786 gui/options.cpp:792
+#: gui/options.cpp:796 gui/options.cpp:806
msgid "Subtitles"
msgstr "Sottotitoli"
-#: gui/options.cpp:787 gui/options.cpp:793
+#: gui/options.cpp:797
msgid "Both"
msgstr "Entrambi"
-#: gui/options.cpp:791
+#: gui/options.cpp:799
+msgid "Subtitle speed:"
+msgstr "Velocità testo:"
+
+#: gui/options.cpp:801
+#, fuzzy
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr "Testo e voci:"
+
+#: gui/options.cpp:805
msgid "Spch"
msgstr "Voci"
-#: gui/options.cpp:792
+#: gui/options.cpp:806
msgid "Subs"
msgstr "Sub"
-#: gui/options.cpp:793
+#: gui/options.cpp:807
+#, fuzzy
+msgctxt "lowres"
+msgid "Both"
+msgstr "Entrambi"
+
+#: gui/options.cpp:807
msgid "Show subtitles and play speech"
msgstr "Mostra i sottotitoli e attiva le voci"
-#: gui/options.cpp:797
+#: gui/options.cpp:809
+#, fuzzy
+msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Velocità testo:"
-#: gui/options.cpp:809
+#: gui/options.cpp:825
+msgid "Music volume:"
+msgstr "Volume musica:"
+
+#: gui/options.cpp:827
+#, fuzzy
+msgctxt "lowres"
msgid "Music volume:"
msgstr "Volume musica:"
-#: gui/options.cpp:816
+#: gui/options.cpp:834
msgid "Mute All"
msgstr "Disattiva audio"
-#: gui/options.cpp:819
+#: gui/options.cpp:837
msgid "SFX volume:"
msgstr "Volume effetti:"
-#: gui/options.cpp:819 gui/options.cpp:820
+#: gui/options.cpp:837 gui/options.cpp:839 gui/options.cpp:840
msgid "Special sound effects volume"
msgstr "Volume degli effetti sonori"
-#: gui/options.cpp:826
+#: gui/options.cpp:839
+#, fuzzy
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr "Volume effetti:"
+
+#: gui/options.cpp:847
+msgid "Speech volume:"
+msgstr "Volume voci:"
+
+#: gui/options.cpp:849
+#, fuzzy
+msgctxt "lowres"
msgid "Speech volume:"
msgstr "Volume voci:"
-#: gui/options.cpp:952
+#: gui/options.cpp:978
msgid "Save Path: "
msgstr "Salvataggi:"
-#: gui/options.cpp:955
+#: gui/options.cpp:981
msgid "Theme Path:"
msgstr "Percorso tema:"
-#: gui/options.cpp:958 gui/options.cpp:959
+#: gui/options.cpp:984 gui/options.cpp:985
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM"
-#: gui/options.cpp:962
+#: gui/options.cpp:988
msgid "Plugins Path:"
msgstr "Percorso plugin:"
-#: gui/options.cpp:970
+#: gui/options.cpp:997
+msgid "Misc"
+msgstr "Varie"
+
+#: gui/options.cpp:999
+#, fuzzy
+msgctxt "lowres"
msgid "Misc"
msgstr "Varie"
-#: gui/options.cpp:972
+#: gui/options.cpp:1001
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:976
+#: gui/options.cpp:1005
msgid "GUI Renderer:"
msgstr "Renderer GUI:"
-#: gui/options.cpp:982
+#: gui/options.cpp:1017
msgid "Autosave:"
msgstr "Autosalva:"
-#: gui/options.cpp:990
+#: gui/options.cpp:1019
+#, fuzzy
+msgctxt "lowres"
+msgid "Autosave:"
+msgstr "Autosalva:"
+
+#: gui/options.cpp:1027
msgid "Keys"
msgstr "Tasti"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "GUI Language:"
msgstr "Lingua GUI:"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "Language of ScummVM GUI"
msgstr "Lingua dell'interfaccia grafica di ScummVM"
-#: gui/options.cpp:1002
-msgid "English"
-msgstr "Inglese"
-
-#: gui/options.cpp:1146
+#: gui/options.cpp:1183
msgid "You have to restart ScummVM to take the effect."
msgstr "Devi riavviare ScummVM affinché le modifiche abbiano effetto."
-#: gui/options.cpp:1159
+#: gui/options.cpp:1196
msgid "Select directory for savegames"
msgstr "Seleziona la cartella per i salvataggi"
-#: gui/options.cpp:1166
+#: gui/options.cpp:1203
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "La cartella scelta è in sola lettura. Si prega di sceglierne un'altra."
-#: gui/options.cpp:1175
+#: gui/options.cpp:1212
msgid "Select directory for GUI themes"
msgstr "Seleziona la cartella dei temi dell'interfaccia"
-#: gui/options.cpp:1185
+#: gui/options.cpp:1222
msgid "Select directory for extra files"
msgstr "Seleziona la cartella dei file aggiuntivi"
-#: gui/options.cpp:1196
+#: gui/options.cpp:1233
msgid "Select directory for plugins"
msgstr "Seleziona la cartella dei plugin"
@@ -764,6 +905,18 @@ msgstr "Renderer standard (16bpp)"
msgid "Antialiased Renderer (16bpp)"
msgstr "Renderer con antialiasing (16bpp)"
+#: gui/ThemeEngine.cpp:341
+#, fuzzy
+msgctxt "lowres"
+msgid "Standard Renderer (16bpp)"
+msgstr "Renderer standard (16bpp)"
+
+#: gui/ThemeEngine.cpp:342
+#, fuzzy
+msgctxt "lowres"
+msgid "Antialiased Renderer (16bpp)"
+msgstr "Renderer con antialiasing (16bpp)"
+
#: base/main.cpp:205
#, c-format
msgid "Engine does not support debug level '%s'"
@@ -857,6 +1010,18 @@ msgstr "Hercules verde"
msgid "Hercules Amber"
msgstr "Hercules ambra"
+#: common/util.cpp:262
+#, fuzzy
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr "Hercules verde"
+
+#: common/util.cpp:263
+#, fuzzy
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr "Hercules ambra"
+
#: engines/dialogs.cpp:89
msgid "~R~esume"
msgstr "~R~ipristina"
@@ -881,15 +1046,21 @@ msgstr "~A~iuto"
msgid "~A~bout"
msgstr "~I~nfo"
-#: engines/dialogs.cpp:109
+#: engines/dialogs.cpp:110
msgid "~R~eturn to Launcher"
msgstr "~V~ai a schermata di avvio"
-#: engines/dialogs.cpp:119
+#: engines/dialogs.cpp:112
+#, fuzzy
+msgctxt "lowres"
+msgid "~R~eturn to Launcher"
+msgstr "~V~ai a schermata di avvio"
+
+#: engines/dialogs.cpp:122
msgid "Save game:"
msgstr "Salva gioco:"
-#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47
+#: engines/dialogs.cpp:122 backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:44
@@ -897,17 +1068,17 @@ msgstr "Salva gioco:"
msgid "Save"
msgstr "Salva"
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84
+#: engines/dialogs.cpp:304 engines/mohawk/dialogs.cpp:84
#: engines/mohawk/dialogs.cpp:118
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85
+#: engines/dialogs.cpp:305 engines/mohawk/dialogs.cpp:85
#: engines/mohawk/dialogs.cpp:119
msgid "~C~ancel"
msgstr "~A~nnulla"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:308
msgid "~K~eys"
msgstr "~T~asti"
@@ -948,10 +1119,24 @@ msgstr "Emulatore OPL DOSBox"
msgid "No music"
msgstr "Nessuna musica"
+#: sound/mods/paula.cpp:192
+#, fuzzy
+msgid "Amiga Audio Emulator"
+msgstr "Emulatore AdLib"
+
#: sound/softsynth/adlib.cpp:1590
msgid "AdLib Emulator"
msgstr "Emulatore AdLib"
+#: sound/softsynth/appleiigs.cpp:36
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr ""
+
+#: sound/softsynth/sid.cpp:1434
+#, fuzzy
+msgid "C64 Audio Emulator"
+msgstr "Emulatore AdLib"
+
#: sound/softsynth/mt32.cpp:327
msgid "Initialising MT-32 Emulator"
msgstr "Avvio in corso dell'emulatore MT-32"
@@ -1078,6 +1263,12 @@ msgstr "Modalità touchpad disattivata."
msgid "Normal (no scaling)"
msgstr "Normale (nessun ridimensionamento)"
+#: backends/platform/sdl/graphics.cpp:59
+#, fuzzy
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normale (nessun ridimensionamento)"
+
#: backends/platform/symbian/src/SymbianActions.cpp:41
#: backends/platform/wince/CEActionsSmartphone.cpp:38
msgid "Up"
@@ -1242,47 +1433,47 @@ msgstr "Monta SMB"
msgid "Unmount SMB"
msgstr "Smonta SMB"
-#: backends/platform/wii/options.cpp:145
+#: backends/platform/wii/options.cpp:143
msgid "DVD Mounted successfully"
msgstr "DVD montato con successo"
-#: backends/platform/wii/options.cpp:148
+#: backends/platform/wii/options.cpp:146
msgid "Error while mounting the DVD"
msgstr "Errore nel montare il DVD"
-#: backends/platform/wii/options.cpp:150
+#: backends/platform/wii/options.cpp:148
msgid "DVD not mounted"
msgstr "DVD non montato"
-#: backends/platform/wii/options.cpp:163
+#: backends/platform/wii/options.cpp:161
msgid "Network up, share mounted"
msgstr "Rete attiva, condivisione montata"
-#: backends/platform/wii/options.cpp:165
+#: backends/platform/wii/options.cpp:163
msgid "Network up"
msgstr "Rete attiva"
-#: backends/platform/wii/options.cpp:168
+#: backends/platform/wii/options.cpp:166
msgid ", error while mounting the share"
msgstr ", errore nel montare la condivisione"
-#: backends/platform/wii/options.cpp:170
+#: backends/platform/wii/options.cpp:168
msgid ", share not mounted"
msgstr ", condivisione non montata"
-#: backends/platform/wii/options.cpp:176
+#: backends/platform/wii/options.cpp:174
msgid "Network down"
msgstr "Rete disattivata"
-#: backends/platform/wii/options.cpp:180
+#: backends/platform/wii/options.cpp:178
msgid "Initialising network"
msgstr "Avvio rete in corso"
-#: backends/platform/wii/options.cpp:184
+#: backends/platform/wii/options.cpp:182
msgid "Timeout while initialising network"
msgstr "Attesa per l'avvio della rete"
-#: backends/platform/wii/options.cpp:188
+#: backends/platform/wii/options.cpp:186
#, c-format
msgid "Network not initialsed (%d)"
msgstr "Rete non avviata (%d)"
@@ -1369,3 +1560,11 @@ msgstr "Visualizza "
#: backends/platform/wince/CELauncherDialog.cpp:104
msgid "Do you want to perform an automatic scan ?"
msgstr "Vuoi eseguire una scansione automatica?"
+
+#, fuzzy
+#~ msgctxt "lowres"
+#~ msgid "Special sound effects volume"
+#~ msgstr "Volume degli effetti sonori"
+
+#~ msgid "English"
+#~ msgstr "Inglese"
diff --git a/po/module.mk b/po/module.mk
index eb9a85e4e3..c6109f69bc 100644
--- a/po/module.mk
+++ b/po/module.mk
@@ -2,8 +2,9 @@ POTFILE := $(srcdir)/po/scummvm.pot
POFILES := $(wildcard $(srcdir)/po/*.po)
updatepot:
- xgettext -f $(srcdir)/po/POTFILES -D $(srcdir) -d scummvm --c++ -k_ -k_s -o $(POTFILE) \
- "--copyright-holder=ScummVM Team" --package-name=ScummVM \
+ xgettext -f $(srcdir)/po/POTFILES -D $(srcdir) -d scummvm --c++ -k_ -k_s -k_c:1,2c -k_sc:1,2c \
+ -kDECLARE_TRANSLATION_ADDITIONAL_CONTEXT:1,2c -o $(POTFILE) \
+ --copyright-holder="ScummVM Team" --package-name=ScummVM \
--package-version=$(VERSION) --msgid-bugs-address=scummvm-devel@lists.sf.net -o $(POTFILE)_
sed -e 's/SOME DESCRIPTIVE TITLE/LANGUAGE translation for ScummVM/' \
@@ -35,9 +36,14 @@ updatepot:
#$(srcdir)/common/messages.cpp: $(POFILES)
# perl $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp
+translations-dat: tools/create_translations
+ tools/create_translations/create_translations $(POFILES)
+ mv translations.dat gui/themes/
+
+update-translations: updatepot $(POFILES) translations-dat
+
update-translations: updatepot $(POFILES)
@$(foreach file, $(POFILES), echo -n $(notdir $(basename $(file)))": ";msgfmt --statistic $(file);)
@rm -f messages.mo
- perl $(srcdir)/tools/po2c $(POFILES) > $(srcdir)/common/messages.cpp
-.PHONY: updatepot update-translations
+.PHONY: updatepot translations-dat update-translations
diff --git a/po/ru_RU.po b/po/ru_RU.po
index 45bd5ceae2..ca31e4e409 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -7,16 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM VERSION\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2010-07-30 22:14+0100\n"
+"POT-Creation-Date: 2010-08-31 20:55+0100\n"
"PO-Revision-Date: 2010-06-13 20:55+0300\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Russian\n"
+"Language: Russian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-5\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: Russian\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%"
-"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#: gui/about.cpp:96
#, c-format
@@ -40,7 +40,7 @@ msgid "Go to previous directory level"
msgstr "¿ÕàÕÙâØ ÝÐ ÔØàÕÚâÞàØî ãàÞÒÝÕÜ ÒëèÕ"
#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46
-#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029
+#: gui/launcher.cpp:304 gui/massadd.cpp:95 gui/options.cpp:1066
#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56
#: backends/platform/wii/options.cpp:48
msgid "Cancel"
@@ -70,8 +70,8 @@ msgstr "¿ÕàÕÝÐ×ÝÐçØâì ÚÛÐÒØèØ"
msgid "Map"
msgstr "½Ð×ÝÐçØâì"
-#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893
-#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030
+#: gui/KeysDialog.cpp:45 gui/launcher.cpp:305 gui/launcher.cpp:926
+#: gui/launcher.cpp:930 gui/massadd.cpp:92 gui/options.cpp:1067
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "OK"
@@ -139,211 +139,265 @@ msgstr ""
"Ï×ëÚ ØÓàë. ¸×ÜÕÝÕÝØÕ íâÞÓÞ ßÐàÐÜÕâàÐ ÝÕ ßàÕÒàÐâØâ ØÓàã ÝÐ ÐÝÓÛØÙáÚÞÜ Ò "
"àãááÚãî"
-#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80
-#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000
+#: gui/launcher.cpp:185 gui/launcher.cpp:199 gui/options.cpp:80
+#: gui/options.cpp:638 gui/options.cpp:648 gui/options.cpp:1037
#: sound/null.cpp:42
msgid "<default>"
msgstr "<ßÞ ãÜÞÛçÐÝØî>"
-#: gui/launcher.cpp:194
+#: gui/launcher.cpp:195
msgid "Platform:"
msgstr "¿ÛÐâäÞàÜÐ:"
-#: gui/launcher.cpp:194 gui/launcher.cpp:195
+#: gui/launcher.cpp:195 gui/launcher.cpp:197 gui/launcher.cpp:198
msgid "Platform the game was originally designed for"
msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ÚÞâÞàÞÙ ØÓàÐ ÑëÛÐ Ø×ÝÐçÐÛìÝÞ àÐ×àÐÑÞâÐÝÐ"
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:197
+msgctxt "lowres"
+msgid "Platform:"
+msgstr "¿ÛÐâäÞàÜÐ:"
+
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "Graphics"
msgstr "³àÐäØÚÐ"
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "GFX"
msgstr "³àä"
-#: gui/launcher.cpp:208
+#: gui/launcher.cpp:212
+msgid "Override global graphic settings"
+msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÐäØÚØ"
+
+#: gui/launcher.cpp:214
+msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÐäØÚØ"
-#: gui/launcher.cpp:215 gui/options.cpp:921
+#: gui/launcher.cpp:221 gui/options.cpp:944
msgid "Audio"
msgstr "°ãÔØÞ"
-#: gui/launcher.cpp:217
+#: gui/launcher.cpp:224
msgid "Override global audio settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÐãÔØÞ"
-#: gui/launcher.cpp:225 gui/options.cpp:925
+#: gui/launcher.cpp:226
+msgctxt "lowres"
+msgid "Override global audio settings"
+msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÐãÔØÞ"
+
+#: gui/launcher.cpp:235 gui/options.cpp:949
msgid "Volume"
msgstr "³àÞÜÚÞáâì"
-#: gui/launcher.cpp:227
+#: gui/launcher.cpp:237 gui/options.cpp:951
+msgctxt "lowres"
+msgid "Volume"
+msgstr "³àÞÜÚ"
+
+#: gui/launcher.cpp:240
+msgid "Override global volume settings"
+msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÞÜÚÞáâØ"
+
+#: gui/launcher.cpp:242
+msgctxt "lowres"
msgid "Override global volume settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÞÜÚÞáâØ"
-#: gui/launcher.cpp:234 gui/options.cpp:933
+#: gui/launcher.cpp:249 gui/options.cpp:959
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:236
+#: gui/launcher.cpp:252
+msgid "Override global MIDI settings"
+msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI"
+
+#: gui/launcher.cpp:254
+msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI"
-#: gui/launcher.cpp:246 gui/options.cpp:939
+#: gui/launcher.cpp:264 gui/options.cpp:965
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:248
+#: gui/launcher.cpp:267
msgid "Override global MT-32 settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MT-32"
-#: gui/launcher.cpp:258 gui/options.cpp:945
+#: gui/launcher.cpp:269
+msgctxt "lowres"
+msgid "Override global MT-32 settings"
+msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MT-32"
+
+#: gui/launcher.cpp:279 gui/options.cpp:971
msgid "Paths"
msgstr "¿ãâØ"
-#: gui/launcher.cpp:264
+#: gui/launcher.cpp:285
msgid "Game Path:"
msgstr "³ÔÕ ØÓàÐ: "
-#: gui/launcher.cpp:268 gui/options.cpp:958
+#: gui/launcher.cpp:289 gui/options.cpp:984
msgid "Extra Path:"
msgstr "´Þß. ßãâì:"
-#: gui/launcher.cpp:268 gui/launcher.cpp:269
+#: gui/launcher.cpp:289 gui/launcher.cpp:290
msgid "Specifies path to additional data used the game"
msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå ÔÛï ØÓàë"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:294
msgid "Save Path:"
-msgstr "¿ãâì áÞåà: "
+msgstr "ÁÞåàÐÝÕÝØï ØÓà: "
-#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952
-#: gui/options.cpp:953
+#: gui/launcher.cpp:294 gui/launcher.cpp:296 gui/launcher.cpp:297
+#: gui/options.cpp:978 gui/options.cpp:979
msgid "Specifies where your savegames are put"
msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú áÞåàÐÝÕÝØïÜ ØÓàë"
-#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418
-#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
-#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956
-#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053
-#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073
-#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107
-#: gui/options.cpp:1114 gui/options.cpp:1213
+#: gui/launcher.cpp:296
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr "¿ãâì áÞåà:"
+
+#: gui/launcher.cpp:313 gui/launcher.cpp:393 gui/launcher.cpp:442
+#: gui/options.cpp:982 gui/options.cpp:985 gui/options.cpp:989
+#: gui/options.cpp:1090 gui/options.cpp:1096 gui/options.cpp:1102
+#: gui/options.cpp:1110 gui/options.cpp:1134 gui/options.cpp:1138
+#: gui/options.cpp:1144 gui/options.cpp:1151 gui/options.cpp:1250
+msgctxt "path"
msgid "None"
msgstr "½Õ ×ÐÔÐÝ"
-#: gui/launcher.cpp:294 gui/launcher.cpp:373
+#: gui/launcher.cpp:318 gui/launcher.cpp:397
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "¿Þ ãÜÞÛçÐÝØî"
-#: gui/launcher.cpp:411 gui/options.cpp:1207
+#: gui/launcher.cpp:435 gui/options.cpp:1244
msgid "Select SoundFont"
msgstr "²ëÑÕàØâÕ SoundFont"
-#: gui/launcher.cpp:430 gui/launcher.cpp:568
+#: gui/launcher.cpp:454 gui/launcher.cpp:601
msgid "Select directory with game data"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á äÐÙÛÐÜØ ØÓàë"
-#: gui/launcher.cpp:448
+#: gui/launcher.cpp:472
msgid "Select additional game directory"
msgstr "²ëÑÕàØâÕ ÔÞßÞÛÝØâÕÛìÝãî ÔØàÕÚâÞàØî ØÓàë"
-#: gui/launcher.cpp:460
+#: gui/launcher.cpp:484
msgid "Select directory for saved games"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ"
-#: gui/launcher.cpp:479
+#: gui/launcher.cpp:503
msgid "This game ID is already taken. Please choose another one."
msgstr "ÍâÞâ ID ØÓàë ãÖÕ ØáßÞÛì×ãÕâáï. ¿ÞÖÐÛãÙáâÐ, ÒëÑÕàØâÕ ÔàãÓÞÙ."
-#: gui/launcher.cpp:520 engines/dialogs.cpp:113
+#: gui/launcher.cpp:544 engines/dialogs.cpp:116
msgid "~Q~uit"
msgstr "~²~ëåÞÔ"
-#: gui/launcher.cpp:520
+#: gui/launcher.cpp:544
msgid "Quit ScummVM"
msgstr "²ëåÞÔ Ø× ScummVM"
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "A~b~out..."
msgstr "¾ ß~à~ÞÓàÐÜÜÕ..."
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "About ScummVM"
msgstr "¾ ßàÞÓàÐÜÜÕ ScummVM"
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "~O~ptions..."
msgstr "~¾~ßæØØ..."
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "Change global ScummVM options"
msgstr "¸×ÜÕÝØâì ÓÛÞÑÐÛìÝëÕ ÞßæØØ ScummVM"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "~S~tart"
msgstr "¿~ã~áÚ"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "Start selected game"
msgstr "·ÐßãáâØâì ÒëÑàÐÝÝãî ØÓàã"
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "~L~oad..."
msgstr "~·~ÐÓàã×Øâì..."
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "Load savegame for selected game"
msgstr "·ÐÓàã×Øâì áÞåàÝÕÝØÕ ÔÛï ÒëÑàÐÝÝÞÙ ØÓàë"
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556
msgid "~A~dd Game..."
msgstr "~´~ÞÑ. ØÓàã..."
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556 gui/launcher.cpp:563
msgid "Hold Shift for Mass Add"
msgstr "ÃÔÕàÖØÒÐÙâÕ ÚÛÐÒØèã Shift ÔÛï âÞÓÞ, çâÞÑë ÔÞÑÐÒØâì ÝÕáÚÞÛìÚÞ ØÓà"
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558
msgid "~E~dit Game..."
msgstr "¾~ß~æØØ ØÓàë..."
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558 gui/launcher.cpp:565
msgid "Change game options"
msgstr "¸×ÜÕÝØâì ÞßæØØ ØÓàë"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560
msgid "~R~emove Game"
msgstr "~Ã~ÔÐÛØâì ØÓàã"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560 gui/launcher.cpp:567
msgid "Remove game from the list. The game data files stay intact"
msgstr "ÃÔÐÛØâì ØÓàã Ø× áßØáÚÐ. ½Õ ãÔÐÛïÕâ ØÓàã á ÖÕáâÚÞÓÞ ÔØáÚÐ"
-#: gui/launcher.cpp:542
+#: gui/launcher.cpp:563
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr "~´~ÞÑ. ØÓàã..."
+
+#: gui/launcher.cpp:565
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr "¾~ß~æØØ ØÓàë..."
+
+#: gui/launcher.cpp:567
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr "~Ã~ÔÐÛØâì ØÓàã"
+
+#: gui/launcher.cpp:575
msgid "Search in game list"
msgstr "¿ÞØáÚ Ò áßØáÚÕ ØÓà"
-#: gui/launcher.cpp:546 gui/launcher.cpp:1057
+#: gui/launcher.cpp:579 gui/launcher.cpp:1092
msgid "Search:"
msgstr "¿ÞØáÚ:"
-#: gui/launcher.cpp:549 gui/options.cpp:733
+#: gui/launcher.cpp:582 gui/options.cpp:740
msgid "Clear value"
msgstr "¾çØáâØâì ×ÝÐçÕÝØÕ"
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
msgid "Load game:"
msgstr "·ÐÓàã×Øâì ØÓàã:"
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:225
msgid "Load"
msgstr "·ÐÓàã×Øâì"
-#: gui/launcher.cpp:680
+#: gui/launcher.cpp:713
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -351,7 +405,7 @@ msgstr ""
"²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ×ÐßãáâØâì ÔÕâÕÚâÞà ÒáÕå ØÓà? ÍâÞ ßÞâÕÝæØÐÛìÝÞ ÜÞÖÕâ "
"ÔÞÑÐÒØâì ÑÞÛìèÞÕ ÚÞÛØçÕáâÒÞ ØÓà."
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -359,7 +413,7 @@ msgstr ""
msgid "Yes"
msgstr "´Ð"
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -367,35 +421,45 @@ msgstr "´Ð"
msgid "No"
msgstr "½Õâ"
-#: gui/launcher.cpp:728
+#: gui/launcher.cpp:761
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÕâ ÞâÚàëâì ãÚÐ×ÐÝÝãî ÔØàÕÚâÞàØî!"
-#: gui/launcher.cpp:740
+#: gui/launcher.cpp:773
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÕâ ÝÐÙâØ ØÓàã Ò ãÚÐ×ÐÝÝÞÙ ÔØàÕÚâÞàØØ!"
-#: gui/launcher.cpp:754
+#: gui/launcher.cpp:787
msgid "Pick the game:"
msgstr "²ëÑÕàØâÕ ØÓàã:"
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:863
msgid "Do you really want to remove this game configuration?"
msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì ãáâÐÝÞÒÚØ ÔÛï íâÞÙ ØÓàë?"
-#: gui/launcher.cpp:893
+#: gui/launcher.cpp:926
msgid "This game does not support loading games from the launcher."
msgstr "ÍâÐ ØÓàÐ ÝÕ ßÞÔÔÕàÖØÒÐÕâ ×ÐÓàã×Úã áÞåàÐÝÕÝØÙ çÕàÕ× ÓÛÐÒÝÞÕ ÜÕÝî."
-#: gui/launcher.cpp:897
+#: gui/launcher.cpp:930
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM ÝÕ áÜÞÓ ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚÐ ÒëÑàÐÝÝÞÙ ØÓàë!"
-#: gui/launcher.cpp:1009
+#: gui/launcher.cpp:1044
+msgctxt "lowres"
+msgid "Mass Add..."
+msgstr "¼ÝÞÓÞ ØÓà..."
+
+#: gui/launcher.cpp:1044
msgid "Mass Add..."
msgstr "¼ÝÞÓÞ ØÓà..."
-#: gui/launcher.cpp:1010
+#: gui/launcher.cpp:1045
+msgctxt "lowres"
+msgid "Add Game..."
+msgstr "½ÞÒÐï ØÓàÐ"
+
+#: gui/launcher.cpp:1045
msgid "Add Game..."
msgstr "½ÞÒÐï ØÓàÐ..."
@@ -462,59 +526,65 @@ msgstr "44 Ú³æ"
msgid "48 kHz"
msgstr "48 Ú³æ"
-#: gui/options.cpp:632
+#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
+#: gui/options.cpp:555 gui/options.cpp:739
+msgctxt "soundfont"
+msgid "None"
+msgstr "½Õ ×ÐÔÐÝ"
+
+#: gui/options.cpp:635
msgid "Graphics mode:"
msgstr "³àÐä. àÕÖØÜ:"
-#: gui/options.cpp:643
+#: gui/options.cpp:646
msgid "Render mode:"
msgstr "ÀÕÖØÜ àÐáâàÐ:"
-#: gui/options.cpp:643 gui/options.cpp:644
+#: gui/options.cpp:646 gui/options.cpp:647
msgid "Special dithering modes supported by some games"
msgstr "ÁßÕæØÐÛìÝëÕ àÕÖØÜë àÕÝÔÕàØÝÓÐ, ßÞÔÔÕàÖØÒÐÕÜëÕ ÝÕÚÞâÞàëÜØ ØÓàÐÜØ"
-#: gui/options.cpp:653
+#: gui/options.cpp:656
msgid "Fullscreen mode"
msgstr "¿ÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Aspect ratio correction"
msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Correct aspect ratio for 320x200 games"
msgstr "ºÞààÕÚâØàÞÒÐâì áÞÞâÝÞèÕÝØÕ áâÞàÞÝ ÔÛï ØÓà á àÐ×àÕèÕÝØÕÜ 320x200"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Preferred Device:"
msgstr "·ÒãÚÞÒÞÕ ãáâ-ÒÞ:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Music Device:"
msgstr "·ÒãÚÞÒÞÕ ãáâ-ÒÞ:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Specifies preferred sound device or sound card emulator"
msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë"
-#: gui/options.cpp:663 gui/options.cpp:664
+#: gui/options.cpp:666 gui/options.cpp:667
msgid "Specifies output sound device or sound card emulator"
msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë"
-#: gui/options.cpp:688
+#: gui/options.cpp:692
msgid "AdLib emulator:"
msgstr "ÍÜãÛïâÞà AdLib:"
-#: gui/options.cpp:688 gui/options.cpp:689
+#: gui/options.cpp:692 gui/options.cpp:693
msgid "AdLib is used for music in many games"
msgstr "·ÒãÚÞÒÐï ÚÐàâÐ AdLib ØáßÞÛì×ãÕâáï ÜÝÞÓØÜØ ØÓàÐÜØ"
-#: gui/options.cpp:699
+#: gui/options.cpp:703
msgid "Output rate:"
msgstr "ÇÐáâÞâÐ ×ÒãÚÐ:"
-#: gui/options.cpp:699 gui/options.cpp:700
+#: gui/options.cpp:703 gui/options.cpp:704
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -522,51 +592,56 @@ msgstr ""
"±¾ÛìèØÕ ×ÝÐçÕÝØï ×ÐÔÐîâ ÛãçèÕÕ ÚÐçÕáâÒÞ ×ÒãÚÐ, ÞÔÝÐÚÞ ÞÝØ ÜÞÓãâ ÝÕ "
"ßÞÔÔÕàÖØÒÐâìáï ÒÐèÕÙ ×ÒãÚÞÒÞÙ ÚÐàâÞÙ"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "GM Device:"
msgstr "ÃáâàÞÙáâÒÞ GM:"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "Specifies default sound device for General MIDI output"
msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ÔÛï MIDI"
-#: gui/options.cpp:731
+#: gui/options.cpp:736
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:731 gui/options.cpp:732
+#: gui/options.cpp:736 gui/options.cpp:738 gui/options.cpp:739
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFontë ßÞÔÔÕàÔÖØÒÐîâáï ÝÕÚÞâÞàëÜØ ×ÒãÚÞÒëÜØ ÚÐàâÐÜØ, Fluidsynth Ø "
"Timidity"
-#: gui/options.cpp:736
+#: gui/options.cpp:738
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr "SoundFont:"
+
+#: gui/options.cpp:743
msgid "Mixed AdLib/MIDI mode"
msgstr "ÁÜÕèÐÝÝëÙ àÕÖØÜ AdLib/MIDI"
-#: gui/options.cpp:736
+#: gui/options.cpp:743
msgid "Use both MIDI and AdLib sound generation"
msgstr "¸áßÞÛì×ÞÒÐâì Ø MIDI Ø AdLib ÔÛï ÓÕÝÕàÐæØØ ×ÒãÚÐ"
-#: gui/options.cpp:739
+#: gui/options.cpp:746
msgid "MIDI gain:"
msgstr "ÃáØÛÕÝØÕ MIDI:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "MT-32 Device:"
msgstr "Ãáâà. MT-32:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"ÃÚÐ×ëÒÐÕâ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ßÞ ãÜÞÛçÐÝØï ÔÛï ÒëÒÞÔÐ ÝÐ Roland MT-32/LAPC1/"
"CM32l/CM64"
-#: gui/options.cpp:753
+#: gui/options.cpp:761
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì íÜãÛïæØî GM)"
-#: gui/options.cpp:753
+#: gui/options.cpp:761 gui/options.cpp:763
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -574,138 +649,179 @@ msgstr ""
"¾âÜÕâìâÕ, ÕáÛØ ã ÒÐá ßÞÔÚÛîçÕÝÞ Roland-áÞÒÜÕáâØÜÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ Ø Òë "
"åÞâØâÕ ÕÓÞ ØáßÞÛì×ÞÒÐâì"
-#: gui/options.cpp:756
+#: gui/options.cpp:763
+msgctxt "lowres"
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì GM)"
+
+#: gui/options.cpp:766
msgid "Enable Roland GS Mode"
msgstr "²ÚÛîçØâì àÕÖØÜ Roland GS"
-#: gui/options.cpp:756
+#: gui/options.cpp:766
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
msgstr ""
"²ëÚÛîçÐÕâ ÜÐßßØÝÓ General MIDI ÔÛï ØÓà á ×ÒãÚÞÒÞÙ ÔÞàÞÖÚÞÙ ÔÛï Roland MT-32"
-#: gui/options.cpp:780
+#: gui/options.cpp:791
msgid "Text and Speech:"
msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:"
-#: gui/options.cpp:785 gui/options.cpp:791
+#: gui/options.cpp:795 gui/options.cpp:805
msgid "Speech"
msgstr "¾×ÒãçÚÐ"
-#: gui/options.cpp:786 gui/options.cpp:792
+#: gui/options.cpp:796 gui/options.cpp:806
msgid "Subtitles"
msgstr "ÁãÑâØâàë"
-#: gui/options.cpp:787 gui/options.cpp:793
+#: gui/options.cpp:797
msgid "Both"
msgstr "²áñ"
-#: gui/options.cpp:791
+#: gui/options.cpp:799
+msgid "Subtitle speed:"
+msgstr "ÁÚÞàÞáâì âØâàÞÒ:"
+
+#: gui/options.cpp:801
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:"
+
+#: gui/options.cpp:805
msgid "Spch"
msgstr "¾×Ò"
-#: gui/options.cpp:792
+#: gui/options.cpp:806
msgid "Subs"
msgstr "狄"
-#: gui/options.cpp:793
+#: gui/options.cpp:807
+msgctxt "lowres"
+msgid "Both"
+msgstr "²áñ"
+
+#: gui/options.cpp:807
msgid "Show subtitles and play speech"
msgstr "¿ÞÚÐ×ëÒÐâì áãÑâØâàë Ø ÒÞáßàÞØ×ÒÞÔØâì àÕçì"
-#: gui/options.cpp:797
+#: gui/options.cpp:809
+msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "ÁÚÞàÞáâì âØâàÞÒ:"
-#: gui/options.cpp:809
+#: gui/options.cpp:825
msgid "Music volume:"
msgstr "³àÞÜÚ. Üã×ëÚØ:"
-#: gui/options.cpp:816
+#: gui/options.cpp:827
+msgctxt "lowres"
+msgid "Music volume:"
+msgstr "³àÞÜÚ. Üã×ëÚØ:"
+
+#: gui/options.cpp:834
msgid "Mute All"
msgstr "²ëÚÛ. Òáñ"
-#: gui/options.cpp:819
+#: gui/options.cpp:837
msgid "SFX volume:"
-msgstr "³àÞÜÚ. SFX:"
+msgstr "³àÞÜÚÞáâì SFX:"
-#: gui/options.cpp:819 gui/options.cpp:820
+#: gui/options.cpp:837 gui/options.cpp:839 gui/options.cpp:840
msgid "Special sound effects volume"
msgstr "³àÞÜÚÞáâì áßÕæØÐÛìÝëå ×ÒãÚÞÒëå íääÕÚâÞÒ"
-#: gui/options.cpp:826
+#: gui/options.cpp:839
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr "³àÞÜÚ. SFX:"
+
+#: gui/options.cpp:847
+msgid "Speech volume:"
+msgstr "³àÞÜÚ. Þ×ÒãçÚØ:"
+
+#: gui/options.cpp:849
+msgctxt "lowres"
msgid "Speech volume:"
msgstr "³àÞÜÚ. Þ×ÒãçÚØ:"
-#: gui/options.cpp:952
+#: gui/options.cpp:978
msgid "Save Path: "
msgstr "ÁÞåàÐÝÕÝØï ØÓà:"
-#: gui/options.cpp:955
+#: gui/options.cpp:981
msgid "Theme Path:"
msgstr "³ÔÕ âÕÜë:"
-#: gui/options.cpp:958 gui/options.cpp:959
+#: gui/options.cpp:984 gui/options.cpp:985
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå, ØáßÞÛì×ãÕÜëå ÒáÕÜØ ØÓàÐÜØ, "
"ÛØÑÞ ScummVM"
-#: gui/options.cpp:962
+#: gui/options.cpp:988
msgid "Plugins Path:"
msgstr "¿ãâì Ú ßÛÐÓØÝÐÜ:"
-#: gui/options.cpp:970
+#: gui/options.cpp:997
msgid "Misc"
msgstr "ÀÐ×ÝÞÕ"
-#: gui/options.cpp:972
+#: gui/options.cpp:999
+msgctxt "lowres"
+msgid "Misc"
+msgstr "ÀÐ×ÝÞÕ"
+
+#: gui/options.cpp:1001
msgid "Theme:"
msgstr "ÂÕÜÐ:"
-#: gui/options.cpp:976
+#: gui/options.cpp:1005
msgid "GUI Renderer:"
msgstr "ÀØáÞÒÐÛÚÐ GUI:"
-#: gui/options.cpp:982
+#: gui/options.cpp:1017
msgid "Autosave:"
msgstr "°ÒâÞáÞåàÐÝÕÝØÕ:"
-#: gui/options.cpp:990
+#: gui/options.cpp:1019
+msgctxt "lowres"
+msgid "Autosave:"
+msgstr "°ÒâÞáÞåà.:"
+
+#: gui/options.cpp:1027
msgid "Keys"
msgstr "ºÛÐÒØèØ"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "GUI Language:"
msgstr "Ï×ëÚ GUI:"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "Language of ScummVM GUI"
msgstr "Ï×ëÚ ÓàÐäØçÕáÚÞÓÞ ØÝâÕàäÕÙáÐ ScummVM"
-#: gui/options.cpp:1002
-msgid "English"
-msgstr "English"
-
-#: gui/options.cpp:1146
+#: gui/options.cpp:1183
msgid "You have to restart ScummVM to take the effect."
msgstr "²ë ÔÞÛÖÝë ßÕàÕ×ÐßãáâØâì ScummVM çâÞÑë ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï."
-#: gui/options.cpp:1159
+#: gui/options.cpp:1196
msgid "Select directory for savegames"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ"
-#: gui/options.cpp:1166
+#: gui/options.cpp:1203
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "½Õ ÜÞÓã ßØáÐâì Ò ÒëÑàÐÝÝãî ÔØàÕÚâÞàØî. ¿ÞÖÐÛãÙáâÐ, ãÚÐÖØâÕ ÔàãÓãî."
-#: gui/options.cpp:1175
+#: gui/options.cpp:1212
msgid "Select directory for GUI themes"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï âÕÜ GUI"
-#: gui/options.cpp:1185
+#: gui/options.cpp:1222
msgid "Select directory for extra files"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ÔÞßÞÛÝØâÕÛìÝëÜØ äÐÙÛÐÜØ"
-#: gui/options.cpp:1196
+#: gui/options.cpp:1233
msgid "Select directory for plugins"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ßÛÐÓØÝÐÜØ"
@@ -761,6 +877,16 @@ msgstr "ÁâÐÝÔÐàâÝëÙ àÐáâÕàØ×ÐâÞà (16bpp)"
msgid "Antialiased Renderer (16bpp)"
msgstr "ÀÐáâÕàØ×ÐâÞà áÞ áÓÛÐÖØÒÐÝØÕÜ (16bpp)"
+#: gui/ThemeEngine.cpp:341
+msgctxt "lowres"
+msgid "Standard Renderer (16bpp)"
+msgstr "ÁâÐÝÔÐàâÝëÙ (16bpp)"
+
+#: gui/ThemeEngine.cpp:342
+msgctxt "lowres"
+msgid "Antialiased Renderer (16bpp)"
+msgstr "ÁÞ áÓÛÐÖØÒÐÝØÕÜ (16bpp)"
+
#: base/main.cpp:205
#, c-format
msgid "Engine does not support debug level '%s'"
@@ -853,6 +979,16 @@ msgstr "Hercules ·ÕÛÕÝëÙ"
msgid "Hercules Amber"
msgstr "Hercules ÏÝâÐàÝëÙ"
+#: common/util.cpp:262
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr "Hercules ·ÕÛÕÝëÙ"
+
+#: common/util.cpp:263
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr "Hercules ÏÝâÐàÝëÙ"
+
#: engines/dialogs.cpp:89
msgid "~R~esume"
msgstr "¿àÞÔÞÛ~Ö~Øâì"
@@ -877,15 +1013,20 @@ msgstr "~¿~ÞÜÞéì"
msgid "~A~bout"
msgstr "¾ ßàÞ~Ó~àÐÜÜÕ"
-#: engines/dialogs.cpp:109
+#: engines/dialogs.cpp:110
msgid "~R~eturn to Launcher"
msgstr "~²~ëÙâØ Ò ÓÛÐÒÝÞÕ ÜÕÝî"
-#: engines/dialogs.cpp:119
+#: engines/dialogs.cpp:112
+msgctxt "lowres"
+msgid "~R~eturn to Launcher"
+msgstr "~²~ ÓÛÐÒÝÞÕ ÜÕÝî"
+
+#: engines/dialogs.cpp:122
msgid "Save game:"
msgstr "ÁÞåàÐÝØâì ØÓàã: "
-#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47
+#: engines/dialogs.cpp:122 backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:44
@@ -893,17 +1034,17 @@ msgstr "ÁÞåàÐÝØâì ØÓàã: "
msgid "Save"
msgstr "·ÐßØáÐâì"
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84
+#: engines/dialogs.cpp:304 engines/mohawk/dialogs.cpp:84
#: engines/mohawk/dialogs.cpp:118
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85
+#: engines/dialogs.cpp:305 engines/mohawk/dialogs.cpp:85
#: engines/mohawk/dialogs.cpp:119
msgid "~C~ancel"
msgstr "¾~â~ÜÕÝÐ"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:308
msgid "~K~eys"
msgstr "~º~ÛÐÒØèØ"
@@ -944,10 +1085,22 @@ msgstr "ÍÜãÛïâÞà DOSBox OPL"
msgid "No music"
msgstr "±Õ× Üã×ëÚØ"
+#: sound/mods/paula.cpp:192
+msgid "Amiga Audio Emulator"
+msgstr "ÍÜãÛïâÞà ×ÒãÚÐ Amiga"
+
#: sound/softsynth/adlib.cpp:1590
msgid "AdLib Emulator"
msgstr "ÍÜãÛïâÞà AdLib"
+#: sound/softsynth/appleiigs.cpp:36
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "ÍÜãÛïâÞà Apple II GS (ÞâáãâáâÒãÕâ)"
+
+#: sound/softsynth/sid.cpp:1434
+msgid "C64 Audio Emulator"
+msgstr "ÍÜãÛïâÞà ×ÒãÚÐ C64"
+
#: sound/softsynth/mt32.cpp:327
msgid "Initialising MT-32 Emulator"
msgstr "½ÐáâàÐØÒÐî íÜãÛïâÞà MT-32"
@@ -1074,6 +1227,11 @@ msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒëÚÛîçÕÝ."
msgid "Normal (no scaling)"
msgstr "±Õ× ãÒÕÛØçÕÝØï"
+#: backends/platform/sdl/graphics.cpp:59
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "±Õ× ãÒÕÛØçÕÝØï"
+
#: backends/platform/symbian/src/SymbianActions.cpp:41
#: backends/platform/wince/CEActionsSmartphone.cpp:38
msgid "Up"
@@ -1238,47 +1396,47 @@ msgstr "¿ÞÔÚÛîçØâì SMB"
msgid "Unmount SMB"
msgstr "¾âÚÛîçâì SMB"
-#: backends/platform/wii/options.cpp:145
+#: backends/platform/wii/options.cpp:143
msgid "DVD Mounted successfully"
msgstr "DVD ßÞÔÚÛîçÕÝ ãáßÕèÝÞ"
-#: backends/platform/wii/options.cpp:148
+#: backends/platform/wii/options.cpp:146
msgid "Error while mounting the DVD"
msgstr "¾èØÑÚÐ ÒÞ ÒàÕÜï ßÞÔÚÛîçÕÝØï DVD"
-#: backends/platform/wii/options.cpp:150
+#: backends/platform/wii/options.cpp:148
msgid "DVD not mounted"
msgstr "DVD ÝÕ ßÞÔÚÛîçÕÝ"
-#: backends/platform/wii/options.cpp:163
+#: backends/platform/wii/options.cpp:161
msgid "Network up, share mounted"
msgstr "ÁÕâì àÐÑÞâÐÕâ, ßÐßÚÐ ßÞÔÚÛîçÕÝÐ"
-#: backends/platform/wii/options.cpp:165
+#: backends/platform/wii/options.cpp:163
msgid "Network up"
msgstr "ÁÕâì àÐÑÞâÐÕâ"
-#: backends/platform/wii/options.cpp:168
+#: backends/platform/wii/options.cpp:166
msgid ", error while mounting the share"
msgstr ", ÞèØÑÚÐ ÒÞ ÒàÕÜï ßÞÔÚÛîçÕÝØï ßÐßÚØ"
-#: backends/platform/wii/options.cpp:170
+#: backends/platform/wii/options.cpp:168
msgid ", share not mounted"
msgstr ", ßÐßÚÐ ÝÕ ßÞÔÚÛîçÕÝÐ"
-#: backends/platform/wii/options.cpp:176
+#: backends/platform/wii/options.cpp:174
msgid "Network down"
msgstr "ÁÕâì ÒëÚÛîçÕÝÐ"
-#: backends/platform/wii/options.cpp:180
+#: backends/platform/wii/options.cpp:178
msgid "Initialising network"
msgstr "½ÐáâàÐØÒÐî áÕâì"
-#: backends/platform/wii/options.cpp:184
+#: backends/platform/wii/options.cpp:182
msgid "Timeout while initialising network"
msgstr "²àÕÜï ßÞÔÚÛîçÕÝØï Ú áÕâØ ØáâÕÚÛÞ"
-#: backends/platform/wii/options.cpp:188
+#: backends/platform/wii/options.cpp:186
#, c-format
msgid "Network not initialsed (%d)"
msgstr "ÁÕâì ÝÕ ÝÐáâàÞÕÝÐ (%d)"
diff --git a/po/scummvm.pot b/po/scummvm.pot
index 38ce9b1a48..a500dc0a4e 100644
--- a/po/scummvm.pot
+++ b/po/scummvm.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.2.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2010-07-30 22:14+0100\n"
+"POT-Creation-Date: 2010-09-01 18:36+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -38,7 +38,7 @@ msgid "Go to previous directory level"
msgstr ""
#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46
-#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029
+#: gui/launcher.cpp:304 gui/massadd.cpp:95 gui/options.cpp:1066
#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56
#: backends/platform/wii/options.cpp:48
msgid "Cancel"
@@ -68,8 +68,8 @@ msgstr ""
msgid "Map"
msgstr ""
-#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893
-#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030
+#: gui/KeysDialog.cpp:45 gui/launcher.cpp:305 gui/launcher.cpp:926
+#: gui/launcher.cpp:930 gui/massadd.cpp:92 gui/options.cpp:1067
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "OK"
@@ -133,217 +133,271 @@ msgid ""
"English"
msgstr ""
-#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80
-#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000
+#: gui/launcher.cpp:185 gui/launcher.cpp:199 gui/options.cpp:80
+#: gui/options.cpp:638 gui/options.cpp:648 gui/options.cpp:1037
#: sound/null.cpp:42
msgid "<default>"
msgstr ""
-#: gui/launcher.cpp:194
+#: gui/launcher.cpp:195
msgid "Platform:"
msgstr ""
-#: gui/launcher.cpp:194 gui/launcher.cpp:195
+#: gui/launcher.cpp:195 gui/launcher.cpp:197 gui/launcher.cpp:198
msgid "Platform the game was originally designed for"
msgstr ""
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:197
+msgctxt "lowres"
+msgid "Platform:"
+msgstr ""
+
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "Graphics"
msgstr ""
-#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "GFX"
msgstr ""
-#: gui/launcher.cpp:208
+#: gui/launcher.cpp:212
+msgid "Override global graphic settings"
+msgstr ""
+
+#: gui/launcher.cpp:214
+msgctxt "lowres"
msgid "Override global graphic settings"
msgstr ""
-#: gui/launcher.cpp:215 gui/options.cpp:921
+#: gui/launcher.cpp:221 gui/options.cpp:944
msgid "Audio"
msgstr ""
-#: gui/launcher.cpp:217
+#: gui/launcher.cpp:224
+msgid "Override global audio settings"
+msgstr ""
+
+#: gui/launcher.cpp:226
+msgctxt "lowres"
msgid "Override global audio settings"
msgstr ""
-#: gui/launcher.cpp:225 gui/options.cpp:925
+#: gui/launcher.cpp:235 gui/options.cpp:949
+msgid "Volume"
+msgstr ""
+
+#: gui/launcher.cpp:237 gui/options.cpp:951
+msgctxt "lowres"
msgid "Volume"
msgstr ""
-#: gui/launcher.cpp:227
+#: gui/launcher.cpp:240
msgid "Override global volume settings"
msgstr ""
-#: gui/launcher.cpp:234 gui/options.cpp:933
+#: gui/launcher.cpp:242
+msgctxt "lowres"
+msgid "Override global volume settings"
+msgstr ""
+
+#: gui/launcher.cpp:249 gui/options.cpp:959
msgid "MIDI"
msgstr ""
-#: gui/launcher.cpp:236
+#: gui/launcher.cpp:252
+msgid "Override global MIDI settings"
+msgstr ""
+
+#: gui/launcher.cpp:254
+msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr ""
-#: gui/launcher.cpp:246 gui/options.cpp:939
+#: gui/launcher.cpp:264 gui/options.cpp:965
msgid "MT-32"
msgstr ""
-#: gui/launcher.cpp:248
+#: gui/launcher.cpp:267
+msgid "Override global MT-32 settings"
+msgstr ""
+
+#: gui/launcher.cpp:269
+msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr ""
-#: gui/launcher.cpp:258 gui/options.cpp:945
+#: gui/launcher.cpp:279 gui/options.cpp:971
msgid "Paths"
msgstr ""
-#: gui/launcher.cpp:264
+#: gui/launcher.cpp:285
msgid "Game Path:"
msgstr ""
-#: gui/launcher.cpp:268 gui/options.cpp:958
+#: gui/launcher.cpp:289 gui/options.cpp:984
msgid "Extra Path:"
msgstr ""
-#: gui/launcher.cpp:268 gui/launcher.cpp:269
+#: gui/launcher.cpp:289 gui/launcher.cpp:290
msgid "Specifies path to additional data used the game"
msgstr ""
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:294
msgid "Save Path:"
msgstr ""
-#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952
-#: gui/options.cpp:953
+#: gui/launcher.cpp:294 gui/launcher.cpp:296 gui/launcher.cpp:297
+#: gui/options.cpp:978 gui/options.cpp:979
msgid "Specifies where your savegames are put"
msgstr ""
-#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418
-#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
-#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956
-#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053
-#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073
-#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107
-#: gui/options.cpp:1114 gui/options.cpp:1213
+#: gui/launcher.cpp:296
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr ""
+
+#: gui/launcher.cpp:313 gui/launcher.cpp:393 gui/launcher.cpp:442
+#: gui/options.cpp:982 gui/options.cpp:985 gui/options.cpp:989
+#: gui/options.cpp:1090 gui/options.cpp:1096 gui/options.cpp:1102
+#: gui/options.cpp:1110 gui/options.cpp:1134 gui/options.cpp:1138
+#: gui/options.cpp:1144 gui/options.cpp:1151 gui/options.cpp:1250
+msgctxt "path"
msgid "None"
msgstr ""
-#: gui/launcher.cpp:294 gui/launcher.cpp:373
+#: gui/launcher.cpp:318 gui/launcher.cpp:397
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr ""
-#: gui/launcher.cpp:411 gui/options.cpp:1207
+#: gui/launcher.cpp:435 gui/options.cpp:1244
msgid "Select SoundFont"
msgstr ""
-#: gui/launcher.cpp:430 gui/launcher.cpp:568
+#: gui/launcher.cpp:454 gui/launcher.cpp:601
msgid "Select directory with game data"
msgstr ""
-#: gui/launcher.cpp:448
+#: gui/launcher.cpp:472
msgid "Select additional game directory"
msgstr ""
-#: gui/launcher.cpp:460
+#: gui/launcher.cpp:484
msgid "Select directory for saved games"
msgstr ""
-#: gui/launcher.cpp:479
+#: gui/launcher.cpp:503
msgid "This game ID is already taken. Please choose another one."
msgstr ""
-#: gui/launcher.cpp:520 engines/dialogs.cpp:113
+#: gui/launcher.cpp:544 engines/dialogs.cpp:116
msgid "~Q~uit"
msgstr ""
-#: gui/launcher.cpp:520
+#: gui/launcher.cpp:544
msgid "Quit ScummVM"
msgstr ""
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "A~b~out..."
msgstr ""
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "About ScummVM"
msgstr ""
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "~O~ptions..."
msgstr ""
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "Change global ScummVM options"
msgstr ""
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "~S~tart"
msgstr ""
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "Start selected game"
msgstr ""
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "~L~oad..."
msgstr ""
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "Load savegame for selected game"
msgstr ""
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556
msgid "~A~dd Game..."
msgstr ""
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556 gui/launcher.cpp:563
msgid "Hold Shift for Mass Add"
msgstr ""
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558
msgid "~E~dit Game..."
msgstr ""
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558 gui/launcher.cpp:565
msgid "Change game options"
msgstr ""
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560
msgid "~R~emove Game"
msgstr ""
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560 gui/launcher.cpp:567
msgid "Remove game from the list. The game data files stay intact"
msgstr ""
-#: gui/launcher.cpp:542
+#: gui/launcher.cpp:563
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr ""
+
+#: gui/launcher.cpp:565
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr ""
+
+#: gui/launcher.cpp:567
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr ""
+
+#: gui/launcher.cpp:575
msgid "Search in game list"
msgstr ""
-#: gui/launcher.cpp:546 gui/launcher.cpp:1057
+#: gui/launcher.cpp:579 gui/launcher.cpp:1092
msgid "Search:"
msgstr ""
-#: gui/launcher.cpp:549 gui/options.cpp:733
+#: gui/launcher.cpp:582 gui/options.cpp:740
msgid "Clear value"
msgstr ""
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
msgid "Load game:"
msgstr ""
-#: gui/launcher.cpp:571 engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:225
msgid "Load"
msgstr ""
-#: gui/launcher.cpp:680
+#: gui/launcher.cpp:713
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
msgstr ""
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -351,7 +405,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: gui/launcher.cpp:681 gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -359,35 +413,45 @@ msgstr ""
msgid "No"
msgstr ""
-#: gui/launcher.cpp:728
+#: gui/launcher.cpp:761
msgid "ScummVM couldn't open the specified directory!"
msgstr ""
-#: gui/launcher.cpp:740
+#: gui/launcher.cpp:773
msgid "ScummVM could not find any game in the specified directory!"
msgstr ""
-#: gui/launcher.cpp:754
+#: gui/launcher.cpp:787
msgid "Pick the game:"
msgstr ""
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:863
msgid "Do you really want to remove this game configuration?"
msgstr ""
-#: gui/launcher.cpp:893
+#: gui/launcher.cpp:926
msgid "This game does not support loading games from the launcher."
msgstr ""
-#: gui/launcher.cpp:897
+#: gui/launcher.cpp:930
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
-#: gui/launcher.cpp:1009
+#: gui/launcher.cpp:1044
+msgctxt "lowres"
+msgid "Mass Add..."
+msgstr ""
+
+#: gui/launcher.cpp:1044
msgid "Mass Add..."
msgstr ""
-#: gui/launcher.cpp:1010
+#: gui/launcher.cpp:1045
+msgctxt "lowres"
+msgid "Add Game..."
+msgstr ""
+
+#: gui/launcher.cpp:1045
msgid "Add Game..."
msgstr ""
@@ -454,239 +518,291 @@ msgstr ""
msgid "48 kHz"
msgstr ""
-#: gui/options.cpp:632
+#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
+#: gui/options.cpp:555 gui/options.cpp:739
+msgctxt "soundfont"
+msgid "None"
+msgstr ""
+
+#: gui/options.cpp:635
msgid "Graphics mode:"
msgstr ""
-#: gui/options.cpp:643
+#: gui/options.cpp:646
msgid "Render mode:"
msgstr ""
-#: gui/options.cpp:643 gui/options.cpp:644
+#: gui/options.cpp:646 gui/options.cpp:647
msgid "Special dithering modes supported by some games"
msgstr ""
-#: gui/options.cpp:653
+#: gui/options.cpp:656
msgid "Fullscreen mode"
msgstr ""
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Aspect ratio correction"
msgstr ""
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Correct aspect ratio for 320x200 games"
msgstr ""
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Preferred Device:"
msgstr ""
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Music Device:"
msgstr ""
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
-#: gui/options.cpp:663 gui/options.cpp:664
+#: gui/options.cpp:666 gui/options.cpp:667
msgid "Specifies output sound device or sound card emulator"
msgstr ""
-#: gui/options.cpp:688
+#: gui/options.cpp:692
msgid "AdLib emulator:"
msgstr ""
-#: gui/options.cpp:688 gui/options.cpp:689
+#: gui/options.cpp:692 gui/options.cpp:693
msgid "AdLib is used for music in many games"
msgstr ""
-#: gui/options.cpp:699
+#: gui/options.cpp:703
msgid "Output rate:"
msgstr ""
-#: gui/options.cpp:699 gui/options.cpp:700
+#: gui/options.cpp:703 gui/options.cpp:704
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
msgstr ""
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "GM Device:"
msgstr ""
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "Specifies default sound device for General MIDI output"
msgstr ""
-#: gui/options.cpp:731
+#: gui/options.cpp:736
msgid "SoundFont:"
msgstr ""
-#: gui/options.cpp:731 gui/options.cpp:732
+#: gui/options.cpp:736 gui/options.cpp:738 gui/options.cpp:739
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
-#: gui/options.cpp:736
+#: gui/options.cpp:738
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr ""
+
+#: gui/options.cpp:743
msgid "Mixed AdLib/MIDI mode"
msgstr ""
-#: gui/options.cpp:736
+#: gui/options.cpp:743
msgid "Use both MIDI and AdLib sound generation"
msgstr ""
-#: gui/options.cpp:739
+#: gui/options.cpp:746
msgid "MIDI gain:"
msgstr ""
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "MT-32 Device:"
msgstr ""
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
-#: gui/options.cpp:753
+#: gui/options.cpp:761
msgid "True Roland MT-32 (disable GM emulation)"
msgstr ""
-#: gui/options.cpp:753
+#: gui/options.cpp:761 gui/options.cpp:763
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
msgstr ""
-#: gui/options.cpp:756
+#: gui/options.cpp:763
+msgctxt "lowres"
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr ""
+
+#: gui/options.cpp:766
msgid "Enable Roland GS Mode"
msgstr ""
-#: gui/options.cpp:756
+#: gui/options.cpp:766
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
msgstr ""
-#: gui/options.cpp:780
+#: gui/options.cpp:791
msgid "Text and Speech:"
msgstr ""
-#: gui/options.cpp:785 gui/options.cpp:791
+#: gui/options.cpp:795 gui/options.cpp:805
msgid "Speech"
msgstr ""
-#: gui/options.cpp:786 gui/options.cpp:792
+#: gui/options.cpp:796 gui/options.cpp:806
msgid "Subtitles"
msgstr ""
-#: gui/options.cpp:787 gui/options.cpp:793
+#: gui/options.cpp:797
msgid "Both"
msgstr ""
-#: gui/options.cpp:791
+#: gui/options.cpp:799
+msgid "Subtitle speed:"
+msgstr ""
+
+#: gui/options.cpp:801
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr ""
+
+#: gui/options.cpp:805
msgid "Spch"
msgstr ""
-#: gui/options.cpp:792
+#: gui/options.cpp:806
msgid "Subs"
msgstr ""
-#: gui/options.cpp:793
+#: gui/options.cpp:807
+msgctxt "lowres"
+msgid "Both"
+msgstr ""
+
+#: gui/options.cpp:807
msgid "Show subtitles and play speech"
msgstr ""
-#: gui/options.cpp:797
+#: gui/options.cpp:809
+msgctxt "lowres"
msgid "Subtitle speed:"
msgstr ""
-#: gui/options.cpp:809
+#: gui/options.cpp:825
+msgid "Music volume:"
+msgstr ""
+
+#: gui/options.cpp:827
+msgctxt "lowres"
msgid "Music volume:"
msgstr ""
-#: gui/options.cpp:816
+#: gui/options.cpp:834
msgid "Mute All"
msgstr ""
-#: gui/options.cpp:819
+#: gui/options.cpp:837
msgid "SFX volume:"
msgstr ""
-#: gui/options.cpp:819 gui/options.cpp:820
+#: gui/options.cpp:837 gui/options.cpp:839 gui/options.cpp:840
msgid "Special sound effects volume"
msgstr ""
-#: gui/options.cpp:826
+#: gui/options.cpp:839
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr ""
+
+#: gui/options.cpp:847
+msgid "Speech volume:"
+msgstr ""
+
+#: gui/options.cpp:849
+msgctxt "lowres"
msgid "Speech volume:"
msgstr ""
-#: gui/options.cpp:952
+#: gui/options.cpp:978
msgid "Save Path: "
msgstr ""
-#: gui/options.cpp:955
+#: gui/options.cpp:981
msgid "Theme Path:"
msgstr ""
-#: gui/options.cpp:958 gui/options.cpp:959
+#: gui/options.cpp:984 gui/options.cpp:985
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
-#: gui/options.cpp:962
+#: gui/options.cpp:988
msgid "Plugins Path:"
msgstr ""
-#: gui/options.cpp:970
+#: gui/options.cpp:997
+msgid "Misc"
+msgstr ""
+
+#: gui/options.cpp:999
+msgctxt "lowres"
msgid "Misc"
msgstr ""
-#: gui/options.cpp:972
+#: gui/options.cpp:1001
msgid "Theme:"
msgstr ""
-#: gui/options.cpp:976
+#: gui/options.cpp:1005
msgid "GUI Renderer:"
msgstr ""
-#: gui/options.cpp:982
+#: gui/options.cpp:1017
msgid "Autosave:"
msgstr ""
-#: gui/options.cpp:990
+#: gui/options.cpp:1019
+msgctxt "lowres"
+msgid "Autosave:"
+msgstr ""
+
+#: gui/options.cpp:1027
msgid "Keys"
msgstr ""
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "GUI Language:"
msgstr ""
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "Language of ScummVM GUI"
msgstr ""
-#: gui/options.cpp:1002
-msgid "English"
-msgstr ""
-
-#: gui/options.cpp:1146
+#: gui/options.cpp:1183
msgid "You have to restart ScummVM to take the effect."
msgstr ""
-#: gui/options.cpp:1159
+#: gui/options.cpp:1196
msgid "Select directory for savegames"
msgstr ""
-#: gui/options.cpp:1166
+#: gui/options.cpp:1203
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
-#: gui/options.cpp:1175
+#: gui/options.cpp:1212
msgid "Select directory for GUI themes"
msgstr ""
-#: gui/options.cpp:1185
+#: gui/options.cpp:1222
msgid "Select directory for extra files"
msgstr ""
-#: gui/options.cpp:1196
+#: gui/options.cpp:1233
msgid "Select directory for plugins"
msgstr ""
@@ -742,6 +858,16 @@ msgstr ""
msgid "Antialiased Renderer (16bpp)"
msgstr ""
+#: gui/ThemeEngine.cpp:341
+msgctxt "lowres"
+msgid "Standard Renderer (16bpp)"
+msgstr ""
+
+#: gui/ThemeEngine.cpp:342
+msgctxt "lowres"
+msgid "Antialiased Renderer (16bpp)"
+msgstr ""
+
#: base/main.cpp:205
#, c-format
msgid "Engine does not support debug level '%s'"
@@ -834,6 +960,16 @@ msgstr ""
msgid "Hercules Amber"
msgstr ""
+#: common/util.cpp:262
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr ""
+
+#: common/util.cpp:263
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr ""
+
#: engines/dialogs.cpp:89
msgid "~R~esume"
msgstr ""
@@ -858,15 +994,20 @@ msgstr ""
msgid "~A~bout"
msgstr ""
-#: engines/dialogs.cpp:109
+#: engines/dialogs.cpp:110
+msgid "~R~eturn to Launcher"
+msgstr ""
+
+#: engines/dialogs.cpp:112
+msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr ""
-#: engines/dialogs.cpp:119
+#: engines/dialogs.cpp:122
msgid "Save game:"
msgstr ""
-#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47
+#: engines/dialogs.cpp:122 backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:44
@@ -874,17 +1015,17 @@ msgstr ""
msgid "Save"
msgstr ""
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84
+#: engines/dialogs.cpp:304 engines/mohawk/dialogs.cpp:84
#: engines/mohawk/dialogs.cpp:118
msgid "~O~K"
msgstr ""
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85
+#: engines/dialogs.cpp:305 engines/mohawk/dialogs.cpp:85
#: engines/mohawk/dialogs.cpp:119
msgid "~C~ancel"
msgstr ""
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:308
msgid "~K~eys"
msgstr ""
@@ -925,10 +1066,22 @@ msgstr ""
msgid "No music"
msgstr ""
+#: sound/mods/paula.cpp:192
+msgid "Amiga Audio Emulator"
+msgstr ""
+
#: sound/softsynth/adlib.cpp:1590
msgid "AdLib Emulator"
msgstr ""
+#: sound/softsynth/appleiigs.cpp:36
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr ""
+
+#: sound/softsynth/sid.cpp:1434
+msgid "C64 Audio Emulator"
+msgstr ""
+
#: sound/softsynth/mt32.cpp:327
msgid "Initialising MT-32 Emulator"
msgstr ""
@@ -1055,6 +1208,11 @@ msgstr ""
msgid "Normal (no scaling)"
msgstr ""
+#: backends/platform/sdl/graphics.cpp:59
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr ""
+
#: backends/platform/symbian/src/SymbianActions.cpp:41
#: backends/platform/wince/CEActionsSmartphone.cpp:38
msgid "Up"
@@ -1219,47 +1377,47 @@ msgstr ""
msgid "Unmount SMB"
msgstr ""
-#: backends/platform/wii/options.cpp:145
+#: backends/platform/wii/options.cpp:143
msgid "DVD Mounted successfully"
msgstr ""
-#: backends/platform/wii/options.cpp:148
+#: backends/platform/wii/options.cpp:146
msgid "Error while mounting the DVD"
msgstr ""
-#: backends/platform/wii/options.cpp:150
+#: backends/platform/wii/options.cpp:148
msgid "DVD not mounted"
msgstr ""
-#: backends/platform/wii/options.cpp:163
+#: backends/platform/wii/options.cpp:161
msgid "Network up, share mounted"
msgstr ""
-#: backends/platform/wii/options.cpp:165
+#: backends/platform/wii/options.cpp:163
msgid "Network up"
msgstr ""
-#: backends/platform/wii/options.cpp:168
+#: backends/platform/wii/options.cpp:166
msgid ", error while mounting the share"
msgstr ""
-#: backends/platform/wii/options.cpp:170
+#: backends/platform/wii/options.cpp:168
msgid ", share not mounted"
msgstr ""
-#: backends/platform/wii/options.cpp:176
+#: backends/platform/wii/options.cpp:174
msgid "Network down"
msgstr ""
-#: backends/platform/wii/options.cpp:180
+#: backends/platform/wii/options.cpp:178
msgid "Initialising network"
msgstr ""
-#: backends/platform/wii/options.cpp:184
+#: backends/platform/wii/options.cpp:182
msgid "Timeout while initialising network"
msgstr ""
-#: backends/platform/wii/options.cpp:188
+#: backends/platform/wii/options.cpp:186
#, c-format
msgid "Network not initialsed (%d)"
msgstr ""
diff --git a/po/uk_UA.po b/po/uk_UA.po
index fdbfcb89a4..1831859171 100644
--- a/po/uk_UA.po
+++ b/po/uk_UA.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM VERSION\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2010-07-30 22:14+0100\n"
+"POT-Creation-Date: 2010-09-01 18:36+0300\n"
"PO-Revision-Date: 2010-07-30 22:19+0100\n"
"Last-Translator: Lubomyr Lisen\n"
"Language-Team: Ukrainian\n"
@@ -15,7 +15,8 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-5\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: Ukrainian\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%"
+"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#: gui/about.cpp:96
#, c-format
@@ -38,27 +39,18 @@ msgstr "²ÒÕàå"
msgid "Go to previous directory level"
msgstr "¿ÕàÕÙâØ ÝÐ ßÐßÚã àöÒÝÕÜ ÒØéÕ"
-#: gui/browser.cpp:70
-#: gui/chooser.cpp:49
-#: gui/KeysDialog.cpp:46
-#: gui/launcher.cpp:280
-#: gui/massadd.cpp:95
-#: gui/options.cpp:1029
-#: gui/saveload.cpp:65
-#: gui/saveload.cpp:157
-#: gui/themebrowser.cpp:56
+#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46
+#: gui/launcher.cpp:304 gui/massadd.cpp:95 gui/options.cpp:1066
+#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56
#: backends/platform/wii/options.cpp:48
msgid "Cancel"
msgstr "²öÔÜöÝÐ"
-#: gui/browser.cpp:71
-#: gui/chooser.cpp:50
-#: gui/themebrowser.cpp:57
+#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57
msgid "Choose"
msgstr "²ØÑàÐâØ"
-#: gui/GuiManager.cpp:103
-#: backends/keymapper/remap-dialog.cpp:54
+#: gui/GuiManager.cpp:103 backends/keymapper/remap-dialog.cpp:54
msgid "Close"
msgstr "·ÐÚàØâØ"
@@ -66,13 +58,11 @@ msgstr "·ÐÚàØâØ"
msgid "Mouse click"
msgstr "ºÛöÚ ÜØèÚÞî"
-#: gui/GuiManager.cpp:109
-#: base/main.cpp:285
+#: gui/GuiManager.cpp:109 base/main.cpp:285
msgid "Display keyboard"
msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã"
-#: gui/GuiManager.cpp:112
-#: base/main.cpp:288
+#: gui/GuiManager.cpp:112 base/main.cpp:288
msgid "Remap keys"
msgstr "¿ÕàÕßàØ×ÝÐçØâØ ÚÛÐÒöèö"
@@ -80,12 +70,8 @@ msgstr "¿ÕàÕßàØ×ÝÐçØâØ ÚÛÐÒöèö"
msgid "Map"
msgstr "¿àØ×ÝÐçØâØ"
-#: gui/KeysDialog.cpp:45
-#: gui/launcher.cpp:281
-#: gui/launcher.cpp:893
-#: gui/launcher.cpp:897
-#: gui/massadd.cpp:92
-#: gui/options.cpp:1030
+#: gui/KeysDialog.cpp:45 gui/launcher.cpp:305 gui/launcher.cpp:926
+#: gui/launcher.cpp:930 gui/massadd.cpp:92 gui/options.cpp:1067
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:56
msgid "OK"
@@ -95,16 +81,12 @@ msgstr "OK"
msgid "Select an action and click 'Map'"
msgstr "²ØÑÕàöâì Ôöî ö ÚÛöÚÝöâì '¿àØ×ÝÐçØâØ'"
-#: gui/KeysDialog.cpp:83
-#: gui/KeysDialog.cpp:105
-#: gui/KeysDialog.cpp:144
+#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144
#, c-format
msgid "Associated key : %s"
msgstr "¿àØ×ÝÐçÕÝÐ ÚÛÐÒöèÐ : %s"
-#: gui/KeysDialog.cpp:85
-#: gui/KeysDialog.cpp:107
-#: gui/KeysDialog.cpp:146
+#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146
#, c-format
msgid "Associated key : none"
msgstr "¿àØ×ÝÐçÕÝÐ ÚÛÐÒöèÐ : ÝÕÜÐô"
@@ -129,17 +111,19 @@ msgstr "³àÐ"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:175
-#: gui/launcher.cpp:176
-msgid "Short game identifier used for referring to savegames and running the game from the command line"
-msgstr "ºÞàÞâÚØÙ öÔÕÝâØäöÚÐâÞà, ïÚØÙ ÒØÚÞàØáâÞÒãôâìáï ÔÛï ÝÐ×Ò ×ÑÕàÕÖÕÝØå öÓÞà ö ÔÛï ×ÐßãáÚã × ÚÞÜÐÝÔÝÞ÷ áâàöçÚØ"
+#: gui/launcher.cpp:175 gui/launcher.cpp:176
+msgid ""
+"Short game identifier used for referring to savegames and running the game "
+"from the command line"
+msgstr ""
+"ºÞàÞâÚØÙ öÔÕÝâØäöÚÐâÞà, ïÚØÙ ÒØÚÞàØáâÞÒãôâìáï ÔÛï ÝÐ×Ò ×ÑÕàÕÖÕÝØå öÓÞà ö ÔÛï "
+"×ÐßãáÚã × ÚÞÜÐÝÔÝÞ÷ áâàöçÚØ"
#: gui/launcher.cpp:179
msgid "Name:"
msgstr "½Ð×ÒÐ:"
-#: gui/launcher.cpp:179
-#: gui/launcher.cpp:180
+#: gui/launcher.cpp:179 gui/launcher.cpp:180
msgid "Full title of the game"
msgstr "¿ÞÒÝÐ ÝÐ×ÒÐ ÓàØ"
@@ -147,262 +131,295 @@ msgstr "¿ÞÒÝÐ ÝÐ×ÒÐ ÓàØ"
msgid "Language:"
msgstr "¼ÞÒÐ:"
-#: gui/launcher.cpp:183
-#: gui/launcher.cpp:184
-msgid "Language of the game. This will not turn your Spanish game version into English"
-msgstr "¼ÞÒÐ ÓàØ. ·ÜöÝÐ æìÞÓÞ ßÐàÐÜÕâàã ÝÕ ßÕàÕâÒÞàØâì Óàã ÝÐ ÐÝÓÛöÙáìÚöÙ Ò ãÚàÐ÷ÝáìÚã"
+#: gui/launcher.cpp:183 gui/launcher.cpp:184
+msgid ""
+"Language of the game. This will not turn your Spanish game version into "
+"English"
+msgstr ""
+"¼ÞÒÐ ÓàØ. ·ÜöÝÐ æìÞÓÞ ßÐàÐÜÕâàã ÝÕ ßÕàÕâÒÞàØâì Óàã ÝÐ ÐÝÓÛöÙáìÚöÙ Ò "
+"ãÚàÐ÷ÝáìÚã"
-#: gui/launcher.cpp:185
-#: gui/launcher.cpp:196
-#: gui/options.cpp:80
-#: gui/options.cpp:635
-#: gui/options.cpp:645
-#: gui/options.cpp:1000
+#: gui/launcher.cpp:185 gui/launcher.cpp:199 gui/options.cpp:80
+#: gui/options.cpp:638 gui/options.cpp:648 gui/options.cpp:1037
#: sound/null.cpp:42
msgid "<default>"
msgstr "<×Ð ãÜÞÒçÐÝÝïÜ>"
-#: gui/launcher.cpp:194
+#: gui/launcher.cpp:195
msgid "Platform:"
msgstr "¿ÛÐâäÞàÜÐ:"
-#: gui/launcher.cpp:194
-#: gui/launcher.cpp:195
+#: gui/launcher.cpp:195 gui/launcher.cpp:197 gui/launcher.cpp:198
msgid "Platform the game was originally designed for"
msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ïÚÞ÷ ÓàÐ ÑãÛÐ áßÞçÐâÚã àÞ×àÞÑÛÕÝÐ"
-#: gui/launcher.cpp:206
-#: gui/options.cpp:898
-#: gui/options.cpp:915
+#: gui/launcher.cpp:197
+#, fuzzy
+msgctxt "lowres"
+msgid "Platform:"
+msgstr "¿ÛÐâäÞàÜÐ:"
+
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "Graphics"
msgstr "³àÐäöÚÐ"
-#: gui/launcher.cpp:206
-#: gui/options.cpp:898
-#: gui/options.cpp:915
+#: gui/launcher.cpp:209 gui/options.cpp:921 gui/options.cpp:938
msgid "GFX"
msgstr "³àä"
-#: gui/launcher.cpp:208
+#: gui/launcher.cpp:212
+msgid "Override global graphic settings"
+msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓàÐäöÚØ"
+
+#: gui/launcher.cpp:214
+#, fuzzy
+msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓàÐäöÚØ"
-#: gui/launcher.cpp:215
-#: gui/options.cpp:921
+#: gui/launcher.cpp:221 gui/options.cpp:944
msgid "Audio"
msgstr "°ãÔöÞ"
-#: gui/launcher.cpp:217
+#: gui/launcher.cpp:224
+msgid "Override global audio settings"
+msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÐãÔöÞ"
+
+#: gui/launcher.cpp:226
+#, fuzzy
+msgctxt "lowres"
msgid "Override global audio settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÐãÔöÞ"
-#: gui/launcher.cpp:225
-#: gui/options.cpp:925
+#: gui/launcher.cpp:235 gui/options.cpp:949
+msgid "Volume"
+msgstr "³ãçÝöáâì"
+
+#: gui/launcher.cpp:237 gui/options.cpp:951
+#, fuzzy
+msgctxt "lowres"
msgid "Volume"
msgstr "³ãçÝöáâì"
-#: gui/launcher.cpp:227
+#: gui/launcher.cpp:240
+msgid "Override global volume settings"
+msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓãçÝÞáâö"
+
+#: gui/launcher.cpp:242
+#, fuzzy
+msgctxt "lowres"
msgid "Override global volume settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓãçÝÞáâö"
-#: gui/launcher.cpp:234
-#: gui/options.cpp:933
+#: gui/launcher.cpp:249 gui/options.cpp:959
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:236
+#: gui/launcher.cpp:252
+msgid "Override global MIDI settings"
+msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MIDI"
+
+#: gui/launcher.cpp:254
+#, fuzzy
+msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MIDI"
-#: gui/launcher.cpp:246
-#: gui/options.cpp:939
+#: gui/launcher.cpp:264 gui/options.cpp:965
#, fuzzy
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:248
+#: gui/launcher.cpp:267
+#, fuzzy
+msgid "Override global MT-32 settings"
+msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MT-32"
+
+#: gui/launcher.cpp:269
#, fuzzy
+msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MT-32"
-#: gui/launcher.cpp:258
-#: gui/options.cpp:945
+#: gui/launcher.cpp:279 gui/options.cpp:971
msgid "Paths"
msgstr "ÈÛïåØ"
-#: gui/launcher.cpp:264
+#: gui/launcher.cpp:285
msgid "Game Path:"
msgstr "ÈÛïå ÔÞ ÓàØ: "
-#: gui/launcher.cpp:268
-#: gui/options.cpp:958
+#: gui/launcher.cpp:289 gui/options.cpp:984
msgid "Extra Path:"
msgstr "´ÞÔ. èÛïå:"
-#: gui/launcher.cpp:268
-#: gui/launcher.cpp:269
+#: gui/launcher.cpp:289 gui/launcher.cpp:290
msgid "Specifies path to additional data used the game"
msgstr "²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå ÔÛï ÓàØ"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:294
msgid "Save Path:"
msgstr "ÈÛïå ×ÑÕà.: "
-#: gui/launcher.cpp:272
-#: gui/launcher.cpp:273
-#: gui/options.cpp:952
-#: gui/options.cpp:953
+#: gui/launcher.cpp:294 gui/launcher.cpp:296 gui/launcher.cpp:297
+#: gui/options.cpp:978 gui/options.cpp:979
msgid "Specifies where your savegames are put"
msgstr "²ÚÐ×ãô èÛïå ÔÞ ×ÑÕàÕÖÕÝì ÓàØ"
-#: gui/launcher.cpp:289
-#: gui/launcher.cpp:369
-#: gui/launcher.cpp:418
-#: gui/options.cpp:230
-#: gui/options.cpp:399
-#: gui/options.cpp:497
-#: gui/options.cpp:555
-#: gui/options.cpp:732
-#: gui/options.cpp:956
-#: gui/options.cpp:959
-#: gui/options.cpp:963
-#: gui/options.cpp:1053
-#: gui/options.cpp:1059
-#: gui/options.cpp:1065
-#: gui/options.cpp:1073
-#: gui/options.cpp:1097
-#: gui/options.cpp:1101
-#: gui/options.cpp:1107
-#: gui/options.cpp:1114
-#: gui/options.cpp:1213
+#: gui/launcher.cpp:296
+#, fuzzy
+msgctxt "lowres"
+msgid "Save Path:"
+msgstr "ÈÛïå ×ÑÕà.: "
+
+#: gui/launcher.cpp:313 gui/launcher.cpp:393 gui/launcher.cpp:442
+#: gui/options.cpp:982 gui/options.cpp:985 gui/options.cpp:989
+#: gui/options.cpp:1090 gui/options.cpp:1096 gui/options.cpp:1102
+#: gui/options.cpp:1110 gui/options.cpp:1134 gui/options.cpp:1138
+#: gui/options.cpp:1144 gui/options.cpp:1151 gui/options.cpp:1250
+#, fuzzy
+msgctxt "path"
msgid "None"
msgstr "½Õ ×ÐÔÐÝØÙ"
-#: gui/launcher.cpp:294
-#: gui/launcher.cpp:373
+#: gui/launcher.cpp:318 gui/launcher.cpp:397
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "·Ð ãÜÞÒçÐÝÝïÜ"
-#: gui/launcher.cpp:411
-#: gui/options.cpp:1207
+#: gui/launcher.cpp:435 gui/options.cpp:1244
msgid "Select SoundFont"
msgstr "²ØÑÕàöâì SoundFont"
-#: gui/launcher.cpp:430
-#: gui/launcher.cpp:568
+#: gui/launcher.cpp:454 gui/launcher.cpp:601
msgid "Select directory with game data"
msgstr "²ØÑÕàöâì ßÐßÚã × äÐÙÛÐÜØ ÓàØ"
-#: gui/launcher.cpp:448
+#: gui/launcher.cpp:472
msgid "Select additional game directory"
msgstr "²ØÑÕàöâì ÔÞÔÐâÚÞÒã ßÐßÚã ÓàØ"
-#: gui/launcher.cpp:460
+#: gui/launcher.cpp:484
msgid "Select directory for saved games"
msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï ×ÑÕàÕÖÕÝì"
-#: gui/launcher.cpp:479
+#: gui/launcher.cpp:503
msgid "This game ID is already taken. Please choose another one."
msgstr "ÆÕÙ ID ÓàØ ÒÖÕ ÒØÚÞàØáâÞÒãôâìáï. ±ãÔì ÛÐáÚÐ, ÒØÑÕàöâì öÝèØÙ."
-#: gui/launcher.cpp:520
-#: engines/dialogs.cpp:113
+#: gui/launcher.cpp:544 engines/dialogs.cpp:116
msgid "~Q~uit"
msgstr "~²~ØåöÔ"
-#: gui/launcher.cpp:520
+#: gui/launcher.cpp:544
msgid "Quit ScummVM"
msgstr "²ØåöÔ × ScummVM"
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "A~b~out..."
msgstr "¿àÞ ß~à~ÞÓàÐÜã..."
-#: gui/launcher.cpp:521
+#: gui/launcher.cpp:545
msgid "About ScummVM"
msgstr "¿àÞ ScummVM"
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "~O~ptions..."
msgstr "~¾~ßæö÷..."
-#: gui/launcher.cpp:522
+#: gui/launcher.cpp:546
msgid "Change global ScummVM options"
msgstr "·ÜöÝØâØ ÓÛÞÑÐÛìÝö Þßæö÷ ScummVM"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "~S~tart"
msgstr "·~Ð~ßãáÚ"
-#: gui/launcher.cpp:524
+#: gui/launcher.cpp:548
msgid "Start selected game"
msgstr "·ÐßãáâØâØ ÒØÑàÐÝã Óàã"
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "~L~oad..."
msgstr "~·~ÐÒÐÝ..."
-#: gui/launcher.cpp:527
+#: gui/launcher.cpp:551
msgid "Load savegame for selected game"
msgstr "·ÐÒÐÝâÐÖØâØ ×ÑÕàÕÖÕÝÝï ÔÛï ÒØÑàÐÝÞ÷ ÓàØ"
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556
msgid "~A~dd Game..."
msgstr "~´~ÞÔ. Óàã..."
-#: gui/launcher.cpp:531
+#: gui/launcher.cpp:556 gui/launcher.cpp:563
msgid "Hold Shift for Mass Add"
msgstr "ÃâàØÜãÙâÕ ÚÛÐÒöèã Shift ÔÛï âÞÓÞ, éÞÑ ÔÞÔÐâØ ÔÕÚöÛìÚÐ öÓÞà"
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558
msgid "~E~dit Game..."
msgstr "ÀÕÔÐ~Ó~. Óàã..."
-#: gui/launcher.cpp:533
+#: gui/launcher.cpp:558 gui/launcher.cpp:565
msgid "Change game options"
msgstr "·ÜöÝØâØ Þßæö÷ ÓàØ"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560
msgid "~R~emove Game"
msgstr "~²~ØÔÐÛØâØ Óàã"
-#: gui/launcher.cpp:535
+#: gui/launcher.cpp:560 gui/launcher.cpp:567
msgid "Remove game from the list. The game data files stay intact"
msgstr "²ØÔÐÛØâØ Óàã ×ö áßØáÚã. ½Õ ÒØÔÐÛïô Óàã × ÖÞàáâÚÞÓÞ ÔØáÚÐ"
-#: gui/launcher.cpp:542
+#: gui/launcher.cpp:563
+#, fuzzy
+msgctxt "lowres"
+msgid "~A~dd Game..."
+msgstr "~´~ÞÔ. Óàã..."
+
+#: gui/launcher.cpp:565
+#, fuzzy
+msgctxt "lowres"
+msgid "~E~dit Game..."
+msgstr "ÀÕÔÐ~Ó~. Óàã..."
+
+#: gui/launcher.cpp:567
+#, fuzzy
+msgctxt "lowres"
+msgid "~R~emove Game"
+msgstr "~²~ØÔÐÛØâØ Óàã"
+
+#: gui/launcher.cpp:575
msgid "Search in game list"
msgstr "¿ÞèãÚ Ò áßØáÚã öÓÞà"
-#: gui/launcher.cpp:546
-#: gui/launcher.cpp:1057
+#: gui/launcher.cpp:579 gui/launcher.cpp:1092
msgid "Search:"
msgstr "¿ÞèãÚ:"
-#: gui/launcher.cpp:549
-#: gui/options.cpp:733
+#: gui/launcher.cpp:582 gui/options.cpp:740
msgid "Clear value"
msgstr "¾çØáâØâØ ×ÝÐçÕÝÝï"
-#: gui/launcher.cpp:571
-#: engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
msgid "Load game:"
msgstr "·ÐÒÐÝâÐÖØâØ Óàã:"
-#: gui/launcher.cpp:571
-#: engines/dialogs.cpp:117
+#: gui/launcher.cpp:604 engines/dialogs.cpp:120
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:225
msgid "Load"
msgstr "·ÐÒÐÝâÐÖØâØ"
-#: gui/launcher.cpp:680
-msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games."
-msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ×ÐßãáâØâØ ÔÕâÕÚâÞà ãáöå öÓÞà? ÆÕ ßÞâÕÝæöÙÝÞ ÜÞÖÕ ÔÞÔÐâØ ÒÕÛØÚã ÚöÛìÚöáâì öÓÞà."
+#: gui/launcher.cpp:713
+msgid ""
+"Do you really want to run the mass game detector? This could potentially add "
+"a huge number of games."
+msgstr ""
+"²Ø ÔöÙáÝÞ åÞçÕâÕ ×ÐßãáâØâØ ÔÕâÕÚâÞà ãáöå öÓÞà? ÆÕ ßÞâÕÝæöÙÝÞ ÜÞÖÕ ÔÞÔÐâØ "
+"ÒÕÛØÚã ÚöÛìÚöáâì öÓÞà."
-#: gui/launcher.cpp:681
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -410,8 +427,7 @@ msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ×ÐßãáâØâØ ÔÕâÕÚâÞà ãáöå öÓÞà? ÆÕ ßÞâÕÝæöÙÝÞ ÜÞÖÕ ÔÞÔÐâØ
msgid "Yes"
msgstr "ÂÐÚ"
-#: gui/launcher.cpp:681
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:714 gui/launcher.cpp:863
#: backends/platform/symbian/src/SymbianOS.cpp:446
#: backends/platform/wince/CEActionsPocket.cpp:313
#: backends/platform/wince/CEActionsSmartphone.cpp:272
@@ -419,40 +435,51 @@ msgstr "ÂÐÚ"
msgid "No"
msgstr "½ö"
-#: gui/launcher.cpp:728
+#: gui/launcher.cpp:761
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÕ ÒöÔÚàØâØ ÒÚÐ×ÐÝã ßÐßÚã!"
-#: gui/launcher.cpp:740
+#: gui/launcher.cpp:773
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÕ ×ÝÐÙâØ Óàã ã ÒÚÐ×ÐÝöÙ ßÐßæö!"
-#: gui/launcher.cpp:754
+#: gui/launcher.cpp:787
msgid "Pick the game:"
msgstr "²ØÑÕàöâì Óàã:"
-#: gui/launcher.cpp:830
+#: gui/launcher.cpp:863
msgid "Do you really want to remove this game configuration?"
msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÔÐÛØâØ ãáâÐÝÞÒÚØ ÔÛï æöô÷ ÓàØ?"
-#: gui/launcher.cpp:893
+#: gui/launcher.cpp:926
msgid "This game does not support loading games from the launcher."
msgstr "Æï ÓàÐ ÝÕ ßöÔâàØÜãô ×ÐÒÐÝâÐÖÕÝÝï ×ÑÕàÕÖÕÝì çÕàÕ× ÓÞÛÞÒÝÕ ÜÕÝî."
-#: gui/launcher.cpp:897
+#: gui/launcher.cpp:930
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM ÝÕ ×ÜöÓ ×ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚã ÒØÑàÐÝÞ÷ ÓàØ!"
-#: gui/launcher.cpp:1009
+#: gui/launcher.cpp:1044
+#, fuzzy
+msgctxt "lowres"
+msgid "Mass Add..."
+msgstr "´ÞÔ. ÑÐÓÐâÞ..."
+
+#: gui/launcher.cpp:1044
msgid "Mass Add..."
msgstr "´ÞÔ. ÑÐÓÐâÞ..."
-#: gui/launcher.cpp:1010
+#: gui/launcher.cpp:1045
+#, fuzzy
+msgctxt "lowres"
msgid "Add Game..."
msgstr "´ÞÔ. Óàã..."
-#: gui/massadd.cpp:79
-#: gui/massadd.cpp:82
+#: gui/launcher.cpp:1045
+msgid "Add Game..."
+msgstr "´ÞÔ. Óàã..."
+
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... ßÞèãÚ ..."
@@ -515,267 +542,330 @@ msgstr "44 Ú³æ"
msgid "48 kHz"
msgstr "48 Ú³æ"
-#: gui/options.cpp:632
+#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497
+#: gui/options.cpp:555 gui/options.cpp:739
+#, fuzzy
+msgctxt "soundfont"
+msgid "None"
+msgstr "½Õ ×ÐÔÐÝØÙ"
+
+#: gui/options.cpp:635
msgid "Graphics mode:"
msgstr "³àÐäöçÝØÙ àÕÖØÜ:"
-#: gui/options.cpp:643
+#: gui/options.cpp:646
msgid "Render mode:"
msgstr "ÀÕÖØÜ àÐáâàãÒÐÝÝï:"
-#: gui/options.cpp:643
-#: gui/options.cpp:644
+#: gui/options.cpp:646 gui/options.cpp:647
msgid "Special dithering modes supported by some games"
msgstr "ÁßÕæöÐÛìÝö àÕÖØÜØ àÕÝÔÕàØÝÓã, ïÚö ßöÔâàØÜãîâì ÔÕïÚö öÓàØ"
-#: gui/options.cpp:653
+#: gui/options.cpp:656
msgid "Fullscreen mode"
msgstr "¿ÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Aspect ratio correction"
msgstr "ºÞàÕÚæöï áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ"
-#: gui/options.cpp:656
+#: gui/options.cpp:659
msgid "Correct aspect ratio for 320x200 games"
msgstr "ºÞàØÓãÒÐâØ áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ÔÛï öÓÞà × ÓàÐäöÚÞî 320x200"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Preferred Device:"
msgstr "¿àØáâàöÙ ïÚÞÜã ÒöÔÔÐôâìáï ßÕàÕÒÐÓÐ:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
#, fuzzy
msgid "Music Device:"
msgstr "¼ã×ØçÝØÙ ¿àØáâàöÙ:"
-#: gui/options.cpp:663
+#: gui/options.cpp:666
msgid "Specifies preferred sound device or sound card emulator"
msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ"
-#: gui/options.cpp:663
-#: gui/options.cpp:664
+#: gui/options.cpp:666 gui/options.cpp:667
msgid "Specifies output sound device or sound card emulator"
msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ"
-#: gui/options.cpp:688
+#: gui/options.cpp:692
msgid "AdLib emulator:"
msgstr "µÜãÛïâÞà AdLib:"
-#: gui/options.cpp:688
-#: gui/options.cpp:689
+#: gui/options.cpp:692 gui/options.cpp:693
msgid "AdLib is used for music in many games"
msgstr "·ÒãÚÞÒÐ ÚÐàâÐ AdLib ÒØÚÞàØáâÞÒãôâìáï ÑÐÓÐâìÜÐ öÓàÐÜØ"
-#: gui/options.cpp:699
+#: gui/options.cpp:703
msgid "Output rate:"
msgstr "²ØåöÔÝÐ çÐáâÞâÐ:"
-#: gui/options.cpp:699
-#: gui/options.cpp:700
-msgid "Higher value specifies better sound quality but may be not supported by your soundcard"
-msgstr "²ÕÛØÚö ×ÝÐçÕÝÝï ×ÐÔÐîâì ÚàÐéã ïÚöáâì ×ÒãÚã, ßàÞâÕ ÒÞÝØ ÜÞÖãâì ÝÕ ßöÔâàØÜãÒÐâØáï ÒÐèÞî ×ÒãÚÞÒÞî ÚÐàâÞî"
+#: gui/options.cpp:703 gui/options.cpp:704
+msgid ""
+"Higher value specifies better sound quality but may be not supported by your "
+"soundcard"
+msgstr ""
+"²ÕÛØÚö ×ÝÐçÕÝÝï ×ÐÔÐîâì ÚàÐéã ïÚöáâì ×ÒãÚã, ßàÞâÕ ÒÞÝØ ÜÞÖãâì ÝÕ "
+"ßöÔâàØÜãÒÐâØáï ÒÐèÞî ×ÒãÚÞÒÞî ÚÐàâÞî"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "GM Device:"
msgstr "¿àØáâàöÙ GM:"
-#: gui/options.cpp:710
+#: gui/options.cpp:714
msgid "Specifies default sound device for General MIDI output"
msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÔÛï MIDI"
-#: gui/options.cpp:731
+#: gui/options.cpp:736
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:731
-#: gui/options.cpp:732
+#: gui/options.cpp:736 gui/options.cpp:738 gui/options.cpp:739
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
-msgstr "SoundFont ßöÔâàØÜãôâìáï ÔÕïÚØÜØ ×ÒãÚÞÒØÜØ ÚÐàâÐÜØ, Fluidsynth ö Timidity"
+msgstr ""
+"SoundFont ßöÔâàØÜãôâìáï ÔÕïÚØÜØ ×ÒãÚÞÒØÜØ ÚÐàâÐÜØ, Fluidsynth ö Timidity"
-#: gui/options.cpp:736
+#: gui/options.cpp:738
+#, fuzzy
+msgctxt "lowres"
+msgid "SoundFont:"
+msgstr "SoundFont:"
+
+#: gui/options.cpp:743
msgid "Mixed AdLib/MIDI mode"
msgstr "·ÜöèÐÝØÙ àÕÖØÜ AdLib/MIDI"
-#: gui/options.cpp:736
+#: gui/options.cpp:743
msgid "Use both MIDI and AdLib sound generation"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ ö MIDI ö AdLib ÔÛï ÓÕÝÕàÐæö÷ ×ÒãÚã"
-#: gui/options.cpp:739
+#: gui/options.cpp:746
msgid "MIDI gain:"
msgstr "¿ÞáØÛÕÝÝï MIDI:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
#, fuzzy
msgid "MT-32 Device:"
msgstr "¿àØáâàöÙ MT-32:"
-#: gui/options.cpp:749
+#: gui/options.cpp:756
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
-msgstr "²ÚÐ×ãô ×ÒãÚÞÒØÙ ßàØáâàöÙ ßÞ ãÜÞÒçÐÝÝî ÔÛï ÒØÒÞÔã ÝÐ Roland MT-32/LAPC1/CM32l/CM64"
+msgstr ""
+"²ÚÐ×ãô ×ÒãÚÞÒØÙ ßàØáâàöÙ ßÞ ãÜÞÒçÐÝÝî ÔÛï ÒØÒÞÔã ÝÐ Roland MT-32/LAPC1/CM32l/"
+"CM64"
-#: gui/options.cpp:753
+#: gui/options.cpp:761
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "ÁßàÐÒÖÝöÙ Roland MT-32 (ÒØÜÚÝãâØ ÕÜãÛïæØî GM)"
-#: gui/options.cpp:753
-msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer"
-msgstr "²öÔÜöâìâÕ, ïÚéÞ ã ÒÐá ßöÔÚÛîçÕÝØÙ Roland-áãÜöáÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ö ÒØ åÞçÕâÕ ÙÞÓÞ ÒØÚÞàØáâÐâØ"
+#: gui/options.cpp:761 gui/options.cpp:763
+msgid ""
+"Check if you want to use your real hardware Roland-compatible sound device "
+"connected to your computer"
+msgstr ""
+"²öÔÜöâìâÕ, ïÚéÞ ã ÒÐá ßöÔÚÛîçÕÝØÙ Roland-áãÜöáÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ö ÒØ "
+"åÞçÕâÕ ÙÞÓÞ ÒØÚÞàØáâÐâØ"
-#: gui/options.cpp:756
+#: gui/options.cpp:763
+#, fuzzy
+msgctxt "lowres"
+msgid "True Roland MT-32 (disable GM emulation)"
+msgstr "ÁßàÐÒÖÝöÙ Roland MT-32 (ÒØÜÚÝãâØ ÕÜãÛïæØî GM)"
+
+#: gui/options.cpp:766
msgid "Enable Roland GS Mode"
msgstr "ÃÒöÜÚÝãâØ àÕÖØÜ Roland GS"
-#: gui/options.cpp:756
+#: gui/options.cpp:766
msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "²ØÜØÚÐô ÜÐßßöÝÓ General MIDI ÔÛï öÓÞà ö× ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32"
+msgstr ""
+"²ØÜØÚÐô ÜÐßßöÝÓ General MIDI ÔÛï öÓÞà ö× ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32"
-#: gui/options.cpp:780
+#: gui/options.cpp:791
msgid "Text and Speech:"
msgstr "ÂÕÚáâ ö Þ×ÒãçÕÝÝï:"
-#: gui/options.cpp:785
-#: gui/options.cpp:791
+#: gui/options.cpp:795 gui/options.cpp:805
msgid "Speech"
msgstr "¾×ÒãçÕÝÝï"
-#: gui/options.cpp:786
-#: gui/options.cpp:792
+#: gui/options.cpp:796 gui/options.cpp:806
msgid "Subtitles"
msgstr "ÁãÑâØâàØ"
-#: gui/options.cpp:787
-#: gui/options.cpp:793
+#: gui/options.cpp:797
msgid "Both"
msgstr "²áÕ"
-#: gui/options.cpp:791
+#: gui/options.cpp:799
+msgid "Subtitle speed:"
+msgstr "ÈÒØÔÚöáâì áãÑâØâàöÒ:"
+
+#: gui/options.cpp:801
+#, fuzzy
+msgctxt "lowres"
+msgid "Text and Speech:"
+msgstr "ÂÕÚáâ ö Þ×ÒãçÕÝÝï:"
+
+#: gui/options.cpp:805
msgid "Spch"
msgstr "¾×Ò"
-#: gui/options.cpp:792
+#: gui/options.cpp:806
msgid "Subs"
msgstr "狄"
-#: gui/options.cpp:793
+#: gui/options.cpp:807
+#, fuzzy
+msgctxt "lowres"
+msgid "Both"
+msgstr "²áÕ"
+
+#: gui/options.cpp:807
msgid "Show subtitles and play speech"
msgstr "¿ÞÚÐ×ãÒÐâØ áãÑâØâàØ ö ÒöÔâÒÞàîÒÐâØ ÜÞÒã"
-#: gui/options.cpp:797
+#: gui/options.cpp:809
+#, fuzzy
+msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "ÈÒØÔÚöáâì áãÑâØâàöÒ:"
-#: gui/options.cpp:809
+#: gui/options.cpp:825
+msgid "Music volume:"
+msgstr "³ãçÝöáâì Üã×ØÚØ:"
+
+#: gui/options.cpp:827
+#, fuzzy
+msgctxt "lowres"
msgid "Music volume:"
msgstr "³ãçÝöáâì Üã×ØÚØ:"
-#: gui/options.cpp:816
+#: gui/options.cpp:834
msgid "Mute All"
msgstr "²ØÜÚÝãâØ ãáÕ"
-#: gui/options.cpp:819
+#: gui/options.cpp:837
msgid "SFX volume:"
msgstr "³ãçÝöáâì ÕäÕÚâöÒ:"
-#: gui/options.cpp:819
-#: gui/options.cpp:820
+#: gui/options.cpp:837 gui/options.cpp:839 gui/options.cpp:840
msgid "Special sound effects volume"
msgstr "³ãçÝöáâì áßÕæöÐÛìÝØå ×ÒãÚÞÒØå ÕäÕÚâöÒ"
-#: gui/options.cpp:826
+#: gui/options.cpp:839
+#, fuzzy
+msgctxt "lowres"
+msgid "SFX volume:"
+msgstr "³ãçÝöáâì ÕäÕÚâöÒ:"
+
+#: gui/options.cpp:847
msgid "Speech volume:"
msgstr "³ãçÝöáâì Þ×ÒãçÕÝÝï:"
-#: gui/options.cpp:952
+#: gui/options.cpp:849
+#, fuzzy
+msgctxt "lowres"
+msgid "Speech volume:"
+msgstr "³ãçÝöáâì Þ×ÒãçÕÝÝï:"
+
+#: gui/options.cpp:978
msgid "Save Path: "
msgstr "ÈÛïå ÔÛï ×ÑÕàÕÖÕÝì: "
-#: gui/options.cpp:955
+#: gui/options.cpp:981
msgid "Theme Path:"
msgstr "ÈÛïå ÔÞ âÕÜ:"
-#: gui/options.cpp:958
-#: gui/options.cpp:959
+#: gui/options.cpp:984 gui/options.cpp:985
msgid "Specifies path to additional data used by all games or ScummVM"
-msgstr "²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå, ÒØÚÞàØáâÞÒãÒÐÝØå ãáöÜÐ öÓàÐÜØ, ÐÑÞ ScummVM"
+msgstr ""
+"²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå, ÒØÚÞàØáâÞÒãÒÐÝØå ãáöÜÐ öÓàÐÜØ, ÐÑÞ "
+"ScummVM"
-#: gui/options.cpp:962
+#: gui/options.cpp:988
msgid "Plugins Path:"
msgstr "ÈÛïå ÔÞ ßÛÐÓöÝöÒ:"
-#: gui/options.cpp:970
+#: gui/options.cpp:997
msgid "Misc"
msgstr "Àö×ÝÕ"
-#: gui/options.cpp:972
+#: gui/options.cpp:999
+#, fuzzy
+msgctxt "lowres"
+msgid "Misc"
+msgstr "Àö×ÝÕ"
+
+#: gui/options.cpp:1001
msgid "Theme:"
msgstr "ÂÕÜÐ:"
-#: gui/options.cpp:976
+#: gui/options.cpp:1005
msgid "GUI Renderer:"
msgstr "ÀÐáâÕàØ×ÐâÞà GUI:"
-#: gui/options.cpp:982
+#: gui/options.cpp:1017
+msgid "Autosave:"
+msgstr "°ÒâÞ×ÑÕàÕÖÕÝÝï:"
+
+#: gui/options.cpp:1019
+#, fuzzy
+msgctxt "lowres"
msgid "Autosave:"
msgstr "°ÒâÞ×ÑÕàÕÖÕÝÝï:"
-#: gui/options.cpp:990
+#: gui/options.cpp:1027
msgid "Keys"
msgstr "ºÛÐÒöèö"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "GUI Language:"
msgstr "¼ÞÒÐ öÝâÕàäÕÙáã:"
-#: gui/options.cpp:997
+#: gui/options.cpp:1034
msgid "Language of ScummVM GUI"
msgstr "¼ÞÒÐ ÓàÐäöçÝÞÓÞ öÝâÕàäÕÙáã ScummVM"
-#: gui/options.cpp:1002
-msgid "English"
-msgstr "English"
-
-#: gui/options.cpp:1146
+#: gui/options.cpp:1183
msgid "You have to restart ScummVM to take the effect."
msgstr "²Ø ßÞÒØÝÝö ßÕàÕ×ÐßãáâØâØ ScummVM éÞÑ ×ÐáâÞáãÒÐâØ ×ÜöÝØ."
-#: gui/options.cpp:1159
+#: gui/options.cpp:1196
msgid "Select directory for savegames"
msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï ×ÑÕàÕÖÕÝì"
-#: gui/options.cpp:1166
+#: gui/options.cpp:1203
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "½Õ ÜÞÖã ßØáÐâØ ã ÒØÑàÐÝã ßÐßÚã. ±ãÔì ÛÐáÚÐ, ÒÚÐÖöâì öÝèã."
-#: gui/options.cpp:1175
+#: gui/options.cpp:1212
msgid "Select directory for GUI themes"
msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï âÕÜ GUI"
-#: gui/options.cpp:1185
+#: gui/options.cpp:1222
msgid "Select directory for extra files"
msgstr "²ØÑÕàöâì ßÐßÚã × ÔÞÔÐâÚÞÒØÜØ äÐÙÛÐÜØ"
-#: gui/options.cpp:1196
+#: gui/options.cpp:1233
msgid "Select directory for plugins"
msgstr "²ØÑÕàöâì ßÐßÚã × ßÛÐÓØÝÐÜØ"
-#: gui/saveload.cpp:60
-#: gui/saveload.cpp:241
+#: gui/saveload.cpp:60 gui/saveload.cpp:241
msgid "No date saved"
msgstr "´ÐâÐ ÝÕ ×ÐßØáÐÝÐ"
-#: gui/saveload.cpp:61
-#: gui/saveload.cpp:242
+#: gui/saveload.cpp:61 gui/saveload.cpp:242
msgid "No time saved"
msgstr "ÇÐá ÝÕ ×ÐßØáÐÝØÙ"
-#: gui/saveload.cpp:62
-#: gui/saveload.cpp:243
+#: gui/saveload.cpp:62 gui/saveload.cpp:243
msgid "No playtime saved"
msgstr "ÇÐá ÓàØ ÝÕ ×ÐßØáÐÝÞ"
-#: gui/saveload.cpp:69
-#: gui/saveload.cpp:157
+#: gui/saveload.cpp:69 gui/saveload.cpp:157
msgid "Delete"
msgstr "²ØÔÐÛØâØ"
@@ -795,8 +885,7 @@ msgstr "ÇÐá: "
msgid "Playtime: "
msgstr "ÇÐá ÓàØ: "
-#: gui/saveload.cpp:286
-#: gui/saveload.cpp:353
+#: gui/saveload.cpp:286 gui/saveload.cpp:353
msgid "Untitled savestate"
msgstr "·ÑÕàÕÖÕÝÝï ÑÕ× öÜÕÝö"
@@ -816,6 +905,18 @@ msgstr "ÁâÐÝÔÐàâÝØÙ àÐáâÕàØ×ÐâÞà (16bpp)"
msgid "Antialiased Renderer (16bpp)"
msgstr "ÀÐáâÕàØ×ÐâÞà ×ö ×ÓÛÐÔÖãÒÐÝÝïÜ (16bpp)"
+#: gui/ThemeEngine.cpp:341
+#, fuzzy
+msgctxt "lowres"
+msgid "Standard Renderer (16bpp)"
+msgstr "ÁâÐÝÔÐàâÝØÙ àÐáâÕàØ×ÐâÞà (16bpp)"
+
+#: gui/ThemeEngine.cpp:342
+#, fuzzy
+msgctxt "lowres"
+msgid "Antialiased Renderer (16bpp)"
+msgstr "ÀÐáâÕàØ×ÐâÞà ×ö ×ÓÛÐÔÖãÒÐÝÝïÜ (16bpp)"
+
#: base/main.cpp:205
#, c-format
msgid "Engine does not support debug level '%s'"
@@ -825,15 +926,13 @@ msgstr "´ÒØÖÞÚ ÝÕ ßöÔâàØÜãô àöÒÕÝì ÒöÔÛÐÔÚØ '%s'"
msgid "Menu"
msgstr "¼ÕÝî"
-#: base/main.cpp:276
-#: backends/platform/symbian/src/SymbianActions.cpp:48
+#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48
#: backends/platform/wince/CEActionsPocket.cpp:44
#: backends/platform/wince/CEActionsSmartphone.cpp:45
msgid "Skip"
msgstr "¿àÞßãáâØâØ"
-#: base/main.cpp:279
-#: backends/platform/symbian/src/SymbianActions.cpp:53
+#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53
#: backends/platform/wince/CEActionsPocket.cpp:41
msgid "Pause"
msgstr "¿Ðã×Ð"
@@ -846,8 +945,7 @@ msgstr "¿àÞßãáâØâØ àïÔÞÚ"
msgid "Error running game:"
msgstr "¿ÞÜØÛÚÐ ×ÐßãáÚã ÓàØ:"
-#: base/main.cpp:430
-#: base/main.cpp:431
+#: base/main.cpp:430 base/main.cpp:431
msgid "Could not find any engine capable of running the selected game"
msgstr "½Õ ÜÞÖã ×ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚã ÒØÑàÐÝÞ÷ ÓàØ"
@@ -899,8 +997,7 @@ msgstr "¿ÞÜØÛÚÐ çØâÐÝÝï"
msgid "Writing data failed"
msgstr "¿ÞÜØÛÚÐ ×ÐßØáã ÔÐÝØå"
-#: common/error.cpp:60
-#: common/error.cpp:71
+#: common/error.cpp:60 common/error.cpp:71
msgid "Unknown Error"
msgstr "½ÕÒöÔÞÜÐ ßÞÜØÛÚÐ"
@@ -912,6 +1009,18 @@ msgstr "Hercules ·ÕÛÕÝØÙ"
msgid "Hercules Amber"
msgstr "Hercules ÏÝâÐàÝØÙ"
+#: common/util.cpp:262
+#, fuzzy
+msgctxt "lowres"
+msgid "Hercules Green"
+msgstr "Hercules ·ÕÛÕÝØÙ"
+
+#: common/util.cpp:263
+#, fuzzy
+msgctxt "lowres"
+msgid "Hercules Amber"
+msgstr "Hercules ÏÝâÐàÝØÙ"
+
#: engines/dialogs.cpp:89
msgid "~R~esume"
msgstr "¿àÞÔÞÒ~Ö~ØâØ"
@@ -936,16 +1045,21 @@ msgstr "~´~ÞßÞÜÞÓÐ"
msgid "~A~bout"
msgstr "¿àÞ ßàÞ~Ó~àÐÜã"
-#: engines/dialogs.cpp:109
+#: engines/dialogs.cpp:110
msgid "~R~eturn to Launcher"
msgstr "~¿~ÞÒÕàÝãâØáì Ò ÓÞÛÞÒÝÕ ÜÕÝî"
-#: engines/dialogs.cpp:119
+#: engines/dialogs.cpp:112
+#, fuzzy
+msgctxt "lowres"
+msgid "~R~eturn to Launcher"
+msgstr "~¿~ÞÒÕàÝãâØáì Ò ÓÞÛÞÒÝÕ ÜÕÝî"
+
+#: engines/dialogs.cpp:122
msgid "Save game:"
msgstr "·ÑÕàÕÓâØ Óàã: "
-#: engines/dialogs.cpp:119
-#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: engines/dialogs.cpp:122 backends/platform/symbian/src/SymbianActions.cpp:47
#: backends/platform/wince/CEActionsPocket.cpp:42
#: backends/platform/wince/CEActionsPocket.cpp:263
#: backends/platform/wince/CEActionsSmartphone.cpp:44
@@ -953,19 +1067,17 @@ msgstr "·ÑÕàÕÓâØ Óàã: "
msgid "Save"
msgstr "·ÐßØáÐâØ"
-#: engines/dialogs.cpp:301
-#: engines/mohawk/dialogs.cpp:84
+#: engines/dialogs.cpp:304 engines/mohawk/dialogs.cpp:84
#: engines/mohawk/dialogs.cpp:118
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302
-#: engines/mohawk/dialogs.cpp:85
+#: engines/dialogs.cpp:305 engines/mohawk/dialogs.cpp:85
#: engines/mohawk/dialogs.cpp:119
msgid "~C~ancel"
msgstr "²ö~Ô~ÜöÝÐ"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:308
msgid "~K~eys"
msgstr "~º~ÛÐÒöèö"
@@ -982,8 +1094,7 @@ msgstr "~½~Ðáâ"
msgid "~C~lose"
msgstr "~·~ÐÚàØâØ"
-#: engines/mohawk/dialogs.cpp:81
-#: engines/mohawk/dialogs.cpp:115
+#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115
msgid "~Z~ip Mode Activated"
msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ßÕàÕåÞÔã ÐÚâØÒÞÒÐÝØÙ"
@@ -1007,10 +1118,24 @@ msgstr "µÜãÛïâÞà DOSBox OPL"
msgid "No music"
msgstr "±Õ× Üã×ØÚØ"
+#: sound/mods/paula.cpp:192
+#, fuzzy
+msgid "Amiga Audio Emulator"
+msgstr "µÜãÛïâÞà AdLib"
+
#: sound/softsynth/adlib.cpp:1590
msgid "AdLib Emulator"
msgstr "µÜãÛïâÞà AdLib"
+#: sound/softsynth/appleiigs.cpp:36
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr ""
+
+#: sound/softsynth/sid.cpp:1434
+#, fuzzy
+msgid "C64 Audio Emulator"
+msgstr "µÜãÛïâÞà AdLib"
+
#: sound/softsynth/mt32.cpp:327
msgid "Initialising MT-32 Emulator"
msgstr "½ÐáâàÞîî ÕÜãÛïâÞà MT-32"
@@ -1137,6 +1262,12 @@ msgstr "ÀÕÖØÜ âÐçßÐÔã ÒØÜÚÝÕÝØÙ."
msgid "Normal (no scaling)"
msgstr "±Õ× ×ÑöÛìèÕÝÝï"
+#: backends/platform/sdl/graphics.cpp:59
+#, fuzzy
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "±Õ× ×ÑöÛìèÕÝÝï"
+
#: backends/platform/symbian/src/SymbianActions.cpp:41
#: backends/platform/wince/CEActionsSmartphone.cpp:38
msgid "Up"
@@ -1253,13 +1384,11 @@ msgstr "¿àØáÚÞàÕÝÝï GC ßÐÔã:"
msgid "DVD"
msgstr "DVD"
-#: backends/platform/wii/options.cpp:89
-#: backends/platform/wii/options.cpp:101
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
msgid "Status:"
msgstr "ÁâÐÝ:"
-#: backends/platform/wii/options.cpp:90
-#: backends/platform/wii/options.cpp:102
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
msgid "Unknown"
msgstr "½ÕÒöÔÞÜÞ"
@@ -1303,47 +1432,47 @@ msgstr "¿öÔÚÛîçØâØ SMB"
msgid "Unmount SMB"
msgstr "²öÔÚÛîçâØ SMB"
-#: backends/platform/wii/options.cpp:145
+#: backends/platform/wii/options.cpp:143
msgid "DVD Mounted successfully"
msgstr "DVD ßöÔÚÛîçÕÝØÙ ãáßöèÝÞ"
-#: backends/platform/wii/options.cpp:148
+#: backends/platform/wii/options.cpp:146
msgid "Error while mounting the DVD"
msgstr "¿ÞÜØÛÚÐ ßöÔ çÐá ßöÔÚÛîçÕÝÝï DVD"
-#: backends/platform/wii/options.cpp:150
+#: backends/platform/wii/options.cpp:148
msgid "DVD not mounted"
msgstr "DVD ÝÕ ßöÔÚÛîçÕÝØÙ"
-#: backends/platform/wii/options.cpp:163
+#: backends/platform/wii/options.cpp:161
msgid "Network up, share mounted"
msgstr "¼ÕàÕÖÐ ßàÐæîô, ßÐßÚÐ ßöÔÚÛîçÕÝÐ"
-#: backends/platform/wii/options.cpp:165
+#: backends/platform/wii/options.cpp:163
msgid "Network up"
msgstr "¼ÕàÕÖÐ ßàÐæîô"
-#: backends/platform/wii/options.cpp:168
+#: backends/platform/wii/options.cpp:166
msgid ", error while mounting the share"
msgstr ", ßÞÜØÛÚÐ ßöÔ çÐá ßöÔÚÛîçÕÝÝï ßÐßÚØ"
-#: backends/platform/wii/options.cpp:170
+#: backends/platform/wii/options.cpp:168
msgid ", share not mounted"
msgstr ", ßÐßÚÐ ÝÕ ßöÔÚÛîçÕÝÐ"
-#: backends/platform/wii/options.cpp:176
+#: backends/platform/wii/options.cpp:174
msgid "Network down"
msgstr "¼ÕàÕÖÐ ÒØÜÚÝÕÝÐ"
-#: backends/platform/wii/options.cpp:180
+#: backends/platform/wii/options.cpp:178
msgid "Initialising network"
msgstr "½ÐÛÐèâÞÒãî ÜÕàÕÖã"
-#: backends/platform/wii/options.cpp:184
+#: backends/platform/wii/options.cpp:182
msgid "Timeout while initialising network"
msgstr "ÇÐá ßöÔÚÛîçÕÝÝï ÔÞ ÜÕàÕÖö ÒØâöÚ"
-#: backends/platform/wii/options.cpp:188
+#: backends/platform/wii/options.cpp:186
#, c-format
msgid "Network not initialsed (%d)"
msgstr "¼ÕàÕÖÐ ÝÕ ÝÐÛÐÓÞÔÖÕÝÐ (%d)"
@@ -1431,3 +1560,10 @@ msgstr "¿ÞÚÐ×ÐâØ "
msgid "Do you want to perform an automatic scan ?"
msgstr "²Ø åÞçÕâÕ ×ÔöÙáÝØâØ ÐÒâÞÜÐâØçÝØÙ ßÞèãÚ?"
+#, fuzzy
+#~ msgctxt "lowres"
+#~ msgid "Special sound effects volume"
+#~ msgstr "³ãçÝöáâì áßÕæöÐÛìÝØå ×ÒãÚÞÒØå ÕäÕÚâöÒ"
+
+#~ msgid "English"
+#~ msgstr "English"
diff --git a/sound/decoders/mp3.cpp b/sound/decoders/mp3.cpp
index f22eae5102..848ee7e280 100644
--- a/sound/decoders/mp3.cpp
+++ b/sound/decoders/mp3.cpp
@@ -233,6 +233,8 @@ bool MP3Stream::seek(const Timestamp &where) {
while (mad_timer_compare(destination, _totalTime) > 0 && _state != MP3_STATE_EOS)
readHeader();
+ decodeMP3Data();
+
return (_state != MP3_STATE_EOS);
}
diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp
index c7587992e0..eb8bafee01 100644
--- a/sound/mididrv.cpp
+++ b/sound/mididrv.cpp
@@ -61,10 +61,14 @@ static const uint32 GUIOMapping[] = {
/*MDT_CMS, Common::GUIO_MIDICMS,*/
MT_PCJR, Common::GUIO_MIDIPCJR,
MT_ADLIB, Common::GUIO_MIDIADLIB,
+ MT_C64, Common::GUIO_MIDIC64,
+ MT_AMIGA, Common::GUIO_MIDIAMIGA,
+ MT_APPLEIIGS, Common::GUIO_MIDIAPPLEIIGS,
MT_TOWNS, Common::GUIO_MIDITOWNS,
+ MT_PC98, Common::GUIO_MIDIPC98,
MT_GM, Common::GUIO_MIDIGM,
MT_MT32, Common::GUIO_MIDIMT32,
- 0, 0
+ 0, 0
};
uint32 MidiDriver::musicType2GUIO(uint32 musicType) {
@@ -150,6 +154,21 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) {
return hdl;
break;
+ case MT_C64:
+ if (flags & MDT_C64)
+ return hdl;
+ break;
+
+ case MT_AMIGA:
+ if (flags & MDT_AMIGA)
+ return hdl;
+ break;
+
+ case MT_APPLEIIGS:
+ if (flags & MDT_APPLEIIGS)
+ return hdl;
+ break;
+
case MT_TOWNS:
if (flags & MDT_TOWNS)
return hdl;
@@ -224,10 +243,20 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) {
MusicType tp = MT_AUTO;
if (flags & MDT_TOWNS)
tp = MT_TOWNS;
+ else if (flags & MDT_PC98)
+ tp = MT_PC98;
else if (flags & MDT_ADLIB)
tp = MT_ADLIB;
else if (flags & MDT_PCSPK)
tp = MT_PCSPK;
+ else if (flags & MDT_PCJR)
+ tp = MT_PCJR;
+ else if (flags & MDT_C64)
+ tp = MT_C64;
+ else if (flags & MDT_AMIGA)
+ tp = MT_AMIGA;
+ else if (flags & MDT_APPLEIIGS)
+ tp = MT_APPLEIIGS;
else if (l == 0)
// if we haven't tried to find a MIDI device yet we do this now.
continue;
diff --git a/sound/mididrv.h b/sound/mididrv.h
index 1184adee6c..7ba1fe19f7 100644
--- a/sound/mididrv.h
+++ b/sound/mididrv.h
@@ -50,18 +50,21 @@ namespace Common { class String; }
* Music types that music drivers can implement and engines can rely on.
*/
enum MusicType {
- MT_INVALID = -1, // Invalid output
- MT_AUTO = 0, // Auto
- MT_NULL, // Null
- MT_PCSPK, // PC Speaker
- MT_PCJR, // PCjr
- MT_CMS, // CMS
- MT_ADLIB, // AdLib
- MT_TOWNS, // FM-TOWNS
- MT_PC98, // PC98
- MT_GM, // General MIDI
- MT_MT32, // MT-32
- MT_GS // Roland GS
+ MT_INVALID = -1, // Invalid output
+ MT_AUTO = 0, // Auto
+ MT_NULL, // Null
+ MT_PCSPK, // PC Speaker
+ MT_PCJR, // PCjr
+ MT_CMS, // CMS
+ MT_ADLIB, // AdLib
+ MT_C64, // C64
+ MT_AMIGA, // Amiga
+ MT_APPLEIIGS, // Apple IIGS
+ MT_TOWNS, // FM-TOWNS
+ MT_PC98, // PC98
+ MT_GM, // General MIDI
+ MT_MT32, // MT-32
+ MT_GS // Roland GS
};
/**
@@ -75,16 +78,19 @@ enum MusicType {
* @todo Rename MidiDriverFlags to MusicDriverFlags
*/
enum MidiDriverFlags {
- MDT_NONE = 0,
- MDT_PCSPK = 1 << 0, // PC Speaker: Maps to MD_PCSPK and MD_PCJR
- MDT_CMS = 1 << 1, // Creative Music System / Gameblaster: Maps to MD_CMS
- MDT_PCJR = 1 << 2, // Tandy/PC Junior driver
- MDT_ADLIB = 1 << 3, // AdLib: Maps to MT_ADLIB
- MDT_TOWNS = 1 << 4, // FM-TOWNS: Maps to MT_TOWNS
- MDT_PC98 = 1 << 5, // FM-TOWNS: Maps to MT_PC98
- MDT_MIDI = 1 << 6, // Real MIDI
- MDT_PREFER_MT32 = 1 << 7, // MT-32 output is preferred
- MDT_PREFER_GM = 1 << 8 // GM output is preferred
+ MDT_NONE = 0,
+ MDT_PCSPK = 1 << 0, // PC Speaker: Maps to MD_PCSPK and MD_PCJR
+ MDT_CMS = 1 << 1, // Creative Music System / Gameblaster: Maps to MD_CMS
+ MDT_PCJR = 1 << 2, // Tandy/PC Junior driver
+ MDT_ADLIB = 1 << 3, // AdLib: Maps to MT_ADLIB
+ MDT_C64 = 1 << 4,
+ MDT_AMIGA = 1 << 5,
+ MDT_APPLEIIGS = 1 << 6,
+ MDT_TOWNS = 1 << 7, // FM-TOWNS: Maps to MT_TOWNS
+ MDT_PC98 = 1 << 8, // FM-TOWNS: Maps to MT_PC98
+ MDT_MIDI = 1 << 9, // Real MIDI
+ MDT_PREFER_MT32 = 1 << 10, // MT-32 output is preferred
+ MDT_PREFER_GM = 1 << 11 // GM output is preferred
};
/**
diff --git a/sound/mods/paula.cpp b/sound/mods/paula.cpp
index 45626bb2ec..c39b37f83d 100644
--- a/sound/mods/paula.cpp
+++ b/sound/mods/paula.cpp
@@ -24,6 +24,7 @@
*/
#include "sound/mods/paula.h"
+#include "sound/null.h"
namespace Audio {
@@ -178,3 +179,34 @@ int Paula::readBufferIntern(int16 *buffer, const int numSamples) {
}
} // End of namespace Audio
+
+
+// Plugin interface
+// (This can only create a null driver since apple II gs support seeems not to be implemented
+// and also is not part of the midi driver architecture. But we need the plugin for the options
+// menu in the launcher and for MidiDriver::detectDevice() which is more or less used by all engines.)
+
+class AmigaMusicPlugin : public NullMusicPlugin {
+public:
+ const char *getName() const {
+ return _s("Amiga Audio Emulator");
+ }
+
+ const char *getId() const {
+ return "amiga";
+ }
+
+ MusicDevices getDevices() const;
+};
+
+MusicDevices AmigaMusicPlugin::getDevices() const {
+ MusicDevices devices;
+ devices.push_back(MusicDevice(this, "", MT_AMIGA));
+ return devices;
+}
+
+//#if PLUGIN_ENABLED_DYNAMIC(AMIGA)
+ //REGISTER_PLUGIN_DYNAMIC(AMIGA, PLUGIN_TYPE_MUSIC, AmigaMusicPlugin);
+//#else
+ REGISTER_PLUGIN_STATIC(AMIGA, PLUGIN_TYPE_MUSIC, AmigaMusicPlugin);
+//#endif
diff --git a/sound/module.mk b/sound/module.mk
index caf14be547..70bffb13d2 100644
--- a/sound/module.mk
+++ b/sound/module.mk
@@ -40,6 +40,7 @@ MODULE_OBJS := \
softsynth/fmtowns_pc98/towns_euphony.o \
softsynth/fmtowns_pc98/towns_pc98_driver.o \
softsynth/fmtowns_pc98/towns_pc98_fmsynth.o \
+ softsynth/appleiigs.o \
softsynth/ym2612.o \
softsynth/fluidsynth.o \
softsynth/mt32.o \
diff --git a/sound/softsynth/appleiigs.cpp b/sound/softsynth/appleiigs.cpp
new file mode 100644
index 0000000000..9004d1f0ab
--- /dev/null
+++ b/sound/softsynth/appleiigs.cpp
@@ -0,0 +1,57 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* $URL$
+* $Id$
+*
+*/
+
+#include "sound/null.h"
+
+// Plugin interface
+// (This can only create a null driver since apple II gs support seeems not to be implemented
+// and also is not part of the midi driver architecture. But we need the plugin for the options
+// menu in the launcher and for MidiDriver::detectDevice() which is more or less used by all engines.)
+
+class AppleIIGSMusicPlugin : public NullMusicPlugin {
+public:
+ const char *getName() const {
+ return _s("Apple II GS Emulator (NOT IMPLEMENTED)");
+ }
+
+ const char *getId() const {
+ return "appleIIgs";
+ }
+
+ MusicDevices getDevices() const;
+};
+
+MusicDevices AppleIIGSMusicPlugin::getDevices() const {
+ MusicDevices devices;
+ devices.push_back(MusicDevice(this, "", MT_APPLEIIGS));
+ return devices;
+}
+
+//#if PLUGIN_ENABLED_DYNAMIC(APPLEIIGS)
+ //REGISTER_PLUGIN_DYNAMIC(APPLEIIGS, PLUGIN_TYPE_MUSIC, AppleIIGSMusicPlugin);
+//#else
+ REGISTER_PLUGIN_STATIC(APPLEIIGS, PLUGIN_TYPE_MUSIC, AppleIIGSMusicPlugin);
+//#endif
+
diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp
index c9ba03ea27..66a83f74ce 100644
--- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp
+++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp
@@ -104,7 +104,8 @@ TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfac
_fmInstruments(0), _pcmInstruments(0), _pcmChan(0), _waveTables(0), _waveTablesTotalDataSize(0),
_baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver),
_pcmSfxChanMask(0), _musicVolume(Audio::Mixer::kMaxMixerVolume), _sfxVolume(Audio::Mixer::kMaxMixerVolume),
- _outputVolumeFlags(0), _outputMuteFlags(0), _ready(false) {
+ _outputVolumeFlags(0), _outputMuteFlags(0), _pcmChanOut(0), _pcmChanReserved(0), _pcmChanKeyPressed(0),
+ _pcmChanEffectPlaying(0), _pcmChanKeyPlaying(0), _ready(false) {
#define INTCB(x) &TownsAudioInterface::intf_##x
static const TownsAudioIntfCallback intfCb[] = {
@@ -200,7 +201,7 @@ TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfac
INTCB(notImpl),
// 72
INTCB(notImpl),
- INTCB(notImpl),
+ INTCB(cdaToggle),
INTCB(notImpl),
INTCB(notImpl),
// 76
@@ -225,6 +226,11 @@ TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfac
}
TownsAudioInterface::~TownsAudioInterface() {
+ Common::StackLock lock(_mutex);
+ reset();
+ deinit();
+ _ready = false;
+
delete[] _fmSaveReg[0];
delete[] _fmSaveReg[1];
delete[] _fmInstruments;
@@ -360,7 +366,6 @@ void TownsAudioInterface::timerCallbackB() {
}
int TownsAudioInterface::intf_reset(va_list &args) {
- Common::StackLock lock(_mutex);
fmReset();
pcmReset();
callback(68);
@@ -760,6 +765,12 @@ int TownsAudioInterface::intf_updateOutputVolume(va_list &args) {
return 0;
}
+int TownsAudioInterface::intf_cdaToggle(va_list &args) {
+ //int mode = va_arg(args, int);
+ //_unkMask = mode ? 0x7f : 0x3f;
+ return 0;
+}
+
int TownsAudioInterface::intf_pcmUpdateEnvelopeGenerator(va_list &args) {
for (int i = 0; i < 8; i++)
pcmUpdateEnvelopeGenerator(i);
@@ -1393,12 +1404,12 @@ void TownsAudioInterface::updateOutputVolume() {
// balance values for our -128 to 127 volume range
// CD-AUDIO
- int vl = (int)(((float)_outputLevel[12] * 127.0f) / 63.0f);
- int vr = (int)(((float)_outputLevel[13] * 127.0f) / 63.0f);
- int8 balance = vr - vl;
- vl = (int)(((float)_outputLevel[12] * 255.0f) / 63.0f);
- vr = (int)(((float)_outputLevel[13] * 255.0f) / 63.0f);
- AudioCD.setVolume((vl + vr) >> 1);
+ uint32 maxVol = MAX(_outputLevel[12], _outputLevel[13]);
+
+ int volume = (int)(((float)(maxVol * 255) / 63.0f));
+ int balance = maxVol ? (int)( ( ((int)_outputLevel[13] - _outputLevel[12]) * 127) / (float)maxVol) : 0;
+
+ AudioCD.setVolume(volume);
AudioCD.setBalance(balance);
}
diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.h b/sound/softsynth/fmtowns_pc98/towns_audio.h
index 950c016b4e..95fb1ded59 100644
--- a/sound/softsynth/fmtowns_pc98/towns_audio.h
+++ b/sound/softsynth/fmtowns_pc98/towns_audio.h
@@ -95,6 +95,7 @@ private:
int intf_setOutputVolume(va_list &args);
int intf_resetOutputVolume(va_list &args);
int intf_updateOutputVolume(va_list &args);
+ int intf_cdaToggle(va_list &args);
int intf_pcmUpdateEnvelopeGenerator(va_list &args);
int intf_notImpl(va_list &args);
diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
index 82d0bd0438..7b7fbddc4b 100644
--- a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
+++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
@@ -1040,7 +1040,10 @@ TownsPC98_AudioDriver::TownsPC98_AudioDriver(Audio::Mixer *mixer, EmuType type)
}
TownsPC98_AudioDriver::~TownsPC98_AudioDriver() {
+ Common::StackLock lock(_mutex);
reset();
+ deinit();
+ _ready = false;
if (_channels) {
for (int i = 0; i < _numChan; i++)
diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
index 241b9bde50..b51f695087 100644
--- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
+++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
@@ -835,14 +835,16 @@ TownsPC98_FmSynth::TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type) :
memset(&_timers[0], 0, sizeof(ChipTimer));
memset(&_timers[1], 0, sizeof(ChipTimer));
+
_timers[0].cb = &TownsPC98_FmSynth::timerCallbackA;
_timers[1].cb = &TownsPC98_FmSynth::timerCallbackB;
_timerbase = (uint32)(_baserate * 1000000.0f);
}
TownsPC98_FmSynth::~TownsPC98_FmSynth() {
- Common::StackLock lock(_mutex);
- _mixer->stopHandle(_soundHandle);
+ if (_ready)
+ deinit();
+
delete _ssg;
delete _prc;
delete[] _chanInternal;
@@ -881,6 +883,9 @@ bool TownsPC98_FmSynth::init() {
_prc->init(_percussionData);
}
+ _timers[0].cb = &TownsPC98_FmSynth::timerCallbackA;
+ _timers[1].cb = &TownsPC98_FmSynth::timerCallbackB;
+
_mixer->playStream(Audio::Mixer::kPlainSoundType,
&_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
@@ -1154,6 +1159,13 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) {
return numSamples;
}
+void TownsPC98_FmSynth::deinit() {
+ _mixer->stopHandle(_soundHandle);
+ _timers[0].cb = &TownsPC98_FmSynth::idleTimerCallback;
+ _timers[1].cb = &TownsPC98_FmSynth::idleTimerCallback;
+ _ready = false;
+}
+
uint8 TownsPC98_FmSynth::readSSGStatus() {
return _ssg->chanEnable();
}
diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
index 3072503610..4a618338ed 100644
--- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
+++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
@@ -71,6 +71,8 @@ public:
}
protected:
+ void deinit();
+
// Implement this in your inherited class if your driver generates
// additional output that has to be inserted into the buffer.
virtual void nextTickEx(int32 *buffer, uint32 bufferSize) {}
@@ -140,6 +142,7 @@ private:
bool _regProtectionFlag;
typedef void (TownsPC98_FmSynth::*ChipTimerProc)();
+ void idleTimerCallback() {}
struct ChipTimer {
bool enabled;
diff --git a/sound/softsynth/sid.cpp b/sound/softsynth/sid.cpp
index e925f4a447..c05ae2e8f5 100644
--- a/sound/softsynth/sid.cpp
+++ b/sound/softsynth/sid.cpp
@@ -31,6 +31,7 @@
#ifndef DISABLE_SID
#include "sid.h"
+#include "sound/null.h"
#include <math.h>
namespace Resid {
@@ -1422,4 +1423,34 @@ int SID::clock(cycle_count& delta_t, short* buf, int n, int interleave) {
}
+// Plugin interface
+// (This can only create a null driver since C64 audio support is not part of the
+// midi driver architecture. But we need the plugin for the options menu in the launcher
+// and for MidiDriver::detectDevice() which is more or less used by all engines.)
+
+class C64MusicPlugin : public NullMusicPlugin {
+public:
+ const char *getName() const {
+ return _s("C64 Audio Emulator");
+ }
+
+ const char *getId() const {
+ return "C64";
+ }
+
+ MusicDevices getDevices() const;
+};
+
+MusicDevices C64MusicPlugin::getDevices() const {
+ MusicDevices devices;
+ devices.push_back(MusicDevice(this, "", MT_C64));
+ return devices;
+}
+
+//#if PLUGIN_ENABLED_DYNAMIC(C64)
+ //REGISTER_PLUGIN_DYNAMIC(C64, PLUGIN_TYPE_MUSIC, C64MusicPlugin);
+//#else
+ REGISTER_PLUGIN_STATIC(C64, PLUGIN_TYPE_MUSIC, C64MusicPlugin);
+//#endif
+
#endif
diff --git a/test/common/bufferedreadstream.h b/test/common/bufferedreadstream.h
index c171836466..0b2cda696c 100644
--- a/test/common/bufferedreadstream.h
+++ b/test/common/bufferedreadstream.h
@@ -27,4 +27,29 @@ class BufferedReadStreamTestSuite : public CxxTest::TestSuite {
TS_ASSERT(srs.eos());
}
+
+ void test_traverse2() {
+ byte contents[9] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
+ Common::MemoryReadStream ms(contents, 9);
+
+ Common::BufferedReadStream brs(&ms, 4);
+
+ // Traverse the stream with reads of 2 bytes. The size is not
+ // a multiple of 2, so we can test the final partial read.
+
+ byte i, b[2];
+ for (i = 0; i < 4; ++i) {
+ TS_ASSERT(!brs.eos());
+
+ int n = brs.read(b, 2);
+ TS_ASSERT_EQUALS(n, 2);
+ }
+
+ TS_ASSERT(!brs.eos());
+
+ int n = brs.read(b, 2);
+ TS_ASSERT_EQUALS(n, 1);
+
+ TS_ASSERT(brs.eos());
+ }
};
diff --git a/test/common/str.h b/test/common/str.h
index 6581c37cdb..e1f2b39578 100644
--- a/test/common/str.h
+++ b/test/common/str.h
@@ -266,6 +266,8 @@ class StringTestSuite : public CxxTest::TestSuite
TS_ASSERT_EQUALS(Common::lastPathComponent("foo/./bar", '/'), "bar");
TS_ASSERT_EQUALS(Common::lastPathComponent("foo//./bar//", '/'), "bar");
TS_ASSERT_EQUALS(Common::lastPathComponent("foo//.bar//", '/'), ".bar");
+
+ TS_ASSERT_EQUALS(Common::lastPathComponent("foo", '/'), "foo");
}
void test_normalizePath() {
diff --git a/tools/README b/tools/README
index c21b057059..6ccd7b3694 100644
--- a/tools/README
+++ b/tools/README
@@ -30,7 +30,7 @@ convbdf
where SIZE is replaced by the desired font height.
-create_drascula
+create_drascula (sev)
---------------
Stores a lot of hardcoded data of Drascula in a data file, based on
the game's original source code. This includes the game's character
@@ -39,6 +39,10 @@ create_drascula
(mostly the dialog subtitles) in English, Spanish, German, French
and Italian. This tool is used to create the drascula.dat file.
+create_hugo (Strangerke)
+-----------
+ Creates hugo.dat file which contains all kinds of static data contained
+ in original game executable.
create_kyradat (LordHoto, athrxx)
--------------
@@ -66,6 +70,12 @@ create_msvc (LordHoto, Littleboy (contributor))
for further help.
+create_translations (criezy)
+-------------------
+ Creates the translations.dat file from po files given as arguments.
+ The generated files is used by ScummVM to propose a translated GUI.
+
+
credits.pl
----------
This perl script contains credits to the many people who helped with
diff --git a/tools/create_hugo/create_hugo.cpp b/tools/create_hugo/create_hugo.cpp
new file mode 100644
index 0000000000..0f460c9268
--- /dev/null
+++ b/tools/create_hugo/create_hugo.cpp
@@ -0,0 +1,1260 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ * This is a utility for storing all the hardcoded data of Hugo in a separate
+ * data file, used by the game engine
+ */
+
+// HACK to allow building with the SDL backend on MinGW
+// see bug #1800764 "TOOLS: MinGW tools building broken"
+#ifdef main
+#undef main
+#endif // main
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "common/scummsys.h"
+#include "common/events.h"
+
+#include "enums.h"
+
+#include "create_hugo.h"
+#include "staticdata.h"
+#include "staticdisplay.h"
+#include "staticengine.h"
+#include "staticintro.h"
+#include "staticmouse.h"
+#include "staticparser.h"
+#include "staticschedule.h"
+#include "staticutil.h"
+
+static void writeByte(FILE *fp, uint8 b) {
+ fwrite(&b, 1, 1, fp);
+}
+
+static void writeUint16BE(FILE *fp, uint16 value) {
+ writeByte(fp, (uint8)(value >> 8));
+ writeByte(fp, (uint8)(value & 0xFF));
+}
+
+void writeSint16BE(FILE *fp, int16 value) {
+ writeUint16BE(fp, (uint16)value);
+}
+
+static void writeUint32BE(FILE *fp, uint32 value) {
+ writeByte(fp, (uint8)(value >> 24));
+ writeByte(fp, (uint8)((value >> 16) & 0xFF));
+ writeByte(fp, (uint8)((value >> 8) & 0xFF));
+ writeByte(fp, (uint8)(value & 0xFF));
+}
+
+void writeSint32BE(FILE *fp, int32 value) {
+ writeUint32BE(fp, (uint16)value);
+}
+
+int main(int argc, char *argv[]) {
+ FILE *outFile;
+ int i;
+ int nbrElem, nbrSubElem;
+
+ outFile = fopen("hugo.dat", "wb");
+
+ // Write header
+ fwrite("HUGO", 4, 1, outFile);
+
+ writeByte(outFile, HUGO_DAT_VER_MAJ);
+ writeByte(outFile, HUGO_DAT_VER_MIN);
+
+ // game versions/variantes
+ writeUint16BE(outFile, NUM_VARIANTE);
+
+ // Write textData
+ // textData_1w
+ nbrElem = sizeof(textData_1w) / sizeof(char *);
+ writeTextArray(outFile, textData_1w, nbrElem);
+
+ // textData_2w
+ nbrElem = sizeof(textData_2w) / sizeof(char *);
+ writeTextArray(outFile, textData_2w, nbrElem);
+
+ // textData_3w
+ nbrElem = sizeof(textData_3w) / sizeof(char *);
+ writeTextArray(outFile, textData_3w, nbrElem);
+
+ // textData_1d
+ nbrElem = sizeof(textData_1d) / sizeof(char *);
+ writeTextArray(outFile, textData_1d, nbrElem);
+
+ // textData_2d
+ nbrElem = sizeof(textData_2d) / sizeof(char *);
+ writeTextArray(outFile, textData_2d, nbrElem);
+
+ // textData_3d
+ nbrElem = sizeof(textData_3d) / sizeof(char *);
+ writeTextArray(outFile, textData_3d, nbrElem);
+
+ // Write string_t_Data
+ // string_t_Data_1w
+ nbrElem = sizeof(string_t_Data_1w) / sizeof(char *);
+ writeTextArray(outFile, string_t_Data_1w, nbrElem);
+
+ // string_t_Data_2w
+ nbrElem = sizeof(string_t_Data_2w) / sizeof(char *);
+ writeTextArray(outFile, string_t_Data_2w, nbrElem);
+
+ // string_t_Data_3w
+ nbrElem = sizeof(string_t_Data_3w) / sizeof(char *);
+ writeTextArray(outFile, string_t_Data_3w, nbrElem);
+
+ // string_t_Data_1d
+ nbrElem = sizeof(string_t_Data_1d) / sizeof(char *);
+ writeTextArray(outFile, string_t_Data_1d, nbrElem);
+
+ // string_t_Data_2d
+ nbrElem = sizeof(string_t_Data_2d) / sizeof(char *);
+ writeTextArray(outFile, string_t_Data_2d, nbrElem);
+
+ // string_t_Data_3d
+ nbrElem = sizeof(string_t_Data_3d) / sizeof(char *);
+ writeTextArray(outFile, string_t_Data_3d, nbrElem);
+
+ // arrayNouns_1w
+ nbrElem = sizeof(arrayNouns_1w) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayNouns_1w[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayNouns_1w[j], nbrSubElem);
+ }
+
+ // arrayNouns_2w
+ nbrElem = sizeof(arrayNouns_2w) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayNouns_2w[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayNouns_2w[j], nbrSubElem);
+ }
+
+ // arrayNouns_3w
+ nbrElem = sizeof(arrayNouns_3w) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayNouns_3w[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayNouns_3w[j], nbrSubElem);
+ }
+
+ // arrayNouns_1d
+ nbrElem = sizeof(arrayNouns_1d) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayNouns_1d[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayNouns_1d[j], nbrSubElem);
+ }
+
+ // arrayNouns_2d
+ nbrElem = sizeof(arrayNouns_2d) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayNouns_2d[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayNouns_2d[j], nbrSubElem);
+ }
+
+ // arrayNouns_3d
+ nbrElem = sizeof(arrayNouns_3d) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayNouns_3d[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayNouns_3d[j], nbrSubElem);
+ }
+
+ // arrayVerbs_1w
+ nbrElem = sizeof(arrayVerbs_1w) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayVerbs_1w[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayVerbs_1w[j], nbrSubElem);
+ }
+
+ // arrayVerbs_2w
+ nbrElem = sizeof(arrayVerbs_2w) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayVerbs_2w[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayVerbs_2w[j], nbrSubElem);
+ }
+
+ // arrayVerbs_3w
+ nbrElem = sizeof(arrayVerbs_3w) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayVerbs_3w[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayVerbs_3w[j], nbrSubElem);
+ }
+
+ // arrayVerbs_1d
+ nbrElem = sizeof(arrayVerbs_1d) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayVerbs_1d[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayVerbs_1d[j], nbrSubElem);
+ }
+
+ // arrayVerbs_2d
+ nbrElem = sizeof(arrayVerbs_2d) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayVerbs_2d[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayVerbs_2d[j], nbrSubElem);
+ }
+
+ // arrayVerbs_3d
+ nbrElem = sizeof(arrayVerbs_3d) / sizeof(char **);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; strcmp(arrayVerbs_3d[j][nbrSubElem], ""); nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeTextArray(outFile, arrayVerbs_3d[j], nbrSubElem);
+ }
+
+ // Write screenNames
+ // screenNames_1w
+ nbrElem = sizeof(screenNames_1w) / sizeof(char *);
+ writeTextArray(outFile, screenNames_1w, nbrElem);
+
+ // screenNames_2w
+ nbrElem = sizeof(screenNames_2w) / sizeof(char *);
+ writeTextArray(outFile, screenNames_2w, nbrElem);
+
+ // screenNames_3w
+ nbrElem = sizeof(screenNames_3w) / sizeof(char *);
+ writeTextArray(outFile, screenNames_3w, nbrElem);
+
+ // screenNames_1d
+ nbrElem = sizeof(screenNames_1d) / sizeof(char *);
+ writeTextArray(outFile, screenNames_1d, nbrElem);
+
+ // screenNames_2d
+ nbrElem = sizeof(screenNames_2d) / sizeof(char *);
+ writeTextArray(outFile, screenNames_2d, nbrElem);
+
+ // screenNames_3d
+ nbrElem = sizeof(screenNames_3d) / sizeof(char *);
+ writeTextArray(outFile, screenNames_3d, nbrElem);
+
+ // Write palette
+ writeUint16BE(outFile, SIZE_PAL_ARRAY);
+ for (i = 0; i < SIZE_PAL_ARRAY; i++) {
+ writeByte(outFile, _palette[i]);
+ }
+
+ // Write textEngine
+ writeTextArray(outFile, textEngine, NUM_ENGINE_TEXT);
+
+ // Write textIntro
+ writeTextArray(outFile, textIntro, NUM_INTRO_TEXT);
+
+ // Write x_intro and y_intro
+ writeUint16BE(outFile, NUM_INTRO_TICK);
+ for (i = 0; i < NUM_INTRO_TICK; i++) {
+ writeByte(outFile, x_intro[i]);
+ writeByte(outFile, y_intro[i]);
+ }
+
+ // Write textMouse
+ writeTextArray(outFile, textMouse, NUM_MOUSE_TEXT);
+
+ // Write textParser
+ writeTextArray(outFile, textParser, NUM_PARSER_TEXT);
+
+ // Write textSchedule
+ writeTextArray(outFile, textSchedule, NUM_SCHEDULE_TEXT);
+
+ // Write textUtil
+ writeTextArray(outFile, textUtil, NUM_UTIL_TEXT);
+
+ // arrayReqs_1w
+ nbrElem = sizeof(arrayReqs_1w) / sizeof(uint16 *);
+ writeUint16Array(outFile, arrayReqs_1w, nbrElem);
+
+ // arrayReqs_2w
+ nbrElem = sizeof(arrayReqs_2w) / sizeof(uint16 *);
+ writeUint16Array(outFile, arrayReqs_2w, nbrElem);
+
+ // arrayReqs_3w
+ nbrElem = sizeof(arrayReqs_3w) / sizeof(uint16 *);
+ writeUint16Array(outFile, arrayReqs_3w, nbrElem);
+
+ // arrayReqs_1d
+ nbrElem = sizeof(arrayReqs_1d) / sizeof(uint16 *);
+ writeUint16Array(outFile, arrayReqs_1d, nbrElem);
+
+ // arrayReqs_2d
+ nbrElem = sizeof(arrayReqs_2d) / sizeof(uint16 *);
+ writeUint16Array(outFile, arrayReqs_2d, nbrElem);
+
+ // arrayReqs_3d
+ nbrElem = sizeof(arrayReqs_3d) / sizeof(uint16 *);
+ writeUint16Array(outFile, arrayReqs_3d, nbrElem);
+
+ // hotspots_1w
+ nbrElem = sizeof(hotspots_1w) / sizeof(hotspot_t);
+ writeHotspot(outFile, hotspots_1w, nbrElem);
+
+ // hotspots_2w
+ nbrElem = sizeof(hotspots_2w) / sizeof(hotspot_t);
+ writeHotspot(outFile, hotspots_2w, nbrElem);
+
+ // hotspots_3w
+ nbrElem = sizeof(hotspots_3w) / sizeof(hotspot_t);
+ writeHotspot(outFile, hotspots_3w, nbrElem);
+
+ // hotspots_1d
+ nbrElem = sizeof(hotspots_1d) / sizeof(hotspot_t);
+ writeHotspot(outFile, hotspots_1d, nbrElem);
+
+ // hotspots_2d
+ nbrElem = sizeof(hotspots_2d) / sizeof(hotspot_t);
+ writeHotspot(outFile, hotspots_2d, nbrElem);
+
+ // hotspots_3d
+ nbrElem = sizeof(hotspots_3d) / sizeof(hotspot_t);
+ writeHotspot(outFile, hotspots_3d, nbrElem);
+
+ // invent_1w
+ nbrElem = sizeof(invent_1w) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, invent_1w[j]);
+
+ // invent_2w
+ nbrElem = sizeof(invent_2w) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, invent_2w[j]);
+
+ // invent_3w
+ nbrElem = sizeof(invent_3w) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, invent_3w[j]);
+
+ // invent_1d
+ nbrElem = sizeof(invent_1d) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, invent_1d[j]);
+
+ // invent_2d
+ nbrElem = sizeof(invent_2d) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, invent_2d[j]);
+
+ // invent_3d
+ nbrElem = sizeof(invent_3d) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, invent_3d[j]);
+
+ // uses_1w
+ nbrElem = sizeof(uses_1w) / sizeof(uses_t);
+ writeUseArray(outFile, uses_1w, nbrElem);
+
+ // uses_2w
+ nbrElem = sizeof(uses_2w) / sizeof(uses_t);
+ writeUseArray(outFile, uses_2w, nbrElem);
+
+ // uses_3w
+ nbrElem = sizeof(uses_3w) / sizeof(uses_t);
+ writeUseArray(outFile, uses_3w, nbrElem);
+
+ // uses_1d
+ nbrElem = sizeof(uses_1d) / sizeof(uses_t);
+ writeUseArray(outFile, uses_1d, nbrElem);
+
+ // uses_2d
+ nbrElem = sizeof(uses_2d) / sizeof(uses_t);
+ writeUseArray(outFile, uses_2d, nbrElem);
+
+ // uses_3d
+ nbrElem = sizeof(uses_3d) / sizeof(uses_t);
+ writeUseArray(outFile, uses_3d, nbrElem);
+
+ // catchall_1w
+ nbrElem = sizeof(catchall_1w) / sizeof(background_t);
+ writeBackgroundArray(outFile, catchall_1w, nbrElem);
+
+ // catchall_2w
+ nbrElem = sizeof(catchall_2w) / sizeof(background_t);
+ writeBackgroundArray(outFile, catchall_2w, nbrElem);
+
+ // catchall_3w
+ nbrElem = sizeof(catchall_3w) / sizeof(background_t);
+ writeBackgroundArray(outFile, catchall_3w, nbrElem);
+
+ // catchall_1d
+ nbrElem = sizeof(catchall_1d) / sizeof(background_t);
+ writeBackgroundArray(outFile, catchall_1d, nbrElem);
+
+ // catchall_2d
+ nbrElem = sizeof(catchall_2d) / sizeof(background_t);
+ writeBackgroundArray(outFile, catchall_2d, nbrElem);
+
+ // catchall_3d
+ nbrElem = sizeof(catchall_3d) / sizeof(background_t);
+ writeBackgroundArray(outFile, catchall_3d, nbrElem);
+
+ // backgroundList_1w
+ nbrElem = sizeof(backgroundList_1w) / sizeof(background_t *);
+ writeUint16BE(outFile, nbrElem);
+ for (int j = 0; j < nbrElem; j++) {
+ nbrSubElem = 1;
+ for (int k = 0; backgroundList_1w[j][k].verbIndex != 0; k++)
+ nbrSubElem ++;
+ writeBackgroundArray(outFile, backgroundList_1w[j], nbrSubElem);
+ }
+
+ // backgroundList_2w
+ nbrElem = sizeof(backgroundList_2w) / sizeof(background_t *);
+ writeUint16BE(outFile, nbrElem);
+ for (int j = 0; j < nbrElem; j++) {
+ nbrSubElem = 1;
+ for (int k = 0; backgroundList_2w[j][k].verbIndex != 0; k++)
+ nbrSubElem ++;
+ writeBackgroundArray(outFile, backgroundList_2w[j], nbrSubElem);
+ }
+
+ // backgroundList_3w
+ nbrElem = sizeof(backgroundList_3w) / sizeof(background_t *);
+ writeUint16BE(outFile, nbrElem);
+ for (int j = 0; j < nbrElem; j++) {
+ nbrSubElem = 1;
+ for (int k = 0; backgroundList_3w[j][k].verbIndex != 0; k++)
+ nbrSubElem ++;
+ writeBackgroundArray(outFile, backgroundList_3w[j], nbrSubElem);
+ }
+
+ // backgroundList_1d
+ nbrElem = sizeof(backgroundList_1d) / sizeof(background_t *);
+ writeUint16BE(outFile, nbrElem);
+ for (int j = 0; j < nbrElem; j++) {
+ nbrSubElem = 1;
+ for (int k = 0; backgroundList_1d[j][k].verbIndex != 0; k++)
+ nbrSubElem ++;
+ writeBackgroundArray(outFile, backgroundList_1d[j], nbrSubElem);
+ }
+
+ // backgroundList_2d
+ nbrElem = sizeof(backgroundList_2d) / sizeof(background_t *);
+ writeUint16BE(outFile, nbrElem);
+ for (int j = 0; j < nbrElem; j++) {
+ nbrSubElem = 1;
+ for (int k = 0; backgroundList_2d[j][k].verbIndex != 0; k++)
+ nbrSubElem ++;
+ writeBackgroundArray(outFile, backgroundList_2d[j], nbrSubElem);
+ }
+
+ // backgroundList_3d
+ nbrElem = sizeof(backgroundList_3d) / sizeof(background_t *);
+ writeUint16BE(outFile, nbrElem);
+ for (int j = 0; j < nbrElem; j++) {
+ nbrSubElem = 1;
+ for (int k = 0; backgroundList_3d[j][k].verbIndex != 0; k++)
+ nbrSubElem ++;
+ writeBackgroundArray(outFile, backgroundList_3d[j], nbrSubElem);
+ }
+
+ // points_1w
+ nbrElem = sizeof(points_1w) / sizeof(byte);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeByte(outFile, points_1w[j]);
+
+ // points_2w
+ nbrElem = sizeof(points_2w) / sizeof(byte);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeByte(outFile, points_2w[j]);
+
+ // points_3w
+ nbrElem = sizeof(points_3w) / sizeof(byte);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeByte(outFile, points_3w[j]);
+
+ // points_1d
+ nbrElem = sizeof(points_1d) / sizeof(byte);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeByte(outFile, points_1d[j]);
+
+ // points_2d
+ nbrElem = sizeof(points_2d) / sizeof(byte);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeByte(outFile, points_2d[j]);
+
+ // points_3d
+ nbrElem = sizeof(points_3d) / sizeof(byte);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeByte(outFile, points_3d[j]);
+
+ // cmdList_1w
+ nbrElem = sizeof(cmdList_1w) / sizeof(cmd **);
+ writeCmdArray(outFile, cmdList_1w, nbrElem);
+
+ // cmdList_2w
+ nbrElem = sizeof(cmdList_2w) / sizeof(cmd **);
+ writeCmdArray(outFile, cmdList_2w, nbrElem);
+
+ // cmdList_3w
+ nbrElem = sizeof(cmdList_3w) / sizeof(cmd **);
+ writeCmdArray(outFile, cmdList_3w, nbrElem);
+
+ // cmdList_1d
+ nbrElem = sizeof(cmdList_1d) / sizeof(cmd **);
+ writeCmdArray(outFile, cmdList_1d, nbrElem);
+
+ // cmdList_2d
+ nbrElem = sizeof(cmdList_2d) / sizeof(cmd **);
+ writeCmdArray(outFile, cmdList_2d, nbrElem);
+
+ // cmdList_3d
+ nbrElem = sizeof(cmdList_3d) / sizeof(cmd **);
+ writeCmdArray(outFile, cmdList_3d, nbrElem);
+
+ // screenActs_1w
+ nbrElem = sizeof(screenActs_1w) / sizeof(uint16 *);
+ writeScreenActs(outFile, screenActs_1w, nbrElem);
+
+ // screenActs_2w
+ nbrElem = sizeof(screenActs_2w) / sizeof(uint16 *);
+ writeScreenActs(outFile, screenActs_2w, nbrElem);
+
+ // screenActs_3w
+ nbrElem = sizeof(screenActs_3w) / sizeof(uint16 *);
+ writeScreenActs(outFile, screenActs_3w, nbrElem);
+
+ // screenActs_1d
+ nbrElem = sizeof(screenActs_1d) / sizeof(uint16 *);
+ writeScreenActs(outFile, screenActs_1d, nbrElem);
+
+ // screenActs_2d
+ nbrElem = sizeof(screenActs_2d) / sizeof(uint16 *);
+ writeScreenActs(outFile, screenActs_2d, nbrElem);
+
+ // screenActs_3d
+ nbrElem = sizeof(screenActs_3d) / sizeof(uint16 *);
+ writeScreenActs(outFile, screenActs_3d, nbrElem);
+
+ // objects_1w
+ nbrElem = sizeof(objects_1w) / sizeof(object_t);
+ writeObjectArray(outFile, objects_1w, nbrElem);
+
+ // objects_2w
+ nbrElem = sizeof(objects_2w) / sizeof(object_t);
+ writeObjectArray(outFile, objects_2w, nbrElem);
+
+ // objects_3w
+ nbrElem = sizeof(objects_3w) / sizeof(object_t);
+ writeObjectArray(outFile, objects_3w, nbrElem);
+
+ // objects_1d
+ nbrElem = sizeof(objects_1d) / sizeof(object_t);
+ writeObjectArray(outFile, objects_1d, nbrElem);
+
+ // objects_2d
+ nbrElem = sizeof(objects_2d) / sizeof(object_t);
+ writeObjectArray(outFile, objects_2d, nbrElem);
+
+ // objects_3d
+ nbrElem = sizeof(objects_3d) / sizeof(object_t);
+ writeObjectArray(outFile, objects_3d, nbrElem);
+
+ // actlistArr_1w
+ nbrElem = sizeof(actListArr_1w) / sizeof(actList);
+ writeActListArray(outFile, actListArr_1w, nbrElem);
+
+ // actlistArr_2w
+ nbrElem = sizeof(actListArr_2w) / sizeof(actList);
+ writeActListArray(outFile, actListArr_2w, nbrElem);
+
+ // actlistArr_3w
+ nbrElem = sizeof(actListArr_3w) / sizeof(actList);
+ writeActListArray(outFile, actListArr_3w, nbrElem);
+
+ // actlistArr_1d
+ nbrElem = sizeof(actListArr_1d) / sizeof(actList);
+ writeActListArray(outFile, actListArr_1d, nbrElem);
+
+ // actlistArr_2d
+ nbrElem = sizeof(actListArr_2d) / sizeof(actList);
+ writeActListArray(outFile, actListArr_2d, nbrElem);
+
+ // actlistArr_3d
+ nbrElem = sizeof(actListArr_3d) / sizeof(actList);
+ writeActListArray(outFile, actListArr_3d, nbrElem);
+
+ writeByte(outFile, NUM_TUNES_1w);
+ writeByte(outFile, SILENCE_1w);
+ writeByte(outFile, TEST_SOUND_1w);
+
+ writeByte(outFile, NUM_TUNES_2w);
+ writeByte(outFile, SILENCE_2w);
+ writeByte(outFile, TEST_SOUND_2w);
+
+ writeByte(outFile, NUM_TUNES_3w);
+ writeByte(outFile, SILENCE_3w);
+ writeByte(outFile, TEST_SOUND_3w);
+
+ writeByte(outFile, NUM_TUNES_1d);
+ writeByte(outFile, SILENCE_1d);
+ writeByte(outFile, TEST_SOUND_1d);
+
+ writeByte(outFile, NUM_TUNES_2d);
+ writeByte(outFile, SILENCE_2d);
+ writeByte(outFile, TEST_SOUND_2d);
+
+ writeByte(outFile, NUM_TUNES_3d);
+ writeByte(outFile, SILENCE_3d);
+ writeByte(outFile, TEST_SOUND_3d);
+
+ // def_tunes_1w
+ nbrElem = sizeof(def_tunes_1w) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, def_tunes_1w[j]);
+
+ // def_tunes_2w
+ nbrElem = sizeof(def_tunes_2w) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, def_tunes_2w[j]);
+
+ // def_tunes_3w
+ nbrElem = sizeof(def_tunes_3w) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, def_tunes_3w[j]);
+
+ // def_tunes_1d
+ nbrElem = sizeof(def_tunes_1d) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, def_tunes_1d[j]);
+
+ // def_tunes_2d
+ nbrElem = sizeof(def_tunes_2d) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, def_tunes_2d[j]);
+
+ // def_tunes_3d
+ nbrElem = sizeof(def_tunes_3d) / sizeof(int16);
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++)
+ writeSint16BE(outFile, def_tunes_3d[j]);
+
+ // Save _screnStates array size
+ writeUint16BE(outFile, LASTOBJ_1w);
+ writeUint16BE(outFile, LASTOBJ_2w);
+ writeUint16BE(outFile, NUM_PICS_3w);
+
+ writeUint16BE(outFile, NUM_PICS_1d); //(not set in original, as Hugo1 DOS doesn't use a DAT file to pack the screens)
+ writeUint16BE(outFile, LASTOBJ_2d);
+ writeUint16BE(outFile, NUM_PICS_3d);
+
+ // Save Look, Take and Drop constants
+ writeUint16BE(outFile, kVLook_1w);
+ writeUint16BE(outFile, kVTake_1w);
+ writeUint16BE(outFile, kVDrop_1w);
+
+ writeUint16BE(outFile, kVLook_2w);
+ writeUint16BE(outFile, kVTake_2w);
+ writeUint16BE(outFile, kVDrop_2w);
+
+ writeUint16BE(outFile, kVLook_3w);
+ writeUint16BE(outFile, kVTake_3w);
+ writeUint16BE(outFile, kVDrop_3w);
+
+ writeUint16BE(outFile, kVLook_1d);
+ writeUint16BE(outFile, kVTake_1d);
+ writeUint16BE(outFile, kVDrop_1d);
+
+ writeUint16BE(outFile, kVLook_2d);
+ writeUint16BE(outFile, kVTake_2d);
+ writeUint16BE(outFile, kVDrop_2d);
+
+ writeUint16BE(outFile, kVLook_3d);
+ writeUint16BE(outFile, kVTake_3d);
+ writeUint16BE(outFile, kVDrop_3d);
+
+ // Save LASTOBJ
+ writeUint16BE(outFile, LASTOBJ_1w);
+ writeUint16BE(outFile, LASTOBJ_2w);
+ writeUint16BE(outFile, LASTOBJ_3w);
+ writeUint16BE(outFile, NUM_PICS_1d); //(not set in original, as Hugo1 DOS doesn't use a DAT file to pack the screens)
+ writeUint16BE(outFile, LASTOBJ_2d);
+ writeUint16BE(outFile, LASTOBJ_3d);
+
+ // Maze ALnewscr
+ writeUint16BE(outFile, 0);
+ writeUint16BE(outFile, kALnewscr_2w);
+ writeUint16BE(outFile, 0);
+ writeUint16BE(outFile, 0);
+ writeUint16BE(outFile, kALnewscr_2d);
+ writeUint16BE(outFile, 0);
+
+ fclose(outFile);
+ return 0;
+}
+
+void writeTextArray(FILE *outFile, const char *textArray[], int nbrText) {
+ int len, len1, pad;
+ uint8 padBuf[DATAALIGNMENT];
+
+ for (int i = 0; i < DATAALIGNMENT; i++)
+ padBuf[i] = 0;
+
+ writeUint16BE(outFile, nbrText);
+ len = DATAALIGNMENT - 2;
+ for (int i = 0; i < nbrText; i++) {
+ len1 = strlen(textArray[i]) + 1;
+ pad = DATAALIGNMENT - (len1 + 2) % DATAALIGNMENT;
+ len += 2 + len1 + pad;
+ }
+ writeUint16BE(outFile, len);
+
+ fwrite(padBuf, DATAALIGNMENT - 2, 1, outFile); // padding
+ for (int i = 0; i < nbrText; i++) {
+ len = strlen(textArray[i]) + 1;
+ pad = DATAALIGNMENT - (len + 2) % DATAALIGNMENT;
+
+ writeUint16BE(outFile, len + pad + 2);
+ fwrite(textArray[i], len, 1, outFile);
+ fwrite(padBuf, pad, 1, outFile);
+ }
+}
+
+void writeUint16Array(FILE *outFile, const uint16 *uint16Array[], int nbrElem) {
+ int nbrSubElem;
+
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ for (nbrSubElem = 1; uint16Array[j][nbrSubElem] != 0; nbrSubElem++)
+ ;
+ nbrSubElem++;
+ writeUint16BE(outFile, nbrSubElem);
+
+ for (int i = 0; i < nbrSubElem; i++) {
+ writeUint16BE(outFile, uint16Array[j][i]);
+ }
+ }
+}
+
+void writeHotspot(FILE *outFile, const hotspot_t hotspots[], int nbrElem) {
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ writeSint16BE(outFile, hotspots[j].screenIndex);
+ writeSint16BE(outFile, hotspots[j].x1);
+ writeSint16BE(outFile, hotspots[j].y1);
+ writeSint16BE(outFile, hotspots[j].x2);
+ writeSint16BE(outFile, hotspots[j].y2);
+ writeUint16BE(outFile, hotspots[j].actIndex);
+ writeSint16BE(outFile, hotspots[j].viewx);
+ writeSint16BE(outFile, hotspots[j].viewy);
+ writeSint16BE(outFile, hotspots[j].direction);
+ }
+}
+
+void writeUseArray(FILE *outFile, const uses_t uses[], int nbrElem) {
+ int nbrSubElem;
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ writeSint16BE(outFile, uses[j].objid);
+ writeUint16BE(outFile, uses[j].dataIndex);
+
+ nbrSubElem = sizeof(uses_1w[j].targets) / sizeof(target_t);
+ writeUint16BE(outFile, nbrSubElem);
+ for (int k = 0; k < nbrSubElem; k++) {
+ writeUint16BE(outFile, uses[j].targets[k].nounIndex);
+ writeUint16BE(outFile, uses[j].targets[k].verbIndex);
+ }
+ }
+}
+
+void writeBackgroundArray(FILE *outFile, const background_t background[], int nbrElem) {
+ writeUint16BE(outFile, nbrElem);
+
+ for (int j = 0; j < nbrElem; j++) {
+ writeUint16BE(outFile, background[j].verbIndex);
+ writeUint16BE(outFile, background[j].nounIndex);
+ writeSint16BE(outFile, background[j].commentIndex);
+ writeByte(outFile, (background[j].matchFl) ? 1 : 0);
+ writeByte(outFile, background[j].roomState);
+ writeByte(outFile, background[j].bonusIndex);
+ }
+}
+
+void writeCmdArray(FILE *outFile, const cmd *cmdList[], int nbrElem) {
+ int nbrSubElem;
+
+ writeUint16BE(outFile, nbrElem);
+ for (int i = 0; i < nbrElem; i++) {
+ nbrSubElem = 1;
+ for (int j = 0; cmdList[i][j].verbIndex != 0; j++)
+ nbrSubElem ++;
+ writeUint16BE(outFile, nbrSubElem);
+ for (int j = 0; j < nbrSubElem; j++) {
+ writeUint16BE(outFile, cmdList[i][j].verbIndex);
+ writeUint16BE(outFile, cmdList[i][j].reqIndex);
+ writeUint16BE(outFile, cmdList[i][j].textDataNoCarryIndex);
+ writeByte(outFile, cmdList[i][j].reqstate);
+ writeByte(outFile, cmdList[i][j].newstate);
+ writeUint16BE(outFile, cmdList[i][j].textDataWrongIndex);
+ writeUint16BE(outFile, cmdList[i][j].textDataDoneIndex);
+ writeUint16BE(outFile, cmdList[i][j].actIndex);
+ }
+ }
+}
+
+void writeScreenActs(FILE *outFile, const uint16 *screenActs[], int nbrElem) {
+ int nbrSubElem;
+
+ writeUint16BE(outFile, nbrElem);
+ for (int i = 0; i < nbrElem; i++) {
+ if (screenActs[i] == 0)
+ writeUint16BE(outFile, 0);
+ else {
+ nbrSubElem = 1;
+ for (int j = 0; screenActs[i][j] != 0; j++)
+ nbrSubElem ++;
+ writeUint16BE(outFile, nbrSubElem);
+ for (int j = 0; j < nbrSubElem; j++)
+ writeUint16BE(outFile, screenActs[i][j]);
+ }
+ }
+}
+
+void writeObjectArray(FILE *outFile, const object_t objects[], int nbrElem) {
+ int nbrSubElem;
+
+ writeUint16BE(outFile, nbrElem);
+ for (int i = 0; i < nbrElem; i++) {
+ writeUint16BE(outFile, objects[i].nounIndex);
+ writeUint16BE(outFile, objects[i].dataIndex);
+ if (objects[i].stateDataIndex == NULL)
+ writeUint16BE(outFile, 0);
+ else {
+ nbrSubElem = 1;
+ for (int j = 0; objects[i].stateDataIndex[j] != 0; j++)
+ nbrSubElem ++;
+ writeUint16BE(outFile, nbrSubElem);
+ for (int j = 0; j < nbrSubElem; j++)
+ writeUint16BE(outFile, objects[i].stateDataIndex[j]);
+ }
+ writeSint16BE(outFile, objects[i].pathType);
+ writeSint16BE(outFile, objects[i].vxPath);
+ writeSint16BE(outFile, objects[i].vyPath);
+ writeUint16BE(outFile, objects[i].actIndex);
+ writeByte(outFile, objects[i].seqNumb);
+// curr_seq_p is skipped: always equal to zero during initialization
+ for (int j = 0; j < objects[i].seqNumb; j++)
+ writeUint16BE(outFile, objects[i].seqList[j].imageNbr);
+// seq_list[].seq_p is always null during initialization, thus skipped
+ writeByte(outFile, objects[i].cycling);
+ writeByte(outFile, objects[i].cycleNumb);
+ writeByte(outFile, objects[i].frameInterval);
+ writeByte(outFile, objects[i].frameTimer);
+ writeByte(outFile, objects[i].radius);
+ writeByte(outFile, objects[i].screenIndex);
+ writeSint16BE(outFile, objects[i].x);
+ writeSint16BE(outFile, objects[i].y);
+ writeSint16BE(outFile, objects[i].oldx);
+ writeSint16BE(outFile, objects[i].oldy);
+ writeByte(outFile, objects[i].vx);
+ writeByte(outFile, objects[i].vy);
+ writeByte(outFile, objects[i].objValue);
+ writeSint16BE(outFile, objects[i].genericCmd);
+ writeUint16BE(outFile, objects[i].cmdIndex);
+ writeByte(outFile, (objects[i].carriedFl) ? 1 : 0);
+ writeByte(outFile, objects[i].state);
+ writeByte(outFile, (objects[i].verbOnlyFl) ? 1 : 0);
+ writeByte(outFile, objects[i].priority);
+ writeSint16BE(outFile, objects[i].viewx);
+ writeSint16BE(outFile, objects[i].viewy);
+ writeSint16BE(outFile, objects[i].direction);
+ writeByte(outFile, objects[i].curSeqNumb);
+ writeByte(outFile, objects[i].curImageNumb);
+ writeByte(outFile, objects[i].oldvx);
+ writeByte(outFile, objects[i].oldvy);
+ }
+}
+
+void writeActListArray(FILE *outFile, const actList actListArr[], int nbrElem) {
+ int nbrSubElem, nbrCpt;
+ byte subElemType;
+
+ writeUint16BE(outFile, nbrElem);
+ for (int i = 0; i < nbrElem; i++) {
+ for (nbrSubElem = 0; actListArr[i][nbrSubElem] != NULL; nbrSubElem++)
+ ;
+ writeUint16BE(outFile, nbrSubElem);
+ for (int j = 0; j < nbrSubElem; j++) {
+ subElemType = ((act *) actListArr[i][j])->a0.actType;
+ writeByte(outFile, subElemType);
+ switch (subElemType) {
+ case ANULL: // -1
+ break;
+ case ASCHEDULE: // 0
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a0.timer);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a0.actIndex);
+ break;
+ case START_OBJ: // 1
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a1.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a1.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a1.cycleNumb);
+ writeByte(outFile, ((act *) actListArr[i][j])->a1.cycle);
+ break;
+ case INIT_OBJXY: // 2
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a2.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a2.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a2.x);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a2.y);
+ break;
+ case PROMPT: // 3
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a3.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a3.promptIndex);
+ for (nbrCpt = 0; ((act *) actListArr[i][j])->a3.responsePtr[nbrCpt] != -1; nbrCpt++)
+ ;
+ nbrCpt++;
+ writeUint16BE(outFile, nbrCpt);
+ for (int k = 0; k < nbrCpt; k++)
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a3.responsePtr[k]);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a3.actPassIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a3.actFailIndex);
+ writeByte(outFile, (((act *) actListArr[i][j])->a3.encoded) ? 1 : 0);
+ break;
+ case BKGD_COLOR: // 4
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a4.timer);
+ writeUint32BE(outFile, ((act *) actListArr[i][j])->a4.newBkgColor);
+ break;
+ case INIT_OBJVXY: // 5
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a5.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a5.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a5.vx);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a5.vy);
+ break;
+ case INIT_CARRY: // 6
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a6.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a6.objNumb);
+ writeByte(outFile, (((act *) actListArr[i][j])->a6.carriedFl) ? 1 : 0);
+ break;
+ case INIT_HF_COORD: // 7
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a7.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a7.objNumb);
+ break;
+ case NEW_SCREEN: // 8
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a8.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a8.screenIndex);
+ break;
+ case INIT_OBJSTATE: // 9
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a9.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a9.objNumb);
+ writeByte(outFile, ((act *) actListArr[i][j])->a9.newState);
+ break;
+ case INIT_PATH: // 10
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a10.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a10.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a10.newPathType);
+ writeByte(outFile, ((act *) actListArr[i][j])->a10.vxPath);
+ writeByte(outFile, ((act *) actListArr[i][j])->a10.vyPath);
+ break;
+ case COND_R: // 11
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a11.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a11.objNumb);
+ writeByte(outFile, ((act *) actListArr[i][j])->a11.stateReq);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a11.actPassIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a11.actFailIndex);
+ break;
+ case TEXT: // 12
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a12.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a12.stringIndex);
+ break;
+ case SWAP_IMAGES: // 13
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a13.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a13.obj1);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a13.obj2);
+ break;
+ case COND_SCR: // 14
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a14.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a14.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a14.screenReq);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a14.actPassIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a14.actFailIndex);
+ break;
+ case AUTOPILOT: // 15
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a15.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a15.obj1);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a15.obj2);
+ writeByte(outFile, ((act *) actListArr[i][j])->a15.vx);
+ writeByte(outFile, ((act *) actListArr[i][j])->a15.vy);
+ break;
+ case INIT_OBJ_SEQ: // 16
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a16.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a16.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a16.seqIndex);
+ break;
+ case SET_STATE_BITS: // 17
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a17.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a17.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a17.stateMask);
+ break;
+ case CLEAR_STATE_BITS: // 18
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a18.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a18.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a18.stateMask);
+ break;
+ case TEST_STATE_BITS: // 19
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a19.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a19.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a19.stateMask);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a19.actPassIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a19.actFailIndex);
+ break;
+ case DEL_EVENTS: // 20
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a20.timer);
+ writeByte(outFile, ((act *) actListArr[i][j])->a20.actTypeDel);
+ break;
+ case GAMEOVER: // 21
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a21.timer);
+ break;
+ case INIT_HH_COORD: // 22
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a22.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a22.objNumb);
+ break;
+ case EXIT: // 23
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a23.timer);
+ break;
+ case BONUS: // 24
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a24.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a24.pointIndex);
+ break;
+ case COND_BOX: // 25
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a25.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a25.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a25.x1);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a25.y1);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a25.x2);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a25.y2);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a25.actPassIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a25.actFailIndex);
+ break;
+ case SOUND: // 26
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a26.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a26.soundIndex);
+ break;
+ case ADD_SCORE: // 27
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a27.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a27.objNumb);
+ break;
+ case SUB_SCORE: // 28
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a28.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a28.objNumb);
+ break;
+ case COND_CARRY: // 29
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a29.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a29.objNumb);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a29.actPassIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a29.actFailIndex);
+ break;
+ case INIT_MAZE: // 30
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a30.timer);
+ writeByte(outFile, ((act *) actListArr[i][j])->a30.mazeSize);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a30.x1);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a30.y1);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a30.x2);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a30.y2);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a30.x3);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a30.x4);
+ writeByte(outFile, ((act *) actListArr[i][j])->a30.firstScreenIndex);
+ break;
+ case EXIT_MAZE: // 31
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a31.timer);
+ break;
+ case INIT_PRIORITY: // 32
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a32.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a32.objNumb);
+ writeByte(outFile, ((act *) actListArr[i][j])->a32.priority);
+ break;
+ case INIT_SCREEN: // 33
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a33.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a33.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a33.screenIndex);
+ break;
+ case AGSCHEDULE: // 34
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a34.timer);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a34.actIndex);
+ break;
+ case REMAPPAL: // 35
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a35.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a35.oldColorIndex);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a35.newColorIndex);
+ break;
+ case COND_NOUN: // 36
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a36.timer);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a36.nounIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a36.actPassIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a36.actFailIndex);
+ break;
+ case SCREEN_STATE: // 37
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a37.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a37.screenIndex);
+ writeByte(outFile, ((act *) actListArr[i][j])->a37.newState);
+ break;
+ case INIT_LIPS: // 38
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a38.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a38.lipsObjNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a38.objNumb);
+ writeByte(outFile, ((act *) actListArr[i][j])->a38.dxLips);
+ writeByte(outFile, ((act *) actListArr[i][j])->a38.dyLips);
+ break;
+ case INIT_STORY_MODE: // 39
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a39.timer);
+ writeByte(outFile, (((act *) actListArr[i][j])->a39.storyModeFl) ? 1 : 0);
+ break;
+ case WARN: // 40
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a40.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a40.stringIndex);
+ break;
+ case COND_BONUS: // 41
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a41.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a41.BonusIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a41.actPassIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a41.actFailIndex);
+ break;
+ case TEXT_TAKE: // 42
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a42.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a42.objNumb);
+ break;
+ case YESNO: // 43
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a43.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a43.prompt);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a43.actYesIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a43.actNoIndex);
+ break;
+ case STOP_ROUTE: // 44
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a44.timer);
+ break;
+ case COND_ROUTE: // 45
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a45.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a45.routeIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a45.actPassIndex);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a45.actFailIndex);
+ break;
+ case INIT_JUMPEXIT: // 46
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a46.timer);
+ writeByte(outFile, (((act *) actListArr[i][j])->a46.jumpExitFl) ? 1 : 0);
+ break;
+ case INIT_VIEW: // 47
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a47.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a47.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a47.viewx);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a47.viewy);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a47.direction);
+ break;
+ case INIT_OBJ_FRAME: // 48
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a48.timer);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a48.objNumb);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a48.seqIndex);
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a48.frameIndex);
+ break;
+ case OLD_SONG: // 49, Added by Strangerke for DOS versions
+ writeSint16BE(outFile, ((act *) actListArr[i][j])->a49.timer);
+ writeUint16BE(outFile, ((act *) actListArr[i][j])->a49.songIndex);
+ break;
+ default:
+ printf("Unknown action %d", subElemType);
+ exit(-1);
+ }
+ }
+ }
+}
diff --git a/tools/create_hugo/create_hugo.h b/tools/create_hugo/create_hugo.h
new file mode 100644
index 0000000000..671b5c9142
--- /dev/null
+++ b/tools/create_hugo/create_hugo.h
@@ -0,0 +1,555 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef CREATE_HUGO_H
+#define CREATE_HUGO_H
+
+#define ARRAYSIZE(x) ((int)(sizeof(x) / sizeof(x[0])))
+
+#define DATAALIGNMENT 4
+
+#define HUGO_DAT_VER_MAJ 0 // 1 byte
+#define HUGO_DAT_VER_MIN 19 // 1 byte
+
+typedef unsigned char uint8;
+typedef unsigned char byte;
+typedef unsigned short uint16;
+typedef signed short int16;
+
+// Structure to define an EXIT or other collision-activated hotspot
+struct hotspot_t {
+ int screenIndex; // Screen in which hotspot appears
+ int x1, y1, x2, y2; // Bounding box of hotspot
+ uint16 actIndex; // Index of the action list to carry out if a 'hit'
+ int16 viewx, viewy, direction; // Used in auto-route mode
+};
+
+struct target_t { // Secondary target for action
+ uint16 nounIndex; // Index of the noun
+ uint16 verbIndex; // Index of the verb
+};
+
+#define MAX_TARGET 12 // Max # secondary "MakeUseOf" targets
+
+struct uses_t { // Define uses of certain objects
+ int16 objid; // Primary object
+ uint16 dataIndex; // Index of the string if no secondary object matches
+ target_t targets[MAX_TARGET]; // List of secondary targets
+};
+
+// Following is structure of verbs and nouns for 'background' objects
+// These are objects that appear in the various screens, but nothing
+// interesting ever happens with them. Rather than just be dumb and say
+// "don't understand" we produce an interesting msg to keep user sane.
+struct background_t {
+ uint16 verbIndex; // Index of the verb
+ uint16 nounIndex; // Index of the noun
+ int commentIndex; // Index of comment produced on match
+ bool matchFl; // TRUE if noun must match when present
+ byte roomState; // "State" of room. Comments might differ.
+ byte bonusIndex; // Index of bonus score (0 = no bonus)
+};
+
+typedef background_t *objectList_t;
+
+struct cmd {
+ uint16 verbIndex; // Index of the verb
+ uint16 reqIndex; // Index of the list of required objects
+ uint16 textDataNoCarryIndex; // Index of the string if any of above not carried
+ byte reqstate; // required state for verb to be done
+ byte newstate; // new states if verb done
+ uint16 textDataWrongIndex; // Index of the string if wrong state
+ uint16 textDataDoneIndex; // Index of the string if verb done
+ uint16 actIndex; // Index of the action list if verb done
+};
+
+struct seq_t { // Linked list of images
+ byte *imagePtr; // ptr to image
+ uint16 bytesPerLine8; // bytes per line (8 bits)
+ uint16 lines; // lines
+ uint16 x1, x2, y1, y2; // Offsets from x,y: data bounding box
+ seq_t *nextSeqPtr; // ptr to next record
+};
+
+struct seqList_t {
+ uint16 imageNbr; // Number of images in sequence
+ seq_t *seqPtr; // Ptr to sequence structure
+};
+
+#define MAX_SEQUENCES 4 // Number of sequences of images in object
+struct object_t {
+ uint16 nounIndex; // String identifying object
+ uint16 dataIndex; // String describing the object
+ uint16 *stateDataIndex; // Added by Strangerke to handle the LOOK_S state-dependant descriptions
+ path_t pathType; // Describe path object follows
+ int vxPath, vyPath; // Velocity (e.g. for CHASE)
+ uint16 actIndex; // Action list to do on collision with hero
+ byte seqNumb; // Number of sequences in list
+ seq_t *currImagePtr; // Sequence image currently in use
+ seqList_t seqList[MAX_SEQUENCES]; // Array of sequence structure ptrs and lengths
+ cycle_t cycling; // Whether cycling, forward or backward
+ byte cycleNumb; // No. of times to cycle
+ byte frameInterval; // Interval (in ticks) between frames
+ byte frameTimer; // Decrementing timer for above
+ char radius; // Defines sphere of influence by hero
+ byte screenIndex; // Screen in which object resides
+ int x, y; // Current coordinates of object
+ int oldx, oldy; // Previous coordinates of object
+ char vx, vy; // Velocity
+ byte objValue; // Value of object
+ int genericCmd; // Bit mask of 'generic' commands for object
+ uint16 cmdIndex; // ptr to list of cmd structures for verbs
+ bool carriedFl; // TRUE if object being carried
+ byte state; // state referenced in cmd list
+ bool verbOnlyFl; // TRUE if verb-only cmds allowed e.g. sit,look
+ byte priority; // Whether object fore, background or floating
+ int16 viewx, viewy; // Position to view object from (or 0 or -1)
+ int16 direction; // Direction to view object from
+ byte curSeqNumb; // Save which seq number currently in use
+ byte curImageNumb; // Save which image of sequence currently in use
+ char oldvx; // Previous vx (used in wandering)
+ char oldvy; // Previous vy
+};
+
+struct act0 { // Type 0 - Schedule
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 actIndex; // Index of an action list
+};
+
+struct act1 { // Type 1 - Start an object
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int cycleNumb; // Number of times to cycle
+ cycle_t cycle; // Direction to start cycling
+};
+
+struct act2 { // Type 2 - Initialise an object coords
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int x, y; // Coordinates
+};
+
+struct act3 { // Type 3 - Prompt user for text
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 promptIndex; // index of prompt string
+ int *responsePtr; // Array of indexes to valid response
+ // string(s) (terminate list with -1)
+ uint16 actPassIndex; // Index of the action list if success
+ uint16 actFailIndex; // Index of the action list if failure
+ bool encoded; // (HUGO 1 DOS ONLY) Whether response is encoded or not
+};
+
+struct act4 { // Type 4 - Set new background color
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ long newBkgColor; // New color
+};
+
+struct act5 { // Type 5 - Initialise an object velocity
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int vx, vy; // velocity
+};
+
+struct act6 { // Type 6 - Initialise an object carrying
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ bool carriedFl; // carrying
+};
+
+struct act7 { // Type 7 - Initialise an object to hero's coords
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+};
+
+struct act8 { // Type 8 - switch to new screen
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int screenIndex; // The new screen number
+};
+
+struct act9 { // Type 9 - Initialise an object state
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ byte newState; // New state
+};
+
+struct act10 { // Type 10 - Initialise an object path type
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int newPathType; // New path type
+ char vxPath, vyPath; // Max delta velocities e.g. for CHASE
+};
+
+struct act11 { // Type 11 - Conditional on object's state
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ byte stateReq; // Required state
+ uint16 actPassIndex; // Index of the action list if success
+ uint16 actFailIndex; // Index of the action list if failure
+};
+
+struct act12 { // Type 12 - Simple text box
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int stringIndex; // Index (enum) of string in strings.dat
+};
+
+struct act13 { // Type 13 - Swap first object image with second
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int obj1; // Index of first object
+ int obj2; // 2nd
+};
+
+struct act14 { // Type 14 - Conditional on current screen
+ byte atype; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The required object
+ int screenReq; // The required screen number
+ uint16 actPassIndex; // Index of the action list if success
+ uint16 actFailIndex; // Index of the action list if failure
+};
+
+struct act15 { // Type 15 - Home in on an object
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int obj1; // The object number homing in
+ int obj2; // The object number to home in on
+ char vx, vy; // Max delta velocities
+};
+// Note: Don't set a sequence at time 0 of a new screen, it causes
+// problems clearing the boundary bits of the object! t>0 is safe
+struct act16 { // Type 16 - Set curr_seq_p to seq
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int seqIndex; // The index of seq array to set to
+};
+
+struct act17 { // Type 17 - SET obj individual state bits
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int stateMask; // The mask to OR with current obj state
+};
+
+struct act18 { // Type 18 - CLEAR obj individual state bits
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int stateMask; // The mask to ~AND with current obj state
+};
+
+struct act19 { // Type 19 - TEST obj individual state bits
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int stateMask; // The mask to AND with current obj state
+ uint16 actPassIndex; // Index of the action list (all bits set)
+ uint16 actFailIndex; // Index of the action list (not all set)
+};
+
+struct act20 { // Type 20 - Remove all events with this type of action
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ byte actTypeDel; // The action type to remove
+};
+
+struct act21 { // Type 21 - Gameover. Disable hero & commands
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+};
+
+struct act22 { // Type 22 - Initialise an object to hero's coords
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+};
+
+struct act23 { // Type 23 - Exit game back to DOS
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+};
+
+struct act24 { // Type 24 - Get bonus score
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int pointIndex; // Index into points array
+};
+
+struct act25 { // Type 25 - Conditional on bounding box
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The required object number
+ int x1, y1, x2, y2; // The bounding box
+ uint16 actPassIndex; // Index of the action list if success
+ uint16 actFailIndex; // Index of the action list if failure
+};
+
+struct act26 { // Type 26 - Play a sound
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int16 soundIndex; // Sound index in data file
+};
+
+struct act27 { // Type 27 - Add object's value to score
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // object number
+};
+
+struct act28 { // Type 28 - Subtract object's value from score
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // object number
+};
+
+struct act29 { // Type 29 - Conditional on object carried
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The required object number
+ uint16 actPassIndex; // Index of the action list if success
+ uint16 actFailIndex; // Index of the action list if failure
+};
+
+struct act30 { // Type 30 - Start special maze processing
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ byte mazeSize; // Size of (square) maze
+ int x1, y1, x2, y2; // Bounding box of maze
+ int x3, x4; // Extra x points for perspective correction
+ byte firstScreenIndex; // First (top left) screen of maze
+};
+
+struct act31 { // Type 31 - Exit special maze processing
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+};
+
+struct act32 { // Type 32 - Init fbg field of object
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ byte priority; // Value of foreground/background field
+};
+
+struct act33 { // Type 33 - Init screen field of object
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int screenIndex; // Screen number
+};
+
+struct act34 { // Type 34 - Global Schedule
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 actIndex; // Index of an action list
+};
+
+struct act35 { // Type 35 - Remappe palette
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int16 oldColorIndex; // Old color index, 0..15
+ int16 newColorIndex; // New color index, 0..15
+};
+
+struct act36 { // Type 36 - Conditional on noun mentioned
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 nounIndex; // The required noun (list)
+ uint16 actPassIndex; // Index of the action list if success
+ uint16 actFailIndex; // Index of the action list if failure
+};
+
+struct act37 { // Type 37 - Set new screen state
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int screenIndex; // The screen number
+ byte newState; // The new state
+};
+
+struct act38 { // Type 38 - Position lips
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int lipsObjNumb; // The LIPS object
+ int objNumb; // The object to speak
+ byte dxLips; // Relative offset of x
+ byte dyLips; // Relative offset of y
+};
+
+struct act39 { // Type 39 - Init story mode
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ bool storyModeFl; // New state of story_mode flag
+};
+
+struct act40 { // Type 40 - Unsolicited text box
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int stringIndex; // Index (enum) of string in strings.dat
+};
+
+struct act41 { // Type 41 - Conditional on bonus scored
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int BonusIndex; // Index into bonus list
+ uint16 actPassIndex; // Index of the action list if scored for the first time
+ uint16 actFailIndex; // Index of the action list if already scored
+};
+
+struct act42 { // Type 42 - Text box with "take" string
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object taken
+};
+
+struct act43 { // Type 43 - Prompt user for Yes or No
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int prompt; // Index of prompt string
+ uint16 actYesIndex; // Index of the action list if YES
+ uint16 actNoIndex; // Index of the action list if NO
+};
+
+struct act44 { // Type 44 - Stop any route in progress
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+};
+
+struct act45 { // Type 45 - Conditional on route in progress
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int routeIndex; // Must be >= current status.rindex
+ uint16 actPassIndex; // Index of the action list if en-route
+ uint16 actFailIndex; // Index of the action list if not
+};
+
+struct act46 { // Type 46 - Init status.jumpexit
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ bool jumpExitFl; // New state of jumpexit flag
+};
+
+struct act47 { // Type 47 - Init viewx,viewy,dir
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object
+ int16 viewx; // object.viewx
+ int16 viewy; // object.viewy
+ int16 direction; // object.dir
+};
+
+struct act48 { // Type 48 - Set curr_seq_p to frame n
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ int objNumb; // The object number
+ int seqIndex; // The index of seq array to set to
+ int frameIndex; // The index of frame to set to
+};
+
+struct act49 { // Added by Strangerke - Type 79 - Play a sound (DOS way)
+ byte actType; // The type of action
+ int timer; // Time to set off the action
+ uint16 songIndex; // Song index in string array
+};
+
+union act {
+ act0 a0;
+ act1 a1;
+ act2 a2;
+ act3 a3;
+ act4 a4;
+ act5 a5;
+ act6 a6;
+ act7 a7;
+ act8 a8;
+ act9 a9;
+ act10 a10;
+ act11 a11;
+ act12 a12;
+ act13 a13;
+ act14 a14;
+ act15 a15;
+ act16 a16;
+ act17 a17;
+ act18 a18;
+ act19 a19;
+ act20 a20;
+ act21 a21;
+ act22 a22;
+ act23 a23;
+ act24 a24;
+ act25 a25;
+ act26 a26;
+ act27 a27;
+ act28 a28;
+ act29 a29;
+ act30 a30;
+ act31 a31;
+ act32 a32;
+ act33 a33;
+ act34 a34;
+ act35 a35;
+ act36 a36;
+ act37 a37;
+ act38 a38;
+ act39 a39;
+ act40 a40;
+ act41 a41;
+ act42 a42;
+ act43 a43;
+ act44 a44;
+ act45 a45;
+ act46 a46;
+ act47 a47;
+ act48 a48;
+ act49 a49;
+};
+
+typedef void *actListPtr; // Ptr to a list of actions
+typedef actListPtr *actList; // A list of actions
+
+void writeTextArray(FILE *outFile, const char *textData[], int nbrText);
+void writeUint16Array(FILE *outFile, const uint16 *uint16Array[], int nbrElem);
+void writeHotspot(FILE *outFile, const hotspot_t hotspots[], int nbrElem);
+void writeUseArray(FILE *outFile, const uses_t uses[], int nbrElem);
+void writeBackgroundArray(FILE *outFile, const background_t background[], int nbrElem);
+void writeCmdArray(FILE *outFile, const cmd *cmdList[], int nbrElem);
+void writeScreenActs(FILE *outFile, const uint16 *screenActs[], int nbrElem);
+void writeObjectArray(FILE *outFile, const object_t objects[], int nbrElem);
+void writeActListArray(FILE *outFile, const actList actListArr[], int nbrElem);
+
+#endif // CREATE_HUGO_H
diff --git a/tools/create_hugo/dists/msvc9/create_hugo.sln b/tools/create_hugo/dists/msvc9/create_hugo.sln
new file mode 100644
index 0000000000..2d86ae4f19
--- /dev/null
+++ b/tools/create_hugo/dists/msvc9/create_hugo.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_hugo", "create_hugo.vcproj", "{5F280130-349D-11DD-AE16-0800200C9A66}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5F280130-349D-11DD-AE16-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5F280130-349D-11DD-AE16-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32
+ {5F280130-349D-11DD-AE16-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
+ {5F280130-349D-11DD-AE16-0800200C9A66}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/tools/create_hugo/dists/msvc9/create_hugo.vcproj b/tools/create_hugo/dists/msvc9/create_hugo.vcproj
new file mode 100644
index 0000000000..f84c3d49d1
--- /dev/null
+++ b/tools/create_hugo/dists/msvc9/create_hugo.vcproj
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="create_hugo"
+ ProjectGUID="{5F280130-349D-11DD-AE16-0800200C9A66}"
+ RootNamespace="create_hugo"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/wd4996"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\.."
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/create_hugo.exe"
+ LinkIncremental="2"
+ IgnoreDefaultLibraryNames="libc.lib;libcmt.lib"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/create_hugo.pdb"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/wd4996"
+ Optimization="3"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/create_hugo.exe"
+ LinkIncremental="1"
+ IgnoreDefaultLibraryNames="libc.lib;libcmt.lib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <File
+ RelativePath="..\..\create_hugo.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\create_hugo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\enums.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\staticdata.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\staticdisplay.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\staticengine.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\staticintro.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\staticmouse.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\staticparser.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\staticschedule.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\staticutil.h"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/tools/create_hugo/enums.h b/tools/create_hugo/enums.h
new file mode 100644
index 0000000000..eb03896fbd
--- /dev/null
+++ b/tools/create_hugo/enums.h
@@ -0,0 +1,1565 @@
+#ifndef ENUMS_H
+#define ENUMS_H
+
+enum seqTextData_1w {
+//***************************************************************************
+// Hugo 1 Windows
+//***************************************************************************
+ kDTnull = 0,
+ kDTnocgen_1w = 1, kDTnockey_1w, kDTnoccandle_1w, kDTrnooil_1w, kDTrnoknife_1w,
+ kDTsgen_1w, kDTslock_1w, kDTsunlocked_1w, kDTsunlock_1w, kDTsopenpkin_1w,
+ kDTslocked_1w, kDTsopen_1w, kDTsclosed_1w, kDTsbroken_1w, kDTsnoseeoil_1w,
+ kDTsworn1_1w, kDTsworn2_1w, kDTsworn3_1w, kDTsoiled_1w, kDTsstuck_1w,
+ kDTsnocut_1w, kDTsrock_1w, kDTokgen_1w, kDTokblow_1w, kDTsseeoil_1w,
+ kDTsruboil_1w, kDTsrollrug_1w, kDTsoilbolt_1w, kDTsopenbolt_1w, kDTsclosebolt_1w,
+ kDTscut_1w, kDTsuntie_1w, kDTsrbreak_1w, kDTsplug_1w, kDTsomattack_1w,
+ kDTsNobody_1w, kDTsUnlocked_1w, kDTthero_1w, kDTtdoor_1w, kDTtward_1w,
+ kDTteyes_1w, kDTtbat_1w, kDTtpkin_1w, kDTtkey_1w, kDTtcandle_1w,
+ kDTtknife_1w, kDTtwhistle_1w, kDTtmask_1w, kDTtbutler_1w, kDTtchop_1w,
+ kDTtfrank_1w, kDTtdrac_1w, kDTtlady_1w, kDTthood_1w, kDTtslime_1w,
+ kDTtpeahd_1w, kDTtoilcan_1w, kDTttrap_1w, kDTtbolt_1w, kDTtdog_1w,
+ kDTtboat_1w, kDTtrope_1w, kDTtgold_1w, kDTtoldman_1w, kDTtguard_1w,
+ kDTtprof_1w, kDTtigor_1w, kDTtbung_1w, kDTupkin_1w, kDTukey_1w,
+ kDTucandle_1w, kDTumasked_1w, kDTubung_1w, kDTuchop_1w, kDTuknife_1w,
+ kDTuoil_1w, kDTugold_1w
+};
+
+enum seqTextData_2w {
+//***************************************************************************
+// Hugo 2 Windows
+//***************************************************************************
+ kDTdull_2w = 1, kDTnopurps_2w, kDTempty_2w, kDTnocgen_2w, kDTnomatch_2w,
+ kDTnogun_2w, kDTsgen_2w, kDTsclose_2w, kDTsbroken_2w, kDTsopen1_2w,
+ kDTsnoserum_2w, kDTsharry_2w, kDTsnoread_2w, kDTsempty_2w, kDTokgen_2w,
+ kDTsthrown_2w, kDTscatnip_2w, kDTseatnip_2w, kDTspaper_2w, kDTsnopaper_2w,
+ kDTspencil_2w, kDTsgetlet_2w, kDTsread_2w, kDTwontopen_2w, kDTspdoor_2w,
+ kDTsopendum_2w, kDTsunlockdum_2w, kDTsDarkHole_2w, kDTsFindMatch_2w, kDTsFindClove_2w,
+ kDTsWhichColor_2w, kDTsNobody_2w, kDTsUnlocked_2w, kDTthero_2w, kDTtpenny_2w,
+ kDTtdoor_2w, kDTtdoordum_2w, kDTtmaid_2w, kDTthallgo_2w, kDTtdog_2w,
+ kDTtoldman_2w, kDTtbookcase_2w, kDTtbook_2w, kDTtbed_2w, kDTtbird_2w,
+ kDTtmatch1_2w, kDTtmatch2_2w, kDTtballoon_2w, kDTtdumb_2w, kDTtrope_2w,
+ kDTtgarlic_2w, kDTtbutton_2w, kDTtslight_2w, kDTtglight_2w, kDTtcatnip_2w,
+ kDTtbridge_2w, kDTtbug_2w, kDTtsnake_2w, kDTttardis_2w, kDTtgun0_2w,
+ kDTtgun1_2w, kDTtdynamite_2w, kDTtwell_2w, kDTtlamp_2w, kDTtbanana_2w,
+ kDTtgenie_2w, kDTtharry_2w, kDTthester_2w, kDTtletter_2w, kDTtdoctor_2w,
+ kDTtcook_2w, kDTtcop_2w, kDTthorace_2w, kDTtrobot0_2w, kDTtrobot1_2w,
+ kDTtbell_2w, kDTtbdoor_2w, kDTtpencil_2w, kDTtmagnify_2w, kDTtsafe_2w,
+ kDTtscrew_2w, kDTtwill_2w, kDTtalbum_2w, kDTtcat_2w, kDTtbottle_2w,
+ kDTtzapper_2w, kDTumatches_2w, kDTugarlic_2w, kDTustick_2w, kDTubottle_2w,
+ kDTudynamite_2w, kDTugun_2w, kDTubanana_2w, kDTulamp_2w, kDTuscrew_2w,
+ kDTubell_2w, kDTucatnip_2w, kDTupaper_2w, kDTupencil_2w, kDTumagnify_2w
+};
+
+enum seqTextData_3w {
+//***************************************************************************
+// Hugo 3 Windows
+//***************************************************************************
+// Use following standard strings where applicable
+ kDTdull_3w = 1, kDTsdull_3w, kDTnocgen_3w, kDTnogun_3w, kDTnopins_3w,
+ kDTnocex_3w, kDTsgen_3w, kDTsclose_3w, kDTsbroken_3w, kDTsopen1_3w,
+ kDTsnosee_3w, kDTsmade_3w, kDTsfull_3w, kDTsfoundb_3w, kDTsfoundc_3w,
+ kDTslit_3w, kDTsunlit_3w, kDTsnoswing_3w, kDTokgen_3w, kDTsread_3w,
+ kDTsfindc_3w, kDTokbell_3w, kDTswingcave_3w, kDTswinger_3w, kDTswater_3w,
+ kDTsstream_3w, kDTspool_3w, kDTsblowdoc_3w, kDTuclay_3w, kDTuflask_3w,
+ kDTubouillon_3w, kDTucage_3w, kDTucrystal_3w, kDTucheese_3w, kDTughost_3w,
+ kDTuelephant_3w, kDTuread_3w, kDTucandle_3w, kDTubell_3w, kDTupipe_3w,
+ kDTsNobody_3w, kDTsUnlocked_3w, kDTthero_3w, kDTtpenny_3w, kDTtplie_3w,
+ kDTtplane_3w, kDTtwwater_3w, kDTtswater_3w, kDTtmwater_3w, kDTtvine_3w,
+ kDTtrush_3w, kDTtsteps_3w, kDTtdoctor_3w, kDTtclay_3w, kDTtneedles_3w,
+ kDTtflask1_3w, kDTtflask2_3w, kDTtflask3_3w, kDTtnative_3w, kDTtnatgirl_3w,
+ kDTtmouse_3w, kDTtcage1_3w, kDTtcage2_3w, kDTtpipe_3w, kDTtelephant_3w,
+ kDTtbouillon_3w, kDTtcheese_3w, kDTtspider_3w, kDTtscroll_3w, kDTtrock_3w,
+ kDTtcrystal_3w, kDTtghost_3w, kDTtbell_3w, kDTtbook_3w, kDTtcandle_3w
+};
+
+enum seqTextData_1d {
+//***************************************************************************
+// Hugo 1 Dos
+//***************************************************************************
+ kDTnocgen_1d = 1, kDTnockey_1d, kDTnoccandle_1d, kDTrnooil_1d, kDTrnoknife_1d,
+ kDTsgen_1d, kDTslock_1d, kDTsunlock_1d, kDTsopen_1d, kDTsclose_1d,
+ kDTsbroken_1d, kDTsopen2_1d, kDTsnosee_1d, kDTsworn1_1d, kDTsworn2_1d,
+ kDTsworn3_1d, kDTsoiled_1d, kDTsstuck_1d, kDTsnocut_1d, kDTokgen_1d,
+ kDTsseeoil_1d, kDTsruboil_1d, kDTscut_1d, kDTsuntie_1d, kDTsrbreak_1d,
+ kDTsomattack_1d, kDTthero_1d, kDTtdoor_1d, kDTtward_1d, kDTteyes_1d,
+ kDTtbat_1d, kDTtpkin_1d, kDTtkey_1d, kDTtcandle_1d, kDTtknife_1d,
+ kDTtwhistle_1d, kDTtmask_1d, kDTtbutler_1d, kDTtchop_1d, kDTtoilcan_1d,
+ kDTtdog_1d, kDTtboat_1d, kDTtrope_1d, kDTtgold_1d, kDTtoldman_1d,
+ kDTtguard_1d, kDTtprof_1d, kDTtigor_1d, kDTtbung_1d, kDTsknock_1d,
+ kDTsong0_1d, kDTsong1_1d, kDTsong2_1d, kDTsong3_1d
+};
+
+enum seqTextData_2d {
+//***************************************************************************
+// Hugo 2 Dos
+//***************************************************************************
+ kDTdull_2d = 1, kDTnopurps_2d, kDTempty_2d, kDTnocgen_2d, kDTnomatch_2d,
+ kDTnogun_2d, kDTsgen_2d, kDTsclose_2d, kDTsbroken_2d, kDTsopen1_2d,
+ kDTsnosee_2d, kDTsharry_2d, kDTsnoread_2d, kDTsdialed_2d, kDTsempty_2d,
+ kDTokgen_2d, kDTsthrown_2d, kDTscatnip_2d, kDTsgetlet_2d, kDTsread_2d,
+ kDTwontopen_2d, kDTspdoor_2d, kDTdarkhole_2d, kDTfindmatch_2d, kDTfindclove_2d,
+ kDTthero_2d, kDTtpenny_2d, kDTtdoor_2d, kDTtmaid_2d, kDTtdog_2d,
+ kDTtoldman_2d, kDTtbookcase_2d, kDTtbook_2d, kDTtbird_2d, kDTtballoon_2d,
+ kDTtdumb_2d, kDTtrope_2d, kDTtgarlic_2d, kDTtgardner_2d, kDTtbutton_2d,
+ kDTtbug_2d, kDTtsnake_2d, kDTtdynamite_2d, kDTtwell_2d, kDTtlamp_2d,
+ kDTtbanana_2d, kDTtgenie_2d, kDTtharry_2d, kDTthester_2d, kDTtletter_2d,
+ kDTtdoctor_2d, kDTtcook_2d, kDTtcop_2d, kDTthorace_2d, kDTtdalek_2d,
+ kDTtbell_2d, kDTtgun_2d, kDTtbdoor_2d, kDTtmagnify_2d, kDTtsafe_2d,
+ kDTtscrew_2d, kDTtwill_2d, kDTtalbum_2d, kDTtbottle_2d, kDTtzapper_2d,
+ kDTtnoknock_2d, kDTtnounlock_2d, kDTtnopushbutton_2d, kDTsong0_2d, kDTsong1_2d,
+ kDTsong2_2d, kDTsong2a_2d, kDTsong3_2d, kDTsong4_2d, kDTsong5_2d,
+ kDTsong6_2d, kDTsong7_2d, kDTsong8_2d
+};
+
+enum seqTextData_3d {
+//***************************************************************************
+// Hugo 3 Dos
+//***************************************************************************
+ kDTdull_3d = 1, kDTnopurps_3d, kDTempty_3d, kDTsdull_3d, kDTnocgen_3d,
+ kDTnogun_3d, kDTnopins_3d, kDTnocex_3d, kDTsgen_3d, kDTsclose_3d,
+ kDTsbroken_3d, kDTsopen1_3d, kDTsnosee_3d, kDTsmade_3d, kDTsfull_3d,
+ kDTsfoundc_3d, kDTslit_3d, kDTsunlit_3d, kDTokgen_3d, kDTsthrown_3d,
+ kDTwontopen_3d, kDTsread_3d, kDTsfindc_3d, kDTokbell_3d, kDTswingcave_3d,
+ kDTsNobody_3d, kDTsUnlocked_3d, kDTthero_3d, kDTtpenny_3d, kDTtplane_3d,
+ kDTtvine_3d, kDTtdoctor_3d, kDTtclay_3d, kDTtneedles_3d, kDTtnative_3d,
+ kDTtnatgirl_3d, kDTtflask_3d, kDTtmouse_3d, kDTtcage_3d, kDTtpipe_3d,
+ kDTtelephant_3d, kDTtbouillon_3d, kDTtcheese_3d, kDTtspider_3d, kDTtscroll_3d,
+ kDTtcrystal_3d, kDTtghost_3d, kDTtbell_3d, kDTtbook_3d, kDTtcandle_3d,
+ kDTsong0_3d, kDTsong1_3d, kDTsong2_3d, kDTsong3_3d, kDTsong3a_3d,
+ kDTsong4_3d, kDTsong5_3d, kDTsong6_3d, kDTsong7_3d, kDTsong8_3d,
+ kDTsong9_3d, kDTsong10_3d, kDTsong11_3d, kDTsong12_3d
+};
+
+enum seqNouns_1w {
+//***************************************************************************
+// Hugo 1 Windows
+//***************************************************************************
+ kNDummy = 0,
+ kNHero_1w, kNTrap_1w, kNWard_1w, kNDoor_1w, kNBat_1w,
+ kNEyes_1w, kNBatpic_1w, kNPkin_1w, kNCandle_1w, kNRope_1w,
+ kNCupb_1w, kNKnife_1w, kNWhistle_1w, kNWdoorl_1w, kNWdoorr_1w,
+ kNMask_1w, kNButler_1w, kNChop_1w, kNRedeyes_1w, kNLips_1w,
+ kNArm_1w, kNHdlshero_1w, kNMonkey_1w, kNKey_1w, kNShed_1w,
+ kNDog_1w, kNCarpet_1w, kNBolt_1w, kNHerodead_1w, kNOilcan_1w,
+ kNMummy_1w, kNMdoor, kNGold_1w, kNBoat_1w, kNOldman_1w,
+ kNWhero_1w, kNGuard_1w, kNProf_1w, kNIgor_1w, kNBung_1w,
+ kNGdoor_1w, kNSpachero_1w, kNFuzyhero_1w, kNSpark_1w, kNFrank_1w,
+ kNDracula_1w, kNGwen_1w, kNHood_1w, kNSlime_1w, kNPeahead_1w,
+ // Background objects:
+ kNSky_1w, kNWall_1w, kNGround_1w, kNTree_1w, kNFence_1w,
+ kNHouse_1w, kNRoof_1w, kNLight_1w, kNMoon_1w, kNPicture_1w,
+ kNTable_1w, kNStairs_1w, kNBed_1w, kNFace_1w, kNPlant_1w,
+ kNWitch_1w, kNFood_1w, kNWoman_1w, kNMan_1w, kNMirror_1w,
+ kNToilet_1w, kNBath_1w, kNSink_1w, kNUnits_1w, kNBroom_1w,
+ kNGardenbits_1w, kNMousehole_1w, kNPenelope_1w, kNRock_1w, kNTomb_1w,
+ kNBooth_1w, kNDroppings_1w, kNMachinebits_1w, kNMachine_1w, kNHands_1w,
+ kNWindow_1w, kNCut_1w, kNOil_1w
+};
+
+enum seqNouns_2w {
+//***************************************************************************
+// Hugo 2 Windows
+//***************************************************************************
+ kNHero_2w = 1, kNPenny_2w, kNPennylie_2w, kNPenfall_2w, kNSmoke_2w,
+ kNLips_2w, kNMaid_2w, kNHallgo_2w, kNBookcase_2w, kNBook_2w,
+ kNKeyhole_2w, kNPanel_2w, kNMatches_2w, kNCrate_2w, kNDumb_2w,
+ kNMurder_2w, kNGardner_2w, kNTrap_2w, kNWard_2w, kNDoor_2w,
+ kNGate_2w, kNRope_2w, kNRed_2w, kNYellow_2w, kNGreen_2w,
+ kNBlue_2w, kNFly_2w, kNLeaf_2w, kNCupb_2w, kNGarlic_2w,
+ kNButton_2w, kNShedlight_2w, kNGatelight_2w, kNZapper_2w, kNBug_2w,
+ kNKnife_2w, kNShed_2w, kNOldman_2w, kNSnake_2w, kNStick_2w,
+ kNDynamite_2w, kNKennel_2w, kNDog_2w, kNWell_2w, kNBanana_2w,
+ kNLamp_2w, kNGenie_2w, kNTardis_2w, kNHarry_2w, kNHester_2w,
+ kNLetter_2w, kNDoctor_2w, kNRobot_2w, kNCook_2w, kNCookb_2w,
+ kNCop_2w, kNHorace_2w, kNBell_2w, kNCatnip_2w, kNCat_2w,
+ kNGun_2w, kNPaper_2w, kNPencil_2w, kNKey_2w, kNMagnify_2w,
+ kNSafe_2w, kNScrew_2w, kNWill_2w, kNAlbum_2w, kNBottle_2w,
+ kNBalloon_2w,
+ // Background objects:
+ kNSky_2w, kNWall_2w, kNGround_2w, kNTree_2w,
+ kNFence_2w, kNHouse_2w, kNRoof_2w, kNLight_2w, kNMoon_2w,
+ kNPicture_2w, kNTable_2w, kNStairs_2w, kNBed_2w, kNPlant_2w,
+ kNFood_2w, kNWoman_2w, kNMan_2w, kNMirror_2w, kNSink_2w,
+ kNUnits_2w, kNBroom_2w, kNGardenbits_2w, kNRock_2w, kNDroppings_2w,
+ kNWindow_2w, kNBird_2w, kNCage_2w, kNPhone_2w, kNBlotpad_2w,
+ kNDrawer_2w, kNChair_2w, kNTools_2w, kNBridge_2w, kNWater_2w,
+ kNBucket_2w, kNMouse_2w, kNWand_2w, kNHole_2w, kNMousehole_2w,
+ kNHandle_2w, kNChute_2w, kNOrgan_2w, kNPost_2w, kNGraf_2w,
+ // Added by Strangerke to ease things
+ kNSwitch_2w, kNBlock_2w
+};
+
+enum seqNouns_3w {
+//***************************************************************************
+// Hugo 3 Windows
+//***************************************************************************
+ kNHero_3w = 1, kNWhero_3w, kNHero_old_3w, kNPenny_3w, kNPennylie_3w,
+ kNLips_3w, kNPlane_3w, kNDoor_3w, kNBlock_3w, kNCdoor_3w,
+ kNVine_3w, kNSwinger_3w, kNSteps_3w, kNDoctor_3w, kNClay_3w,
+ kNDoorlock_3w, kNNeedles_3w, kNNative_3w, kNNat1_3w, kNNat2_3w,
+ kNNat3_3w, kNNatb_3w, kNNatg_3w, kNBottles_3w, kNFlask_3w,
+ kNPipe_3w, kNElephant_3w, kNE_eyes_3w, kNBouillon_3w, kNMoushole_3w,
+ kNDoclie_3w, kNCheese_3w, kNCage_3w, kNSpider_3w, kNSnake_3w,
+ kNFire_3w, kNDocbits_3w, kNFire_1_3w, kNFire_2_3w, kNFire_3_3w,
+ kNScroll_3w, kNCrystal_3w, kNGhost_3w, kNBell_3w, kNBook_3w,
+ kNCandle_3w, kNRush_3w,
+ // Background objects:
+ kNSky_3w, kNWall_3w, kNGround_3w,
+ kNFence_3w, kNBridge_3w, kNWater_3w, kNPool_3w, kNWaterfall_3w,
+ kNMouse_3w, kNWindow_3w, kNShelfbits_3w, kNOrchid_3w, kNPole_3w,
+ kNHut_3w, kNRock_3w, kNAircraft_3w, kNPlant1_3w, kNPlant2_3w,
+ kNPlant3_3w, kNPlant4_3w, kNPlant5_3w, kNJungle_3w, kNWeb_3w,
+ kNO_eye_3w, kNFire_4_3w, kNMouth_3w, kNFood_3w, kNThem_3w
+};
+
+enum seqNouns_1d {
+//***************************************************************************
+// Hugo 1 Dos
+//***************************************************************************
+ kNHero_1d = 1, kNTrap_1d, kNWard_1d, kNDoor_1d, kNBat_1d,
+ kNEyes_1d, kNPkin_1d, kNCandle_1d, kNRope_1d, kNCupb_1d,
+ kNKnife_1d, kNWhistle_1d, kNWdoorl_1d, kNWdoorr_1d, kNMask_1d,
+ kNButler_1d, kNChop_1d, kNRedeyes_1d, kNLips_1d, kNArm_1d,
+ kNHdlshero_1d, kNMonkey_1d, kNKey_1d, kNShed_1d, kNDog_1d,
+ kNCarpet_1d, kNBolt_1d, kNHerodead_1d, kNOilcan_1d, kNMummy_1d,
+ kNMdoor_1d, kNGold_1d, kNBoat_1d, kNWhero_1d, kNOldman_1d,
+ kNGuard_1d, kNProf_1d, kNIgor_1d, kNBung_1d, kNGdoor_1d,
+ kNSpachero_1d, kNFuzyhero_1d, kNArc_1d,
+ // Background objects:
+ kNSky_1d, kNWall_1d,
+ kNGround_1d, kNTree_1d, kNFence_1d, kNHouse_1d, kNRoof_1d,
+ kNLight_1d, kNMoon_1d, kNPicture_1d, kNTable_1d, kNStairs_1d,
+ kNBed_1d, kNFace_1d, kNPlant_1d, kNWitch_1d, kNFood_1d,
+ kNWoman_1d, kNMan_1d, kNMirror_1d, kNToilet_1d, kNBath_1d,
+ kNSink_1d, kNUnits_1d, kNBroom_1d, kNGardenbits_1d, kNMousehole_1d,
+ kNPenelope_1d, kNRock_1d, kNTomb_1d, kNDroppings_1d, kNMachinebits_1d,
+ kNHands_1d, kNWindow_1d
+};
+
+enum seqNouns_2d {
+//***************************************************************************
+// Hugo 2 Dos
+//***************************************************************************
+ kNHero_2d = 1, kNPenny_2d, kNPennylie_2d, kNPenfall_2d, kNSmoke_2d,
+ kNLips_2d, kNMaid_2d, kNBookcase_2d, kNBook_2d, kNKeyhole_2d,
+ kNPanel_2d, kNMatches_2d, kNCrate_2d, kNDumb_2d, kNMurder_2d,
+ kNTrap_2d, kNWard_2d, kNDoor_2d, kNRope_2d, kNCupb_2d,
+ kNGarlic_2d, kNGardner_2d, kNButton_2d, kNRed_2d, kNYellow_2d,
+ kNGreen_2d, kNBlue_2d, kNFly_2d, kNLeaf_2d, kNShedlight_2d,
+ kNGatelight_2d, kNZapper_2d, kNBug_2d, kNKnife_2d, kNShed_2d,
+ kNOldman_2d, kNSnake_2d, kNStick_2d, kNDynamite_2d, kNKennel_2d,
+ kNDog_2d, kNWell_2d, kNBanana_2d, kNLamp_2d, kNGenie_2d,
+ kNTardis_2d, kNHarry_2d, kNHester_2d, kNLetter_2d, kNDoctor_2d,
+ kNDalek_2d, kNCook_2d, kNCookb_2d, kNCop_2d, kNHorace_2d,
+ kNBell_2d, kNCatnip_2d, kNCat_2d, kNGun_2d, kNPaper_2d,
+ kNPencil_2d, kNKey_2d, kNMagnify_2d, kNSafe_2d, kNScrew_2d,
+ kNWill_2d, kNAlbum_2d, kNBottle_2d, kNBalloon_2d, kNSky_2d,
+ kNWall_2d, kNGround_2d, kNTree_2d, kNFence_2d, kNHouse_2d,
+ kNRoof_2d, kNLight_2d, kNMoon_2d, kNPicture_2d, kNTable_2d,
+ kNStairs_2d, kNBed_2d, kNPlant_2d, kNFood_2d, kNWoman_2d,
+ kNMan_2d, kNMirror_2d, kNSink_2d, kNUnits_2d, kNBroom_2d,
+ kNGardenbits_2d, kNRock_2d, kNDroppings_2d, kNWindow_2d, kNBird_2d,
+ kNCage_2d, kNPhone_2d, kNChair_2d, kNTools_2d, kNBridge_2d,
+ kNWater_2d, kNBucket_2d, kNMouse_2d, kNWand_2d, kNHole_2d,
+ kNHandle_2d, kNChute_2d, kNOrgan_2d, kNPost_2d, kNGraf_2d
+};
+
+enum seqNouns_3d {
+//***************************************************************************
+// Hugo 3 Dos
+//***************************************************************************
+ kNHero_3d = 1, kNWhero_3d, kNHero_old_3d, kNWheroold_3d, kNPenny_3d,
+ kNPennylie_3d, kNLips_3d, kNPlane_3d, kNDoor_3d, kNCdoor_3d,
+ kNBlock_3d, kNVine_3d, kNSwinger_3d, kNDoctor_3d, kNClay_3d,
+ kNDoorlock_3d, kNNeedles_3d, kNNative_3d, kNNat1_3d, kNNat2_3d,
+ kNNat3_3d, kNNatb_3d, kNNatg_3d, kNBottles_3d, kNFlask_3d,
+ kNCage_3d, kNPipe_3d, kNElephant_3d, kNE_eyes_3d, kNBouillon_3d,
+ kNMoushole_3d, kNDoclie_3d, kNCheese_3d, kNSpider_3d, kNSnake_3d,
+ kNFire_3d, kNDocbits_3d, kNFire_1_3d, kNFire_2_3d, kNFire_3_3d,
+ kNFroth_3d, kNScroll_3d, kNCrystal_3d, kNGhost_3d, kNBell_3d,
+ kNBook_3d, kNCandle_3d, kNSky_3d, kNWall_3d, kNGround_3d,
+ kNFence_3d, kNBridge_3d, kNWater_3d, kNMouse_3d, kNWindow_3d,
+ kNShelfbits_3d, kNJungle_3d, kNOrchid_3d, kNPole_3d, kNHut_3d,
+ kNRock_3d, kNAircraft_3d, kNPlant1_3d, kNPlant2_3d, kNPlant3_3d,
+ kNPlant4_3d, kNPlant5_3d, kNWeb_3d, kNO_eye_3d, kNFire_4_3d,
+ kNMouth_3d, kNFood_3d, kNThem_3d
+};
+
+enum seqVerbs_1w {
+//***************************************************************************
+// Hugo 1 Windows
+//***************************************************************************
+ kVDummy = 0,
+ kVMakeUseOf_1w, kVMagic_1w, kVOpen_1w, kVClose_1w, kVUnlock_1w,
+ kVLock_1w, kVPush_1w, kVGive_1w, kVRude_1w, kVOff_1w,
+ kVInto_1w, kVOutof_1w, kVCrap_1w, kVRide_1w, kVTake_1w,
+ kVDrop_1w, kVAttack_1w, kVBreak_1w, kVThrowit_1w, kVWear_1w,
+ kVRub_1w, kVOil_1w, kVMove_1w, kVLift_1w, kVDig_1w,
+ kVUnder_1w, kVLook_1w, kVEat_1w, kVBlow_1w, kVUntie_1w,
+ kVCut_1w, kVTalk_1w, kVPlug_1w,
+ // Background verbs:
+ kVShout_1w, kVQuery_1w,
+ kVJump_1w, kVGo_1w, kVEnter_1w, kVClimb_1w, kVSwitch_1w,
+ kVListen_1w, kVKnock_1w, kVSmell_1w, kVSit_1w, kVKiss_1w,
+ kVUnbolt_1w, kVLakeverbs_1w, kVHelp_1w, kVDrink_1w, kVSweep_1w,
+ kVFeed_1w, kVWash_1w, kVStroke_1w, kVHide_1w, kVBolt_1w,
+ kVHero
+};
+
+enum seqVerbs_2w {
+//***************************************************************************
+// Hugo 2 Windows
+//***************************************************************************
+ kVMakeUseOf_2w = 1, kVBlock_2w, kVUse_2w, kVPush_2w, kVUnder_2w,
+ kVSearch_2w, kVLook_2w, kVMagic_2w, kVOpen_2w, kVClose_2w,
+ kVUnlock_2w, kVLock_2w, kVRide_2w, kVRest_2w, kVUndress_2w,
+ kVGive_2w, kVUnscrew_2w, kVRude_2w, kVOff_2w, kVInto_2w,
+ kVOutof_2w, kVTake_2w, kVDrop_2w, kVAttack_2w, kVBreak_2w,
+ kVThrowit_2w, kVWear_2w, kVRub_2w, kVOil_2w, kVMove_2w,
+ kVLift_2w, kVDig_2w, kVEat_2w, kVBlow_2w, kVUntie_2w,
+ kVCut_2w, kVTalk_2w, kVStrike_2w, kVHerring_2w, kVRing_2w,
+ kVRead_2w, kVDial_2w, kVFire_2w,
+ //* Background verbs:
+ kVShout_2w, kVQuery_2w,
+ kVJump_2w, kVGo_2w, kVClimb_2w, kVSwitch_2w, kVListen_2w,
+ kVKnock_2w, kVSmell_2w, kVSit_2w, kVKiss_2w, kVHelp_2w,
+ kVDrink_2w, kVSweep_2w, kVFeed_2w, kVWash_2w, kVHello_2w,
+ kVWind_2w, kVTie_2w, kVStroke_2w, kVPlay_2w, kVWish_2w,
+ kVScribble_2w
+};
+
+enum seqVerbs_3w {
+//***************************************************************************
+// Hugo 3 Windows
+//***************************************************************************
+ kVMakeUseOf_3w = 1, kVPush_3w, kVUnder_3w, kVSearch_3w, kVBehind_3w,
+ kVLook_3w, kVMagic_3w, kVOpen_3w, kVClose_3w, kVRide_3w,
+ kVRest_3w, kVUndress_3w, kVGive_3w, kVUnscrew_3w, kVRude_3w,
+ kVNaughty_3w, kVOff_3w, kVInto_3w, kVOutof_3w, kVTake_3w,
+ kVDrop_3w, kVUnlock_3w, kVLock_3w, kVAttack_3w, kVBreak_3w,
+ kVThrowit_3w, kVWear_3w, kVRub_3w, kVOil_3w, kVMove_3w,
+ kVLift_3w, kVDig_3w, kVEat_3w, kVBlow_3w, kVUntie_3w,
+ kVCut_3w, kVFill_3w, kVEmpty_3w, kVDrink_3w, kVStrike_3w,
+ kVHerring_3w, kVRing_3w, kVRead_3w, kVDial_3w, kVShoot_3w,
+ kVRepair_3w, kVFly_3w, kVDouse_3w, kVExorcise_3w, kVSwing_3w,
+ kVCross_3w, kVMake_3w, kVStick_3w, kVTalk_3w,
+ // Background verbs:
+ kVShout_3w,
+ kVQuery_3w, kVJump_3w, kVGo_3w, kVClimb_3w, kVSwitch_3w,
+ kVListen_3w, kVKnock_3w, kVSmell_3w, kVSit_3w, kVKiss_3w,
+ kVHelp_3w, kVSweep_3w, kVFeed_3w, kVWash_3w, kVHello_3w,
+ kVWind_3w, kVTie_3w, kVStroke_3w, kVPlay_3w, kVWish_3w,
+ kVPut_3w, kVUse_3w, kVSwim_3w, kVShow_3w
+};
+
+enum seqVerbs_1d {
+//***************************************************************************
+// Hugo 1 DOS
+//***************************************************************************
+ kVMagic_1d = 1, kVOpen_1d, kVClose_1d, kVUnlock_1d, kVLock_1d,
+ kVPush_1d, kVGive_1d, kVRude_1d, kVOff_1d, kVInto_1d,
+ kVOutof_1d, kVCrap_1d, kVRide_1d, kVTake_1d, kVDrop_1d,
+ kVAttack_1d, kVBreak_1d, kVThrow_1d, kVWear_1d, kVRub_1d,
+ kVOil_1d, kVMove_1d, kVLift_1d, kVDig_1d, kVUnder_1d,
+ kVLook_1d, kVEat_1d, kVBlow_1d, kVUntie_1d, kVCut_1d,
+ kVTalk_1d, kVPlug_1d,
+ // Background verbs:
+ kVShout_1d, kVQuery_1d, kVJump_1d,
+ kVGo_1d, kVEnter_1d, kVClimb_1d, kVSwitch_1d, kVListen_1d,
+ kVKnock_1d, kVSmell_1d, kVSit_1d, kVKiss_1d, kVUnbolt_1d,
+ kVLakeverbs_1d, kVHelp_1d, kVDrink_1d, kVSweep_1d, kVFeed_1d,
+ kVWash_1d
+};
+
+enum seqVerbs_2d {
+//***************************************************************************
+// Hugo 2 DOS
+//***************************************************************************
+ kVBlock_2d = 1, kVUse_2d, kVPush_2d, kVUnder_2d, kVSearch_2d,
+ kVLook_2d, kVOpen_2d, kVClose_2d, kVUnlock_2d, kVLock_2d,
+ kVRide_2d, kVRest_2d, kVOff_2d, kVInto_2d, kVOutof_2d,
+ kVTake_2d, kVDrop_2d, kVAttack_2d, kVBreak_2d, kVThrow_2d,
+ kVWear_2d, kVRub_2d, kVOil_2d, kVMove_2d, kVLift_2d,
+ kVEat_2d, kVBlow_2d, kVUntie_2d, kVCut_2d, kVTalk_2d,
+ kVGive_2d, kVStrike_2d, kVHerring_2d, kVRing_2d, kVRead_2d,
+ kVDial_2d, kVFire_2d, kVShout_2d, kVQuery_2d, kVJump_2d,
+ kVGo_2d, kVClimb_2d, kVSwitch_2d, kVListen_2d, kVKnock_2d,
+ kVSmell_2d, kVSit_2d, kVKiss_2d, kVHelp_2d, kVMagic_2d,
+ kVDig_2d, kVDrink_2d, kVSweep_2d, kVFeed_2d, kVWash_2d,
+ kVHello_2d, kVWind_2d, kVTie_2d, kVStroke_2d, kVUnscrew_2d,
+ kVRude_2d, kVUndress_2d, kVPlay_2d, kVWish_2d
+};
+
+enum seqVerbs_3d {
+//***************************************************************************
+// Hugo 3 DOS
+//***************************************************************************
+ kVPush_3d = 1, kVUnder_3d, kVSearch_3d, kVBehind_3d, kVLook_3d,
+ kVMagic_3d, kVOpen_3d, kVClose_3d, kVRide_3d, kVRest_3d,
+ kVUndress_3d, kVGive_3d, kVUnscrew_3d, kVRude_3d, kVNaughty_3d,
+ kVOff_3d, kVInto_3d, kVOutof_3d, kVTake_3d, kVDrop_3d,
+ kVUnlock_3d, kVLock_3d, kVAttack_3d, kVBreak_3d, kVThrow_3d,
+ kVWear_3d, kVRub_3d, kVOil_3d, kVMove_3d, kVLift_3d,
+ kVDig_3d, kVEat_3d, kVBlow_3d, kVUntie_3d, kVCut_3d,
+ kVFill_3d, kVEmpty_3d, kVDrink_3d, kVStrike_3d, kVHerring_3d,
+ kVRing_3d, kVRead_3d, kVDial_3d, kVShoot_3d, kVRepair_3d,
+ kVFly_3d, kVDouse_3d, kVExorcise_3d, kVSwing_3d, kVCross_3d,
+ kVMake_3d, kVStick_3d, kVTalk_3d,
+ // Background verbs:
+ kVShout_3d, kVQuery_3d,
+ kVJump_3d, kVGo_3d, kVClimb_3d, kVSwitch_3d, kVListen_3d,
+ kVKnock_3d, kVSmell_3d, kVSit_3d, kVKiss_3d, kVHelp_3d,
+ kVSweep_3d, kVFeed_3d, kVWash_3d, kVHello_3d, kVWind_3d,
+ kVTie_3d, kVStroke_3d, kVPlay_3d, kVWish_3d, kVPut_3d,
+ kVUse_3d, kVSwim_3d, kVShow_3d
+};
+
+
+enum seqActList_1w {
+//***************************************************************************
+// Hugo 1 Windows
+//***************************************************************************
+ kALDummy = 0,
+ kALgoinside_1w, kALopendoor1_1w, kALclosedoor1_1w, kALightning_1w, kALblinkeyes1_1w,
+ kALbat_1w, kALpkin_1w, kALscr1_1w, kALridprof_1w, kALopendoor2_1w,
+ kALopendoor3_1w, kALblinkeyes2_1w, kALscr10_1w, kALscr13_1w, kALscr15_1w,
+ kALcuptxt0_1w, kALcuptxt1_1w, kALcuptxt2_1w, kALcuptxt3_1w, kALlookcupb2_1w,
+ kALlookcupb1_1w, kALlookcupb_1w, kALcupbpk_1w, kALcupbdw_1w, kALchasehall_1w,
+ kALchasekit_1w, kALdefbats_1w, kALnought_1w, kALcond9_1w, kALcond5_1w,
+ kALblowdw_1w, kALputmask_1w, kALscr115_1w, kALopenwdoorm_1w, kALopenwdoors_1w,
+ kALclosewdoors_1w, kALswapmask_1w, kALdropmask_1w, kALwearmask_1w, kALremovemask_1w,
+ kALusemask_1w, kALscr21_1w, kALbut_1w, kALbutler_1w, kALbutp_1w,
+ kALbutyes_1w, kALbutno_1w, kALbutchopped_1w, kALbutchop_1w, kALbutroam_1w,
+ kALeatchop_1w, kALeatchop2_1w, kALthrowchop_1w, kALchopfail_1w, kALchoppass_1w,
+ kALrepredeye_1w, kALreplips_1w, kALreparm_1w, kALtalkfrank_1w, kALtalkdrac_1w,
+ kALtalkgwen_1w, kALtalkhood_1w, kALtalkslime_1w, kALtalkpeahd_1w, kALscr31_1w,
+ kALscr35_1w, kALscr41_1w, kALscr51_1w, kALscr53_1w, kALscr56_1w,
+ kALscr57_1w, kALscr65_1w, kALopenyes_1w, kALopenno_1w, kALopendoor4_1w,
+ kALclosedoor4_1w, kALshedoil_1w, kALscr75_1w, kALdog_1w, kALdead_1w,
+ kALdoggy_1w, kALgetchop_1w, kALmovecarp_1w, kALridmask_1w, kALopenpass_1w,
+ kALopenfail_1w, kALopentrap_1w, kALclosetrap_1w, kALscr89_1w, kALscr87_1w,
+ kALhelpy_1w, kALhelpn_1w, kALhelpy2_1w, kALhelp_1w, kALscr910_1w,
+ kALscr98_1w, kALbatrep_1w, kALbatattack_1w, kALbatty_1w, kALbats_1w,
+ kALmum_1w, kALmummy_1w, kALrock_1w, kALscr109_1w, kALscr1011_1w,
+ kALscr1110_1w, kALscr1112_1w, kALcutrope_1w, kALherofar_1w, kALembark_1w,
+ kALnobung_1w, kALgetinboat_1w, kALplugbung_1w, kALdeboat_1w, kALnodeboat_1w,
+ kALchkout_1w, kALgetoutboat_1w, kALgofar_1w, kALcomenear_1w, kALmoveboat_1w,
+ kALmoving_1w, kALchkmove_1w, kALnotcut_1w, kALpushboat_1w, kALchkboat2_1w,
+ kALuseboat_1w, kALrepno1_1w, kALrepno3_1w, kALrepyes1_1w, kALrepyes2_1w,
+ kALrepyes3_1w, kALrepyes4_1w, kALrepyes5_1w, kALrepyes6_1w, kALrepyes7_1w,
+ kALomask_1w, kALomasked_1w, kALoldman_1w, kALscr1213_1w, kALjailrep_1w,
+ kALend_1w, kALjail_1w, kALgive_1w, kALnogive_1w, kALgold_1w,
+ kALscr1211_1w, kALgoodbye_1w, kALok151_1w, kALdmsg3_1w, kALdmsg2_1w,
+ kALdmsg1_1w, kALchkd3_1w, kALchkd2_1w, kALchkd1_1w, kALscr151_1w,
+ kALprof_1w, kALlab_1w, kALbox0_1w, kALbbox_1w, kALbox_1w,
+ kALweird_1w, kALcycle_1w, kALinorm_1w, kALigor3_1w, kALigor2_1w,
+ kALigor1_1w, kALigor0_1w, kALgobox_1w, kALichk3_1w, kALichk2_1w,
+ kALichk1_1w, kALichk0_1w, kALigor_1w
+};
+
+enum seqActList_2w {
+//***************************************************************************
+// Hugo 2 Windows
+//***************************************************************************
+ kAL11maze_2w = 1, kAL_eatgar_2w, kALballoon_2w, kALbanana_2w, kALbang1_2w,
+ kALbang2_2w, kALbed1_2w, kALbell1_2w, kALbell2_2w, kALbell_2w,
+ kALbite_2w, kALblah_2w, kALboom_2w, kALbottle_2w, kALbridge_2w,
+ kALbugattack_2w, kALbugflit_2w, kALbugrep1_2w, kALbugrep2_2w, kALbugs_2w,
+ kALbugzapper_2w, kALcallp_2w, kALcantpush_2w, kALcat1_2w, kALcat2_2w,
+ kALcat3_2w, kALcat4_2w, kALcat5_2w, kALcat6_2w, kALcatnip_2w,
+ kALchasm_2w, kALcheat_2w, kALchkbell2_2w, kALchkc09_2w, kALchkcarry_2w,
+ kALchkdoc_2w, kALchkld3_2w, kALchkld4_2w, kALchkmat1_2w, kALchkmat2_2w,
+ kALchkpap1_2w, kALchkpap2_2w, kALchkroute_2w, kALchkrr2_2w, kALchksafe_2w,
+ kALchkscrew_2w, kALchkstate1_2w, kALclick_2w, kALclimax_2w, kALclimbrope_2w,
+ kALclimbup_2w, kALclimbwell_2w, kALclue09_2w, kALcomb1_2w, kALcomb2_2w,
+ kALcook_2w, kALcookp_2w, kALcop_2w, kALcure_2w, kALdial_2w,
+ kALdialed_2w, kALdidnt_2w, kALdoctor_2w, kALdog1_2w, kALdone_2w,
+ kALdropdyn1_2w, kALdropdyn2_2w, kALdropdynamite_2w, kALdropmat_2w, kALdumb_2w,
+ kALdyn1_2w, kALeatban_2w, kALeatbanana_2w, kALempty_2w, kALexitmaze_2w,
+ kALfaint_2w, kALgard1_2w, kALgarlic_2w, kALgatelight_2w, kALgatescls_2w,
+ kALgatesopn_2w, kALgenie_2w, kALgetbook_2w, kALgetdynamite_2w, kALgetgarlic_2w,
+ kALgetmatch_2w, kALgiveb2_2w, kALgiveb3_2w, kALgiveb4_2w, kALgivebel_2w,
+ kALglchk2_2w, kALglightoff_2w, kALglighton_2w, kALglook1_2w, kALglook2_2w,
+ kALgoclosed_2w, kALgoopen_2w, kALgotwill_2w, kALgun_2w, kALharry_2w,
+ kALhdrink_2w, kALheroxy01_2w, kALhfaint_2w, kALhole_2w, kALhprompt_2w,
+ kALhrgreet_2w, kALhtable_2w, kALhugone_2w, kALkaboom3_2w, kALkaboom_2w,
+ kALkeyhole1_2w, kALkeyhole2_2w, kALkeyhole_2w, kALlamp_2w, kALlightdynamite_2w,
+ kALlignpen_2w, kALlookbrg_2w, kALlookgard_2w, kALlookkennel_2w, kALmaid_2w,
+ kALmaidbk_2w, kALmaidp_2w, kALmaidx_2w, kALmap0_2w, kALmap1_2w,
+ kALmatok_2w, kALmissed_2w, kALnasty_2w, kALnobang2_2w, kALnobang_2w,
+ kALnobell_2w, kALnocarry_2w, kALnocure_2w, kALnodrink_2w, kALnogenie_2w,
+ kALnopurps_2w, kALnoreply_2w, kALnotrap_2w, kALomgag_2w, kALopendoor1_2w,
+ kALopendoor2_2w, kALopendoor3_2w, kALpanel_2w, kALparty_2w, kALpencil_2w,
+ kALpengone_2w, kALpenny1_2w, kALphone_2w, kALphonebox_2w, kALphoto1_2w,
+ kALphoto2_2w, kALphoto3_2w, kALphoto_2w, kALpois1_2w, kALpois2_2w,
+ kALpois3_2w, kALpois4_2w, kALpushpaper_2w, kALpushpencil_2w, kALreadlet_2w,
+ kALrephest_2w, kALrepmsg1_2w, kALrg_2w, kALridgard_2w, kALridgarl_2w,
+ kALridkey_2w, kALrobot_2w, kALrr_2w, kALrumbling_2w, kALsafe1_2w,
+ kALsafe_2w, kALsafepr_2w, kALschedbut_2w, kALscr0201_2w, kALscr02_2w,
+ kALscr0301_2w, kALscr0305_2w, kALscr0306_2w, kALscr03_2w, kALscr04_2w,
+ kALscr0503_2w, kALscr0603_2w, kALscr0607_2w, kALscr0631_2w, kALscr06_2w,
+ kALscr0706_2w, kALscr0708_2w, kALscr0710_2w, kALscr0807_2w, kALscr0809_2w,
+ kALscr0908_2w, kALscr09_2w, kALscr1007_2w, kALscr10_2w, kALscr1108_2w,
+ kALscr1113_2w, kALscr1314_2w, kALscr1413_2w, kALscr1415_2w, kALscr14_2w,
+ kALscr1514_2w, kALscr1516_2w, kALscr1517_2w, kALscr15_2w, kALscr1615_2w,
+ kALscr1715_2w, kALscr1718_2w, kALscr1720_2w, kALscr1817_2w, kALscr1819c_2w,
+ kALscr1819l_2w, kALscr1819r_2w, kALscr1918c_2w, kALscr1918l_2w, kALscr1918r_2w,
+ kALscr2017_2w, kALscr2223_2w, kALscr2322_2w, kALscr2324_2w, kALscr2325_2w,
+ kALscr2326_2w, kALscr2423_2w, kALscr2523_2w, kALscr25_2w, kALscr2623_2w,
+ kALscr2627_2w, kALscr2726_2w, kALscr2827_2w, kALscr2829_2w, kALscr2928_2w,
+ kALscr2930_2w, kALscr2931_2w, kALscr2934_2w, kALscr2938_2w, kALscr29_2w,
+ kALscr3029_2w, kALscr30_2w, kALscr3106_2w, kALscr3129_2w, kALscr3132_2w,
+ kALscr3231_2w, kALscr33_2w, kALscr3429_2w, kALscr3438_2w, kALscr34_2w,
+ kALscr3534_2w, kALscr35_2w, kALscr3634_2w, kALscr36_2w, kALscr3718_2w,
+ kALscr3829_2w, kALscr3834_2w, kALscrgate1_2w, kALscrgate2_2w, kALscrok_2w,
+ kALshedlight_2w, kALshot_2w, kALsilly_2w, kALslightoff_2w, kALslighton_2w,
+ kALsnake_2w, kALsoggy_2w, kALsong3_2w, kALsong4_2w, kALsonic_2w,
+ kALstopr_2w, kALstrike_2w, kALstrikematch_2w, kALstuck_2w, kALswgates_2w,
+ kALswzapper_2w, kALtakepaper_2w, kALtalkgard_2w, kALthrown_2w, kALthrowstick_2w,
+ kALtrap_2w, kALuptrap_2w, kALvenus_2w, kALwho_2w, kALwill1_2w,
+ kALwill2_2w, kALwill_2w, kALworkgates_2w, kALzapperoff_2w, kALzapperon_2w,
+ kALnewscr_2w, kALscr01Story_2w, kALscr01NoStory_2w
+
+};
+
+enum seqActList_3w {
+//***************************************************************************
+// Hugo 3 Windows
+//***************************************************************************
+ kALac2_3w = 1, kALac3_3w, kALac4_3w, kALac5_3w, kALac6_3w,
+ kALac7_3w, kALac8_3w, kALac9_3w, kALasleep_3w, kALbittest_3w,
+ kALblk1_3w, kALblk_3w, kALbrg_clftop1_3w, kALbrg_clftop_3w, kALbrg_clftop_msg_3w,
+ kALbrg_down_3w, kALbrg_ok_3w, kALbrg_path_3w, kALbridge_3w, kALbridgetest_3w,
+ kALbridgetip_3w, kALbtip_3w, kALbtipprompt_3w, kALcageprompt_3w, kALcagetest2_3w,
+ kALcagetest3_3w, kALcagetest4_3w, kALcagetest_3w, kALcamp_3w, kALcamp_hut_3w,
+ kALcamp_village_c_3w, kALcamp_village_l_3w, kALcampers_3w, kALcanttake_3w, kALcave_man_3w,
+ kALcave_oldman_3w, kALcave_turn_3w, kALcave_wfall_3w, kALchase_3w, kALclf_clftop_3w,
+ kALclf_wfall_3w, kALclftop_brg_3w, kALclftop_clf_3w, kALclftop_slope_3w, kALclosedoor_3w,
+ kALcom0_3w, kALcom1_3w, kALcom2_3w, kALcom3_3w, kALcom4_3w,
+ kALcom5_3w, kALcom6_3w, kALcom7_3w, kALcom8_3w, kALcomment_3w,
+ kALcrash_web_3w, kALcrashed_3w, kALcrashtest2_3w, kALcryhelp_3w, kALcrystal_3w,
+ kALcubestip_3w, kALdammed_3w, kALdammedtip_3w, kALdart_3w, kALdarted_3w,
+ kALdartedtest_3w, kALdartsched_3w, kALdn_3w, kALdoc_3w, kALdocgot_3w,
+ kALdodart_3w, kALdrink_3w, kALdrinkno_3w, kALdrinkyes_3w, kALdropcheese_3w,
+ kALdropincage_3w, kALdropord_3w, kALdroptest2_3w, kALeatcheese_3w, kALeatit_3w,
+ kALele_sleep_3w, kALeleblink_3w, kALeletest2_3w, kALempty2_3w, kALemptymagic_3w,
+ kALemptyord_3w, kALemptytest2_3w, kALentertest2_3w, kALentertest3_3w, kALexit_3w,
+ kALexor_3w, kALexorcise_3w, kALexordone_3w, kALexotest2_3w, kALfill_3w,
+ kALfillmagic_3w, kALfillord_3w, kALfilltest2_3w, kALfilltest3_3w, kALfindbook_3w,
+ kALfindcrystal_3w, kALfindit_3w, kALflash_3w, kALflask_3w, kALflasktest2_3w,
+ kALflasktest3_3w, kALgarden_wbase_3w, kALgettest2_3w, kALgive_3w, kALgiveb_3w,
+ kALgivetest_3w, kALgot_3w, kALholel_3w, kALholer_3w, kALhorizdn_3w,
+ kALhorizon_3w, kALhorizup_3w, kALhut_camp_3w, kALhut_enter_3w, kALhut_in_3w,
+ kALhut_out_3w, kALhut_village_c_3w, kALhut_village_r_3w, kALleft_3w, kALlookfall_3w,
+ kALlooknofall_3w, kALlookwfall_3w, kALmagictip_3w, kALmakeclay_3w, kALmakeit_3w,
+ kALmission_3w, kALmodeltip_3w, kALmouse_3w, kALmousego_3w, kALmousegone_3w,
+ kALmousel_3w, kALmouser_3w, kALmousetip_3w, kALnat1_3w, kALnat2_3w,
+ kALnat3_3w, kALnat4_3w, kALnat5_3w, kALnat6_3w, kALnat7_3w,
+ kALnat8_3w, kALnat9_3w, kALnative_3w, kALnoblow_3w, kALnoclay_3w,
+ kALnofill_3w, kALnomake_3w, kALnoremedy_3w, kALnospell_3w, kALnostick_3w,
+ kALnostickpin_3w, kALnotakecb_3w, kAL_nothanks_3w, kALnotip_3w, kALnottied_3w,
+ kALoktoleave1_3w, kALoktoleave2_3w, kALold2_3w, kALold3_3w, kALold4_3w,
+ kALold5_3w, kALold6_3w, kALold7_3w, kALoldfirst_3w, kALoldman_3w,
+ kALoldmantip_3w, kALoldsubseq_3w, kALopencage_3w, kALopencdoor_3w, kALopendoor_3w,
+ kALpath_3w, kALpath_brg_3w, kALpath_stream_3w, kALpath_village_3w, kALpath_web_3w,
+ kALplane_3w, kALplanetip_3w, kALpostest_3w, kALprod_3w, kALputitdown_3w,
+ kALreadbook_3w, kALreadord_3w, kALreadtest2_3w, kALrefuse_3w, kALrefuseflask_3w,
+ kALremedy_3w, kALremedytip_3w, kALreturn_3w, kALright_3w, kALscare_3w,
+ kALscared_3w, kALsleepy_3w, kALslope_clftop_3w, kALslope_stream_3w, kALspider_3w,
+ kALspirit_3w, kALsteps_3w, kALstick_3w, kALstickpin_3w, kALsticktest1_3w,
+ kALsticktest2_3w, kALsticktest4_3w, kALsticktip_3w, kALstream1_3w, kALstream2_3w,
+ kALstream_path_3w, kALstream_slope_3w, kALstuckpin_3w, kALsunset_3w, kALswing_3w,
+ kALswingtip_3w, kALtakecage_3w, kALtakecb_3w, kALtakecheese_3w, kALtakechs_3w,
+ kALtakeit_3w, kALtaketest1_3w, kALtaketest2_3w, kALtalkdoc1_3w, kALtalkdoc2_3w,
+ kALtalkdoc3_3w, kALtalkdoc_3w, kALtalknat_3w, kALtalktest1_3w, kALtalktest2_3w,
+ kALtalkweb_3w, kALtdtest_3w, kALtied_3w, kALtievine_3w, kALtrapped_3w,
+ kALturn_cave_3w, kALturn_village_3w, kALuntie_3w, kALuntie_vine_3w, kALup_3w,
+ kALusecage_3w, kALvillage_camp_l_3w, kALvillage_camp_r_3w, kALvillage_path_3w, kALvillage_thing_3w,
+ kALvillage_turn_3w, kALvine_3w, kALwarn_3w, kALwaterfall_3w, kALwaternofall_3w,
+ kALwbase_garden_3w, kALwbase_wfall_3w, kALweb_3w, kALweb_crash_3w, kALweb_path_3w,
+ kALwebtest2_3w, kALwfall_cave_3w, kALwfall_clf_3w, kALwfall_wbase_3w, kALwfallb_cave_3w,
+ kALwfallb_clf_3w, kALwfallb_wbase_3w, kALwrong_3w, kALempty_3w, kALgotit_3w,
+ kALnocarry_3w, kALnopurps_3w, kALnothanks_3w, kALok_3w, kALstalk_3w,
+ kALcrashStory_3w, kALcrashNoStory_3w
+};
+
+enum seqActList_1d {
+//***************************************************************************
+// Hugo 1 Dos
+//***************************************************************************
+ kALbat_1d = 1, kALbatattack_1d, kALbatrep_1d, kALbats_1d, kALblinkeyes1_1d,
+ kALblinkeyes2_1d, kALblowdw_1d, kALbox0_1d, kALbox_1d, kALbut_1d,
+ kALbutchop_1d, kALbutchopped_1d, kALbutler_1d, kALbutno_1d, kALbutp_1d,
+ kALbutroam_1d, kALbutyes_1d, kALchasehall_1d, kALchasekit_1d, kALchkd1_1d,
+ kALchkd2_1d, kALchkd3_1d, kALchkmove_1d, kALchkout_1d, kALchopfail_1d,
+ kALchoppass_1d, kALclosedoor1_1d, kALclosedoor4_1d, kALclosetrap_1d, kALclosewdoors_1d,
+ kALcomenear_1d, kALcond5_1d, kALcond9_1d, kALcupbdw_1d, kALcupbpk_1d,
+ kALcuptxt0_1d, kALcuptxt1_1d, kALcuptxt2_1d, kALcuptxt3_1d, kALcutrope_1d,
+ kALcycle_1d, kALdeboat_1d, kALdefbats_1d, kALdmsg1_1d, kALdmsg2_1d,
+ kALdmsg3_1d, kALdog_1d, kALdoggy_1d, kALdropmask_1d, kALeatchop_1d,
+ kALembark_1d, kALend_1d, kALgetinboat_1d, kALgetoutboat_1d, kALgive_1d ,
+ kALgobox_1d, kALgofar_1d, kALgold_1d, kALhelp_1d, kALhelpn_1d,
+ kALhelpy2_1d, kALhelpy_1d, kALherofar_1d, kALichk0_1d, kALichk1_1d,
+ kALichk2_1d, kALichk3_1d, kALightning_1d, kALigor0_1d, kALigor1_1d,
+ kALigor2_1d, kALigor3_1d, kALigor_1d, kALinorm_1d, kALjail_1d,
+ kALjailrep_1d, kALlab_1d, kALlookcupb1_1d, kALlookcupb2_1d, kALlookcupb_1d,
+ kALmoveboat_1d, kALmovecarp_1d, kALmoving_1d, kALmum_1d, kALmummy_1d,
+ kALnodeboat_1d, kALnogive_1d, kALnotcut_1d, kALnought_1d, kALok151_1d,
+ kALoldman_1d, kALomask_1d, kALomasked_1d, kALopendoor1_1d, kALopendoor2_1d,
+ kALopendoor3_1d, kALopendoor4_1d, kALopenfail_1d, kALopenno_1d, kALopenpass_1d,
+ kALopentrap_1d, kALopenwdoors_1d, kALopenyes_1d, kALpkin_1d, kALplugbung_1d,
+ kALprof_1d, kALpushboat_1d, kALputmask_1d, kALreparm_1d, kALreplips_1d,
+ kALrepno1_1d, kALrepno3_1d, kALrepredeye_1d, kALrepyes1_1d, kALrepyes2_1d,
+ kALrepyes3_1d, kALrepyes4_1d, kALrepyes5_1d, kALrepyes6_1d, kALrepyes7_1d,
+ kALridmask_1d, kALridprof_1d, kALscr1011_1d, kALscr109_1d, kALscr10_1d,
+ kALscr1110_1d, kALscr1112_1d, kALscr115_1d, kALscr1211_1d, kALscr1213_1d,
+ kALscr13_1d, kALscr151_1d, kALscr15_1d, kALscr1_1d, kALscr21_1d,
+ kALscr31_1d, kALscr35_1d, kALscr41_1d, kALscr51_1d, kALscr53_1d,
+ kALscr56_1d, kALscr57_1d, kALscr65_1d, kALscr75_1d, kALscr87_1d,
+ kALscr89_1d, kALscr910_1d, kALscr98_1d, kALshedoil_1d, kALsong1_1d,
+ kALswapmask_1d, kALthrowchop_1d, kALweird_1d, kALnobung_1d, kALgoodbye_1d
+};
+
+enum seqActList_2d {
+//***************************************************************************
+// Hugo 2 Dos
+//***************************************************************************
+ kAL11maze_2d = 1, kALballoon_2d, kALbanana_2d, kALbang1_2d, kALbang2_2d,
+ kALbed1_2d, kALbell_2d, kALbell1_2d, kALbell2_2d, kALbite_2d,
+ kALblah_2d, kALboom_2d, kALbottle_2d, kALbridge_2d, kALbugattack_2d,
+ kALbugflit_2d, kALbugrep1_2d, kALbugrep2_2d, kALbugs_2d, kALbugzapper_2d,
+ kALcallp_2d, kALcantpush_2d, kALcat1_2d, kALcat2_2d, kALcat3_2d,
+ kALcat4_2d, kALcat5_2d, kALcat6_2d, kALcatnip_2d, kALchasm_2d,
+ kALcheat_2d, kALchkbell2_2d, kALchkc09_2d, kALchkcarry_2d, kALchkdoc_2d,
+ kALchkld3_2d, kALchkld4_2d, kALchkmat2_2d, kALchkpap1_2d, kALchkpap2_2d,
+ kALchkrr2_2d, kALchksafe_2d, kALchkscrew_2d, kALchkstate1_2d, kALclick_2d,
+ kALclimax_2d, kALclimbrope_2d, kALclimbup_2d, kALclimbwell_2d, kALclue09_2d,
+ kALcomb1_2d, kALcomb2_2d, kALcook_2d, kALcookp_2d, kALcop_2d,
+ kALcure_2d, kALdalek_2d, kALdial_2d, kALdidnt_2d, kALdoctor_2d,
+ kALdog1_2d, kALdone_2d, kALdropdyn1_2d, kALdropdyn2_2d, kALdropdynamite_2d,
+ kALdropmat_2d, kALdumb_2d, kALdyn1_2d, kALeatbanana_2d, kALempty_2d,
+ kALexitmaze_2d, kALfaint_2d, kALgard1_2d, kALgarlic_2d, kALgatelight_2d,
+ kALgatescls_2d, kALgatesopn_2d, kALgenie_2d, kALgetbook_2d, kALgetdynamite_2d,
+ kALgetgarlic_2d, kALgetmatch_2d, kALgiveb2_2d, kALgiveb3_2d, kALgiveb4_2d,
+ kALgivebel_2d, kALglightoff_2d, kALglighton_2d, kALgoclosed_2d, kALgoopen_2d,
+ kALgun_2d, kALharry_2d, kALhdrink_2d, kALheroxy01_2d, kALhfaint_2d,
+ kALhole_2d, kALhprompt_2d, kALhrgreet_2d, kALhtable_2d, kALhugone_2d,
+ kALkaboom_2d, kALkaboom3_2d, kALkeyhole_2d, kALkeyhole1_2d, kALkeyhole2_2d,
+ kALlamp_2d, kALlightdynamite_2d, kALlookkennel_2d, kALlookm1_2d, kALlookm2_2d,
+ kALlookmatch_2d, kALmaid_2d, kALmaidbk_2d, kALmaidp_2d, kALmaidx_2d,
+ kALmap0_2d, kALmap1_2d, kALmatok_2d, kALmissed_2d, kALnasty_2d,
+ kALnobang_2d, kALnobang2_2d, kALnobell_2d, kALnocarry_2d, kALnocure_2d,
+ kALnodrink_2d, kALnogenie_2d, kALnopurps_2d, kALnoreply_2d, kALnotrap_2d,
+ kALomgag_2d, kALopendoor1_2d, kALopendoor2_2d, kALopendoor3_2d, kALpanel_2d,
+ kALparty_2d, kALpencil_2d, kALpengone_2d, kALpenny1_2d, kALphone_2d,
+ kALphonebox_2d, kALphoto_2d, kALphoto1_2d, kALphoto2_2d, kALphoto3_2d,
+ kALpois1_2d, kALpois2_2d, kALpois3_2d, kALpois4_2d, kALpushpaper_2d,
+ kALpushpencil_2d, kALreadlet_2d, kALrepmsg1_2d, kALrg_2d, kALridgard_2d,
+ kALridgarl_2d, kALridkey_2d, kALrr_2d, kALrumbling_2d, kALsafe_2d,
+ kALsafe1_2d, kALsafepr_2d, kALschedbut_2d, kALscr01_2d, kALscr02_2d,
+ kALscr0201_2d, kALscr03_2d, kALscr0301_2d, kALscr0305_2d, kALscr0306_2d,
+ kALscr04_2d, kALscr0503_2d, kALscr06_2d, kALscr0603_2d, kALscr0607_2d,
+ kALscr0631_2d, kALscr0706_2d, kALscr0708_2d, kALscr0710_2d, kALscr0807_2d,
+ kALscr0809_2d, kALscr09_2d, kALscr0908_2d, kALscr10_2d, kALscr1007_2d,
+ kALscr1108_2d, kALscr1113_2d, kALscr1314_2d, kALscr14_2d, kALscr1413_2d,
+ kALscr1415_2d, kALscr15_2d, kALscr1514_2d, kALscr1516_2d, kALscr1517_2d,
+ kALscr1615_2d, kALscr1715_2d, kALscr1718_2d, kALscr1720_2d, kALscr1817_2d,
+ kALscr1819c_2d, kALscr1819l_2d, kALscr1819r_2d, kALscr1918c_2d, kALscr1918l_2d,
+ kALscr1918r_2d, kALscr2017_2d, kALscr2223_2d, kALscr2322_2d, kALscr2324_2d,
+ kALscr2325_2d, kALscr2326_2d, kALscr2423_2d, kALscr2523_2d, kALscr2623_2d,
+ kALscr2627_2d, kALscr2726_2d, kALscr2827_2d, kALscr2829_2d, kALscr29_2d,
+ kALscr2928_2d, kALscr2930_2d, kALscr2931_2d, kALscr2934_2d, kALscr2938_2d,
+ kALscr30_2d, kALscr3029_2d, kALscr3106_2d, kALscr3129_2d, kALscr3132_2d,
+ kALscr3231_2d, kALscr33_2d, kALscr34_2d, kALscr3429_2d, kALscr3438_2d,
+ kALscr35_2d, kALscr3534_2d, kALscr36_2d, kALscr3634_2d, kALscr3718_2d,
+ kALscr3829_2d, kALscr3834_2d, kALscrgate1_2d, kALscrgate2_2d, kALscrok_2d,
+ kALshedlight_2d, kALshot_2d, kALsilly_2d, kALslightoff_2d, kALslighton_2d,
+ kALsnake_2d, kALsong1_2d, kALsong3_2d, kALsong4_2d, kALsonic_2d,
+ kALstrike1_2d, kALstrikematch_2d, kALswgates_2d, kALswzapper_2d, kALthrown_2d,
+ kALthrowstick_2d, kALtrap_2d, kALuptrap_2d, kALvenus_2d, kALwho_2d,
+ kALwill_2d, kALwill1_2d, kALwill2_2d, kALworkgates_2d, kALzapperoff_2d,
+ kALzapperon_2d, kALnewscr_2d
+};
+
+enum seqActList_3d {
+//***************************************************************************
+// Hugo 3 Dos
+//***************************************************************************
+ kALac2_3d = 1, kALac3_3d, kALac4_3d, kALac5_3d, kALac6_3d,
+ kALac7_3d, kALac8_3d, kALac9_3d, kALasleep_3d, kALbittest_3d,
+ kALblk1_3d, kALblk_3d, kALbrg_clftop1_3d, kALbrg_clftop_3d, kALbrg_clftop_msg_3d,
+ kALbrg_down_3d, kALbrg_ok_3d, kALbrg_path_3d, kALbridgetip_3d, kALbtip_3d,
+ kALbtipprompt_3d, kALcagetest2_3d, kALcagetest3_3d, kALcagetest4_3d, kALcagetest_3d,
+ kALcamp_3d, kALcamp_hut_3d, kALcamp_village_c_3d, kALcamp_village_l_3d, kALcampers_3d,
+ kALcanttake_3d, kALcave_man_3d, kALcave_oldman_3d, kALcave_turn_3d, kALcave_wfall_3d,
+ kALchase_3d, kALclf_clftop_3d, kALclf_wfall_3d, kALclftop_brg_3d, kALclftop_clf_3d,
+ kALclftop_slope_3d, kALclosedoor_3d, kALcom0_3d, kALcom1_3d, kALcom2_3d,
+ kALcom3_3d, kALcom4_3d, kALcom5_3d, kALcom6_3d, kALcom7_3d,
+ kALcom8_3d, kALcomment_3d, kALcrashNoStory_3d, kALcrashStory_3d, kALcrash_web_3d,
+ kALcrashed_3d, kALcrashtest2_3d, kALcryhelp_3d, kALcrystal_3d, kALcubestip_3d,
+ kALdammed_3d, kALdammedtip_3d, kALdart_3d, kALdarted_3d, kALdartedtest_3d,
+ kALdartsched_3d, kALdn_3d, kALdoc_3d, kALdocgot_3d, kALdodart_3d,
+ kALdrink_3d, kALdrinkno_3d, kALdrinkyes_3d, kALdropcheese_3d, kALdropincage_3d,
+ kALdropord_3d, kALdroptest2_3d, kALeatcheese_3d, kALele_sleep_3d, kALeleblink_3d,
+ kALeletest2_3d, kALempty_3d, kALempty2_3d, kALemptymagic_3d, kALemptyord_3d,
+ kALemptytest2_3d, kALentertest2_3d, kALentertest3_3d, kALexit_3d, kALexor_3d,
+ kALexorcise_3d, kALexordone_3d, kALexotest2_3d, kALfill_3d, kALfillmagic_3d,
+ kALfillord_3d, kALfilltest2_3d, kALfilltest3_3d, kALfindbook_3d, kALfindcrystal_3d,
+ kALfindit_3d, kALflash_3d, kALflask_3d, kALflasktest2_3d, kALflasktest3_3d,
+ kALgarden_wbase_3d, kALgettest2_3d, kALgive_3d, kALgiveb_3d, kALgivetest_3d,
+ kALgot_3d, kALgotit_3d, kALholel_3d, kALholer_3d, kALhorizon_3d,
+ kALhut_camp_3d, kALhut_enter_3d, kALhut_in_3d, kALhut_out_3d, kALhut_village_c_3d,
+ kALhut_village_r_3d, kALleft_3d, kALlookfall_3d, kALlooknofall_3d, kALlookwfall_3d,
+ kALmagictip_3d, kALmakeclay_3d, kALmakeit_3d, kALmap0_3d, kALmap1_3d,
+ kALmission_3d, kALmodeltip_3d, kALmouse_3d, kALmousego_3d, kALmousegone_3d,
+ kALmousel_3d, kALmouser_3d, kALmousetip_3d, kALnat1_3d, kALnat2_3d,
+ kALnat3_3d, kALnat4_3d, kALnat5_3d, kALnat6_3d, kALnat7_3d,
+ kALnat8_3d, kALnat9_3d, kALnative_3d, kALnoblow_3d, kALnocarry_3d,
+ kALnoclay_3d, kALnofill_3d, kALnomake_3d, kALnopurps_3d, kALnoremedy_3d,
+ kALnospell_3d, kALnostick_3d, kALnostickpin_3d, kALnotakecb_3d, kALnothanks2_3d,
+ kALnothanks_3d, kALnotip_3d, kALnottied_3d, kALok_3d, kALoktoleave1_3d,
+ kALoktoleave2_3d, kALold2_3d, kALold3_3d, kALold4_3d, kALold5_3d,
+ kALold6_3d, kALold7_3d, kALoldfirst_3d, kALoldman_3d, kALoldmantip_3d,
+ kALoldsubseq_3d, kALopencage_3d, kALopencdoor_3d, kALopendoor_3d, kALpath_3d,
+ kALpath_brg_3d, kALpath_stream_3d, kALpath_village_3d, kALpath_web_3d, kALplane_3d,
+ kALplanetip_3d, kALpostest_3d, kALprod_3d, kALputitdown_3d, kALreadbook_3d,
+ kALreadord_3d, kALreadtest2_3d, kALrefuse_3d, kALrefuseflask_3d, kALremedy_3d,
+ kALremedytip_3d, kALreturn_3d, kALright_3d, kALscare_3d, kALscared_3d,
+ kALsleepy_3d, kALslope_clftop_3d, kALslope_stream_3d, kALsong3_3d, kALspider_3d,
+ kALspirit_3d, kALstalk_3d, kALstick_3d, kALstickpin_3d, kALsticktest1_3d,
+ kALsticktest2_3d, kALsticktest4_3d, kALsticktip_3d, kALstream1_3d, kALstream2_3d,
+ kALstream_path_3d, kALstream_slope_3d, kALstuckpin_3d, kALsunset_3d, kALswing_3d,
+ kALswingtip_3d, kALtakecage_3d, kALtakecb_3d, kALtakecheese_3d, kALtakechs_3d,
+ kALtakeit_3d, kALtaketest1_3d, kALtaketest2_3d, kALtalknat_3d, kALtalktest1_3d,
+ kALtalktest2_3d, kALtalkweb_3d, kALtied_3d, kALtievine_3d, kALtrapped_3d,
+ kALturn_cave_3d, kALturn_village_3d, kALuntie_3d, kALuntie_vine_3d, kALup_3d,
+ kALvillage_camp_l_3d, kALvillage_camp_r_3d, kALvillage_path_3d, kALvillage_thing_3d, kALvillage_turn_3d,
+ kALvine_3d, kALwarn_3d, kALwaterfall_3d, kALwaternofall_3d, kALwbase_garden_3d,
+ kALwbase_wfall_3d, kALweb_3d, kALweb_crash_3d, kALweb_path_3d, kALwebtest2_3d,
+ kALwfall_cave_3d, kALwfall_clf_3d, kALwfall_wbase_3d, kALwfallb_cave_3d, kALwfallb_clf_3d,
+ kALwfallb_wbase_3d, kALwrong_3d
+};
+
+// Enumerate picture files. All screens must have an entry here, in order
+enum screeenid_1w {
+ HOUSE_1w, HALL_1w, BED1_1w, DININGRM_1w, BATHROOM_1w, KITCHEN_1w,
+ GARDEN_1w, STORERM_1w, BASEMENT_1w, BATCAVE_1w, MUMMYRM_1w, LAKEROOM_1w,
+ DEADEND_1w, JAIL_1w, THE_END_1w, LAB_1w, FINTRO_1w, NUM_PICS_1w
+};
+
+enum screenid_2w {
+ /* 0*/ HOUSE_2w, HALL_2w, BED1_2w, BED2_2w, KEYHOLE_FILE_2w,
+ /* 5*/ BED3_2w, KITCHEN_2w, BACKDOOR_2w, SHED_2w, INSHED_2w,
+ /*10*/ VENUS_2w, GATESOPN_2w, GATESCLS_2w, STREAM_2w, ZAPPER_FILE_2w,
+ /*15*/ MUSHROOM_2w, WELL_FILE_2w, SNAKEPIT_2w, PHONEBOX_2w, STREET_2w,
+ /*20*/ KENNEL_FILE_2w, ROCKROOM_2w, ROCKGONE_2w, THREEWAY_2w, LAMPCAVE_2w,
+ /*25*/ CHASM_2w, PASSAGE_2w, LADDER_2w, TRAPROOM_2w, HALL2_2w,
+ /*30*/ LOUNGE_2w, PARLOR_2w, CATROOM_2w, BOXROOM_2w, HALL3_2w,
+ /*35*/ ORGAN_2w, HESTROOM_2w, RETUPMOC_2w, HALL1_2w,
+
+ // The maze madness: 8 x 8 array of screens
+ // Remember to set MAZE_SCREEN to first maze screen number
+ FMAZE01_2w, FMAZE02_2w, FMAZE03_2w, FMAZE04_2w, FMAZE05_2w,
+ FMAZE06_2w, FMAZE07_2w, FMAZE08_2w, FMAZE09_2w, FMAZE10_2w,
+ FMAZE11_2w, FMAZE12_2w, FMAZE13_2w, FMAZE14_2w, FMAZE15_2w,
+ FMAZE16_2w, FMAZE17_2w, FMAZE18_2w, FMAZE19_2w, FMAZE20_2w,
+ FMAZE21_2w, FMAZE22_2w, FMAZE23_2w, FMAZE24_2w, FMAZE25_2w,
+ FMAZE26_2w, FMAZE27_2w, FMAZE28_2w, FMAZE29_2w, FMAZE30_2w,
+ FMAZE31_2w, FMAZE32_2w, FMAZE33_2w, FMAZE34_2w, FMAZE35_2w,
+ FMAZE36_2w, FMAZE37_2w, FMAZE38_2w, FMAZE39_2w, FMAZE40_2w,
+ FMAZE41_2w, FMAZE42_2w, FMAZE43_2w, FMAZE44_2w, FMAZE45_2w,
+ FMAZE46_2w, FMAZE47_2w, FMAZE48_2w, FMAZE49_2w, FMAZE50_2w,
+ FMAZE51_2w, FMAZE52_2w, FMAZE53_2w, FMAZE54_2w, FMAZE55_2w,
+ FMAZE56_2w, FMAZE57_2w, FMAZE58_2w, FMAZE59_2w, FMAZE60_2w,
+ FMAZE61_2w, FMAZE62_2w, FMAZE63_2w, FMAZE64_2w,
+ FINTRO_2w, NUM_PICS_2w
+};
+
+enum screenid_3w {
+ CRASH_3w, WEB_3w, BRIDGE_3w, BRIDGE2_3w, CLIFFTOP_3w,
+ WFALL_3w, WFALL_B_3w, WBASE_3w, STREAM_3w, STREAM2_3w,
+ PATH_UL_3w, VILLAGE_3w, HUT_OUT_3w, HUT_IN_3w, GARDEN_3w,
+ OLDMAN_3w, CLIFF_3w, SLOPE_3w, CAMP_3w, SUNSET_3w,
+ TURN_3w, PLANE_3w, MAP_3w, PATH_3w, CAVE_3w,
+ FINTRO_3w, NUM_PICS_3w
+};
+
+// Hugo 1 DOS doesn't use a DAT file : the screen files are not packed together
+enum screenid_1d {NUM_PICS_1d};
+
+enum screenid_2d {
+ /* 0*/ HOUSE_2d, HALL_2d, BED1_2d, BED2_2d, KEYHOLE_FILE_2d,
+ /* 5*/ BED3_2d, KITCHEN_2d, BACKDOOR_2d, SHED_2d, INSHED_2d,
+ /*10*/ VENUS_2d, GATESOPN_2d, GATESCLS_2d, STREAM_2d, ZAPPER_FILE_2d,
+ /*15*/ MUSHROOM_2d, WELL_FILE_2d, SNAKEPIT_2d, PHONEBOX_2d, STREET_2d,
+ /*20*/ KENNEL_FILE_2d, ROCKROOM_2d, ROCKGONE_2d, THREEWAY_2d, LAMPCAVE_2d,
+ /*25*/ CHASM_2d, PASSAGE_2d, LADDER_2d, TRAPROOM_2d, HALL2_2d,
+ /*30*/ LOUNGE_2d, PARLOR_2d, CATROOM_2d, BOXROOM_2d, HALL3_2d,
+ /*35*/ ORGAN_2d, HESTROOM_2d, RETUPMOC_2d, HALL1_2d,
+
+// The maze madness: 8 x 8 array of screens
+// Remember to set MAZE_SCREEN to first maze screen number
+ FMAZE01_2d, FMAZE02_2d, FMAZE03_2d, FMAZE04_2d, FMAZE05_2d, FMAZE06_2d, FMAZE07_2d, FMAZE08_2d,
+ FMAZE09_2d, FMAZE10_2d, FMAZE11_2d, FMAZE12_2d, FMAZE13_2d, FMAZE14_2d, FMAZE15_2d, FMAZE16_2d,
+ FMAZE17_2d, FMAZE18_2d, FMAZE19_2d, FMAZE20_2d, FMAZE21_2d, FMAZE22_2d, FMAZE23_2d, FMAZE24_2d,
+ FMAZE25_2d, FMAZE26_2d, FMAZE27_2d, FMAZE28_2d, FMAZE29_2d, FMAZE30_2d, FMAZE31_2d, FMAZE32_2d,
+ FMAZE33_2d, FMAZE34_2d, FMAZE35_2d, FMAZE36_2d, FMAZE37_2d, FMAZE38_2d, FMAZE39_2d, FMAZE40_2d,
+ FMAZE41_2d, FMAZE42_2d, FMAZE43_2d, FMAZE44_2d, FMAZE45_2d, FMAZE46_2d, FMAZE47_2d, FMAZE48_2d,
+ FMAZE49_2d, FMAZE50_2d, FMAZE51_2d, FMAZE52_2d, FMAZE53_2d, FMAZE54_2d, FMAZE55_2d, FMAZE56_2d,
+ FMAZE57_2d, FMAZE58_2d, FMAZE59_2d, FMAZE60_2d, FMAZE61_2d, FMAZE62_2d, FMAZE63_2d, FMAZE64_2d,
+ FINTRO_2d, LASTPIC_2d
+};
+
+enum screenid_3d {
+ CRASH_3d, WEB_3d, BRIDGE_3d, BRIDGE2_3d, CLIFFTOP_3d,
+ WFALL_3d, WFALL_B_3d, WBASE_3d, STREAM_3d, STREAM2_3d,
+ PATH_UL_3d, VILLAGE_3d, HUT_OUT_3d, HUT_IN_3d, GARDEN_3d,
+ OLDMAN_3d, CLIFF_3d, SLOPE_3d, CAMP_3d, SUNSET_3d,
+ TURN_3d, PLANE_3d, MAP_3d, PATH_3d, CAVE_3d,
+ FINTRO_3d, NUM_PICS_3d
+};
+
+enum string_t_1w {
+//Hugo 1
+ kSTsOk_1w, kSTNopurps_1w, kSTtrywalk_1w, kSTnothing_1w, kSTenopurps_1w,
+ kSTnoidea_1w, kSTedull_1w, kSTeempty_1w, kSTchop1_1w, kSTnowayhose_1w,
+ kSTnounder_1w, kSTnojump_1w, kSTnoclimb_1w, kSTnotalk_1w, kSTnoattack_1w,
+ kSTnobreak_1w, kSTnonoise_1w, kSTnosmell_1w, kSTnodig_1w, kSTnorude_1w,
+ kSTnoanswer_1w, kSTlooksky_1w, kSTaskhelp_1w, kSTabracadabra_1w, kSTlookscreen0_1w,
+ kSTlooktree_1w, kSTlookfence_1w, kSTlookhouse_1w, kSTlookwindow_1w, kSTlookmoon_1w,
+ kSTeatpumpkin_1w, kSTundermat_1w, kSTlookscreen1_1w, kSTlookbat_1w, kSTlookpicture_1w,
+ kSTlooktable_1w, kSTlookupstairs_1w, kSTlooklight_1w, kSTlistenhall_1w, kSTlookscreen2_1w,
+ kSTlookbed_1w, kSTnosnooze_1w, kSTlookward_1w, kSTlookcupbd_1w, kSTlookbed1win_1w,
+ kSTlookface_1w, kSTlookscreen3_1w, kSTlookspread_1w, kSTlookbutler_1w, kSTlookplant_1w,
+ kSTlookzelda_1w, kSTlookdiningwin_1w, kSTlookfood_1w, kSTlookdiningman_1w, kSTlookwoman_1w,
+ kSTsitdown_1w, kSTtakefood_1w, kSTtalkdiningman_1w, kSTtalkdiningwoman_1w, kSTtalkbutler_1w,
+ kSTskiss_1w, kSTlistendining_1w, kSTdrinkdining_1w, kSTlookscreen4_1w, kSTlookbathwin_1w,
+ kSTlookmirror_1w, kSTlooktoilet_1w, kSTdopoo_1w, kSTdowee_1w, kSTlooktub_1w,
+ kSTusetub_1w, kSTsittoilet_1w, kSTwashhands_1w, kSTlookscreen5_1w, kSTlookunits_1w,
+ kSTlookkitchenwin_1w, kSTlookbroom_1w, kSTtakebroom_1w, kSTridebroom_1w, kSTsweepbroom_1w,
+ kSTlistenkitchen_1w, kSTlookscreen6_1w, kSTlookShed_1w, kSTclimbtree_1w, kSTlookgarden_1w,
+ kSTlookscreen7_1w, kSTsayunbolt_1w, kSTlookmousehole_1w, kSTtakedroppings_1w, kSTlookscreen8_1w,
+ kSTlookbasedoor_1w, kSToilbasedoor_1w, kSTpushbasedoor_1w, kSTexaminerock_1w, kSTbreakbasedoor_1w,
+ kSTopenbasedoor_1w, kSTunlockbasedoor_1w, kSTknockbasedoor_1w, kSTtalkpenelope_1w, kSTlistenbase_1w,
+ kSTlookscreen9_1w, kSTlookrock_1w, kSTlookscreen10_1w, kSTlooktomb_1w, kSTlookscreen11_1w,
+ kSTsuggestboat_1w, kSTnotthirsty_1w, kSTqueryplug_1w, kSTlookscreen12_1w, kSTtalkguard_1w,
+ kSTlookscreen15_1w, kSTtalkigor_1w, kSTtalkprof_1w, kSTlookmachine_1w, kSTusemachine_1w,
+ kSTlookbooth_1w, kSTlooklabtable_1w, kSTuseboxdoor_1w, kSTlooklights_1w, kSTspbreak_1w,
+ kSTsseepk_1w, kSTsseedw_1w, kSTsseepkdw_1w, kSTesnosee_1w, kSTesthrown_1w,
+ kSTsWonder_1w, kSTsBlowWhistle_1w, kSTsdefbat1_1w, kSTsdefbat2_1w, kSTsNothing_1w,
+ kSTsDropMask_1w, kSTsbut1_1w, kSTsButSniff_1w, kSTsButChop_1w, kSTsButHead_1w,
+ kSTsButEnjoy_1w, kSTsButTake_1w, kSTsButLater_1w, kSTsChopPrompt_1w, kSTsEatChop_1w,
+ kSTsDogEat_1w, kSTsopenp_1w, kSTsopenr_1w, kSTsWrongCombo_1w, kSTsRightCombo_1w,
+ kSTsDogEatHero_1w, kSTsTossMask_1w, kSTsTrapBolted_1w, kSTshelpp1_1w, kSTsBaseHelp1_1w,
+ kSTsNoHelp_1w, kSTshelpp2_1w, kSTsBaseHelp2_1w, kSTsGotcher_1w, kSTsBatGot_1w,
+ kSTsMummyGot_1w, kSTsBoatHole_1w, kSTsManBlock_1w, kSTsShutup_1w, kSTsBoatTied_1w,
+ kSTsq1_1w, kSTsq2_1w, kSTsq3_1w, kSTsq4_1w, kSTsq5_1w,
+ kSTsq6_1w, kSTsq7_1w, kSTsrep1_1w, kSTsrep2_1w, kSTsrep3_1w,
+ kSTsrep4_1w, kSTsrep5_1w, kSTsrep6_1w, kSTsrep7_1w, kSTsCorrect_1w,
+ kSTsIncorrect_1w, kSTsDoomed1_1w, kSTsDoomed2_1w, kSTsContinue_1w, kSTsOldMan1_1w,
+ kSTsOldMan2_1w, kSTsOldMan3_1w, kSTsOldMan4_1w, kSTsOldMan5_1w, kSTsCongrats_1w,
+ kSTsRescued1_1w, kSTsRescued2_1w, kSTsRescued3_1w, kSTsGuard1_1w, kSTsGuard2_1w,
+ kSTsNoGive_1w, kSTsKissy_1w, kSTsGoodbye_1w, kSTsGrip_1w, kSTsCoordinate_1w,
+ kSTsReach_1w, kSTsProf1_1w, kSTsProf2_1w, kSTsProf3_1w, kSTsIgorRed_1w,
+ kSTsProfUpset_1w, kSTsProfRetires_1w, kSTsIgorRefuses_1w, kSTsIgorBlue_1w, kSTsIgorGreen_1w,
+ kSTsIgorYellow_1w, kSTsIgorNo_1w, kSTsIgorBox_1w, kSTAskFrank_1w, kSTRepFrank_1w,
+ kSTAskDrac_1w, kSTRepDrac_1w, kSTAskGwen_1w, kSTRepGwen_1w, kSTAskFriar_1w,
+ kSTRepFriar_1w, kSTAskSlime_1w, kSTRepSlime_1w, kSTAskPea_1w, kSTRepPea_1w,
+ kSTclimbtree1_1w, kSTclimbfence_1w, kSTWearMask_1w, kSTRemoveMask_1w, kSTStrokeDog_1w,
+ kSTCutHero_1w, kSTOilHero_1w, kSTsTakeOil_1w, kSTsEnterBoat_1w, kSTsExitBoat_1w,
+ kSTsBoatAsk_1w, kSTGoldHero_1w, kSTLookMummy_1w, kSTTalkMummy_1w, kSTLookCarpet_1w,
+ kSTLookMonkey_1w
+};
+
+enum string_t_2w {
+//Hugo2
+ kSTOkgen_2w, kSTNopurps_2w, kSTClick_2w, kSTNocarry_2w, kSTEmpty_2w,
+ kSTMorespecific_2w, kSTStory_2w, kSTSmaid1_1_2w, kSTSmaid1_2_2w, kSTSmaid1_3_2w,
+ kSTSmaid1_4_2w, kSTSmaid1_5_2w, kSTSmaid1_6_2w, kSTSmaid1_7_2w, kSTSmaid1_8_2w,
+ kSTSmaid1_9_2w, kSTSmaid1_10_2w, kSTSfirst_2w, kSTTired_2w, kSTTired2_2w,
+ kSTSfaint1_2w, kSTSfaint2_2w, kSTSfaint3_2w, kSTSfaint4_2w, kSTFirst2_2w,
+ kSTSgone1_2w, kSTSgone2_2w, kSTSgone3_2w, kSTSgone4_2w, kSTSgone5_2w,
+ kSTSgone6_2w, kSTSgone7_2w, kSTHole1_2w, kSTLock1_2w, kSTDumb1_2w,
+ kSTDumb2_2w, kSTMatch1_2w, kSTMatch2_2w, kSTArgue1_2w, kSTCook1_2w,
+ kSTCook2_2w, kSTCook3_2w, kSTCook4_2w, kSTCook5_2w, kSTSgard1_2w,
+ kSTSgard2_2w, kSTSgard3_2w, kSTSgard4_2w, kSTSgard5_2w, kSTSgard6_2w,
+ kSTSgarl1_2w, kSTSgarl2_2w, kSTPush1_2w, kSTRumble_2w, kSTSwarn_2w,
+ kSTStung_2w, kSTMatch4_2w, kSTSwarnz_2w, kSTStingeroo_2w, kSTSbug5b_2w,
+ kSTSom1_2w, kSTSom2_2w, kSTSom3_2w, kSTSom3a_2w, kSTSom4_2w,
+ kSTSom5_2w, kSTSom6_2w, kSTSom7_2w, kSTSom8_2w, kSTWell1_2w,
+ kSTSnake1_2w, kSTSnake2_2w, kSTSnake3_2w, kSTSnake4_2w, kSTSnake5_2w,
+ kSTSserum1_2w, kSTSserum2_2w, kSTSdial1_2w, kSTSdial2_2w, kSTSafepr_2w,
+ kSTCall1_2w, kSTCall2_2w, kSTCall3_2w, kSTCall4_2w, kSTCall5_2w,
+ kSTCall6_2w, kSTTard1_2w, kSTTard2_2w, kSTBrrr_2w, kSTWeee_2w,
+ kSTThrown_2w, kSTDyn1_2w, kSTDyn2_2w, kSTDyn3_2w, kSTDyn4_2w,
+ kSTDyn5_2w, kSTDyn6_2w, kSTDyn7_2w, kSTDyn8_2w, kSTDyn9_2w,
+ kSTRub1_2w, kSTRub2_2w, kSTChasm1_2w, kSTBanana1_2w, kSTBanana2_2w,
+ kSTTrap1_2w, kSTSsafe1_2w, kSTScomb1_2w, kSTScomb2_2w, kSTGotWill_2w,
+ kSTSwill1_2w, kSTSwill2_2w, kSTSwill3_2w, kSTSwill4_2w, kSTSclimax1_2w,
+ kSTSclimax2_2w, kSTSclimax3_2w, kSTSclimax4_2w, kSTSclimax5_2w, kSTSclimax6_2w,
+ kSTSclimax7_2w, kSTNobody_2w, kSTNo_one1_2w, kSTNo_one2_2w, kSTSharry_2w,
+ kSTScheat1_2w, kSTScheat2_2w, kSTSdidnt1_2w, kSTSdidnt2_2w, kSTSphoto_2w,
+ kSTSphoto1_2w, kSTBlah_2w, kSTMaid1_2w, kSTMaid2_2w, kSTMaid3_2w,
+ kSTMaid4_2w, kSTMaid5_2w, kSTBell1_2w, kSTBell2_2w, kSTMaid6_2w,
+ kSTMaid7_2w, kSTMaid8_2w, kSTCat1_2w, kSTCat2_2w, kSTCat3_2w,
+ kSTSridkey_2w, kSTSpen1_2w, kSTSpen2_2w, kSTSpen3_2w, kSTSdone1_2w,
+ kSTSdone2_2w, kSTSdone3_2w, kSTSdone4_2w, kSTSdone5_2w, kSTSdone6_2w,
+ kSTSdone7_2w, kSTOrgan1_2w, kSTOrgan2_2w, kSTOrgan3_2w, kSTOrgan4_2w,
+ kSTNod1_2w, kSTSay1_2w, kSTSay2_2w, kSTHest1_2w, kSTHest2_2w,
+ kSTHest3_2w, kSTHest4_2w, kSTHest5_2w, kSTHest6_2w, kSTHest7_2w,
+ kSTHest8_2w, kSTHest9_2w, kSTShest1_2w, kSTYes_2w, kSTFire1_2w,
+ kSTFire2_2w, kSTFire3_2w, kSTSrobot1_2w, kSTSrobot2_2w, kSTSrobot3_2w,
+ kSTSsonic1_2w, kSTSsonic2_2w, kSTSsonic3_2w, kSTSsonic4_2w, kSTLookpen_2w,
+ kSTMmmm_2w, kSTHeadache_2w, kSTSplant_2w, kSTSpicture_2w, kSTDull_2w,
+ kSTNo_on_2w, kSTSjump_2w, kSTTrywalk_2w, kSTNothing_2w, kSTNoidea_2w,
+ kSTNospecial_2w, kSTSsearch_2w, kSTNowayhose_2w, kSTNounder_2w, kSTLookover_2w,
+ kSTNouse_2w, kSTNosee_2w, kSTTmaiddoor_2w, kSTSclimb_2w, kSTStalk_2w,
+ kSTSattack_2w, kSTSbreak_2w, kSTQuiet_2w, kSTAroma_2w, kSTFalling_2w,
+ kSTShelp_2w, kSTSmagic_2w, kSTSdig_2w, kSTSrude_2w, kSTNoanswer_2w,
+ kSTWontopen_2w, kSTCantunlock_2w, kSTHi_2w, kSTNothanks_2w, kSTWelcome_2w,
+ kSTTmaid_2w, kSTChatmaid1_2w, kSTChatmaid2_2w, kSTChatmaid3_2w, kSTRudemaid_2w,
+ kSTSdoor_2w, kSTLookhall_2w, kSTS2bed_2w, kSTLookbed1_2w, kSTLookbed_2w,
+ kSTZzzz_2w, kSTS3phone_2w, kSTS3dumb_2w, kSTS3bird_2w, kSTLookbed2_2w,
+ kSTParrot_2w, kSTSbutton_2w, kSTSinto_2w, kSTLooklook_2w, kSTLookbed3_2w,
+ kSTS6garden_2w, kSTS6dull_2w, kSTLookkitchen_2w, kSTLookback_2w, kSTLookwin_2w,
+ kSTLookshed_2w, kSTLookatshed_2w, kSTS9tools1_2w, kSTS9tools2_2w, kSTLookinshed_2w,
+ kSTSomebuttons_2w, kSTMore_2w, kSTRudeshed_2w, kSTIgnore_2w, kSTShedclose_2w,
+ kSTLookvenus_2w, kSTLookFly_2w, kSTLookTrap_2w, kSTS11look_2w, kSTS12look_2w,
+ kSTS13look_2w, kSTS14look_2w, kSTS15look_2w, kSTS15wand1_2w, kSTS15wand2_2w,
+ kSTNoreply_2w, kSTS16look_2w, kSTNotclose_2w, kSTS17look_2w, kSTS17kill_2w,
+ kSTS18look_2w, kSTS19look_2w, kSTS20look_2w, kSTDonthaveone_2w, kSTS21look_2w,
+ kSTTooheavy_2w, kSTS22look_2w, kSTS23look_2w, kSTS24look_2w, kSTS25look_2w,
+ kSTS26look_2w, kSTS27look_2w, kSTS28look_2w, kSTS28hole_2w, kSTS28mouse_2w,
+ kSTSdroppings_2w, kSTS30look_2w, kSTS31look_2w, kSTS32look_2w, kSTS33look_2w,
+ kSTS35look_2w, kSTS36book_2w, kSTS36lookbook_2w, kSTLookhest_2w, kSTS37look_2w,
+ kSTS38look_2w, kSTDraught_2w, kSTLookboxdoor_2w, kSTDumbwaiter_2w, kSTThrowmatch_2w,
+ kSTGates1_2w, kSTGates2_2w, kSTGates3_2w, kSTDull2_2w, kSTWindwell_2w,
+ kSTIntowell_2w, kSTStrokedog_2w, kSTBudge_2w, kSTTalkgenie_2w, kSTS36table_2w,
+ kSTNotmirror_2w, kSTPleasego_2w, kSTComeHere_2w, kSTUnlocksafe_2w, kSTBalloon1_2w,
+ kSTBalloon2_2w, kSTBalloon3_2w, kSTLookblocks_2w, kSTSblock_2w, kSTLookplaypen_2w,
+ kSTStoobigtofit_2w, kSTReadpaper_2w, kSTSherring_2w, kSTTalkcook_2w, kSTLookcook_2w,
+ kSTLookknife_2w, kSTTakeknife_2w, kSTListenkitchen_2w, kSTNoswitch_2w, kSTSnojump_2w,
+ kSTNobanana_2w, kSTSundress_2w, kSTStired_2w, kSTSstrokecat_2w, kSTSplaycat_2w,
+ kSTStalkcat_2w, kSTSlookpost_2w, kSTSgivecat_2w, kSTSlookbox_2w, kSTSgetinbox_2w,
+ kSTLookchute_2w, kSTUpchute_2w, kSTPlayorgan_2w, kSTLookOrgan_2w, kSTTalkhester_2w,
+ kSTSeatbanana_2w, kSTBirdfull_2w, kSTBlotter_2w, kSTKeyhole2_2w, kSTKeyhole3_2w,
+ kSTGetonwithit_2w, kSTRubcatnip1_2w, kSTRubcatnip2_2w, kSTHearorgan_2w, kSTHearlaugh_2w,
+ kSTTryrope_2w, kSTSclue09a_2w, kSTSclue09b_2w, kSTSclue09c_2w, kSTSexplainb_2w,
+ kSTSgraf_2w, kSTDoorStuck_2w, kSTGarlicPrompt_2w, kSTGardInShed_2w, kSTGardShed_2w,
+ kSTLookBridge_2w, kSTSdialed_2w, kSTBananaPrompt_2w, kSTLookScrew_2w, kSTLookMirror_2w,
+ kSTLookPMaid_2w, kSTTalkPMaid_2w, kSTUsePencil_2w, kSTDoCrossword_2w
+};
+
+enum string_t_3w {
+//Hugo 3
+ kSTOkgen_3w, kSTNopurps_3w, kSTClick_3w, kSTNocarry_3w, kSTNonecarried_3w,
+ kSTGotit_3w, kSTEmpty1_3w, kSTMorespecific_3w, kSTLookpen_3w, kSTMmmm_3w,
+ kSTHeadache_3w, kSTSjump_3w, kSTTrywalk_3w, kSTSclimb_3w, kSTStalk_3w,
+ kSTSattack_3w, kSTSbreak_3w, kSTQuiet_3w, kSTAroma_3w, kSTFalling_3w,
+ kSTShelp_3w, kSTSmagic_3w, kSTSdig_3w, kSTSrude_3w, kSTNoanswer_3w,
+ kSTWontopen_3w, kSTCantunlock_3w, kSTHi_3w, kSTNothanks_3w, kSTNothing_3w,
+ kSTNoidea_3w, kSTNospecial_3w, kSTSsearch_3w, kSTSundress_3w, kSTStired_3w,
+ kSTNowayhose_3w, kSTNounder_3w, kSTLookover_3w, kSTNouse_3w, kSTNosee_3w,
+ kSTDull_3w, kSTNo_on_3w, kSTSnaughty_3w, kSTNotclose_3w, kSTLookcrash_3w,
+ kSTLookwfall_3w, kSTLookwfall_b_3w, kSTLookwbase_3w, kSTLookpath_ul_3w, kSTLookbridge1_3w,
+ kSTLookbridge2_3w, kSTLookweb_3w, kSTLookstream1_3w, kSTLookstream2_3w, kSTLookvillage_3w,
+ kSTLookhut_out_3w, kSTLookhut_in_3w, kSTLookgarden_3w, kSTLookclifftop_3w, kSTLookoldman_3w,
+ kSTLookcliff_3w, kSTLookcamp_3w, kSTLookturn_3w, kSTLookplane_3w, kSTLookslope_3w,
+ kSTLookpath2_1_3w, kSTLookpath2_2_3w, kSTLookcave1_3w, kSTLookcave2_3w, kSTBlk1_3w,
+ kSTBlk2_3w, kSTStep1_3w, kSTDropCheese_3w, kSTMouse1_3w, kSTProd1_3w,
+ kSTProd2_3w, kSTMousefree_3w, kSTScare1_3w, kSTSleepy_3w, kSTDarted_3w,
+ kSTScared_3w, kSTDammed_3w, kSTCom0_3w, kSTCom1_3w, kSTCom2_3w,
+ kSTCom3_3w, kSTCom4_3w, kSTCom5_3w, kSTCom6_3w, kSTCom7_3w,
+ kSTCom8_3w, kSTCom9_3w, kSTGiveb1_3w, kSTGiveb2_3w, kSTRefuse_3w,
+ kSTOldman0a_3w, kSTOldman0b_3w, kSTOldman1_3w, kSTOldman2_3w, kSTOldman3_3w,
+ kSTOldman4_3w, kSTOldman5_3w, kSTOldmantakeball_3w, kSTOldmannotake_3w, kSTWrong_3w,
+ kSTNoremedy_3w, kSTNofill_3w, kSTFillord_3w, kSTFillmagic_3w, kSTEmptyord_3w,
+ kSTEmptymagic_3w, kSTDrinkno_3w, kSTDrinkyes_3w, kSTYummy_3w, kSTCheesePrompt_3w,
+ kSTCanttake_3w, kSTMousegone_3w, kSTPutitdown_3w, kSTAsleep_3w, kSTElewaking_3w,
+ kSTWaterfalling_3w, kSTPenny1_3w, kSTPenny2_3w, kSTPenny3_3w, kSTPenny4_3w,
+ kSTPenny5_3w, kSTSpider1_3w, kSTSpider2_3w, kSTSpider3_3w, kSTHelp1_3w,
+ kSTMission1_3w, kSTMission2_3w, kSTMission3_3w, kSTMission4_3w, kSTMission5_3w,
+ kSTMission6_3w, kSTSaylook_3w, kSTYouarein_3w, kSTTalkweb_3w, kSTCantcross_3w,
+ kSTListenfall_3w, kSTToomuddy_3w, kSTLookdocbits_3w, kSTTakedocbits_3w, kSTLookspider_3w,
+ kSTTakespider_3w, kSTLooksnake_3w, kSTTakesnake_3w, kSTLookinhut_3w, kSTLookouthut_3w,
+ kSTTakeincage_3w, kSTLookhut_in2_3w, kSTLookshelfbits_3w, kSTTakeshelfbits_3w, kSTLookshelfbits2_3w,
+ kSTLookfire_3w, kSTCantlookin_3w, kSTLookinfire_3w, kSTTalkdoc_3w, kSTTalkdoc2_3w,
+ kSTTalkdoc3_3w, kSTLookorchid_3w, kSTTakeorchid_3w, kSTCrossgarden_3w, kSTLookpole_3w,
+ kSTLookhut_3w, kSTLookintohut_3w, kSTEatroast_3w, kSTLookrock_3w, kSTUnderrock_3w,
+ kSTOntorock_3w, kSTLookjungle_3w, kSTBehindhut_3w, kSTLookhyena_3w, kSTStickpin_3w,
+ kSTRefuseflask_3w, kSTNostickpin_3w, kSTMakeeffigy_3w, kSTNomake_3w, kSTLookinhole_3w,
+ kSTTalkmouse_3w, kSTPicklock_3w, kSTGivemouse_3w, kSTGetinpot_3w, kSTEnd1_3w,
+ kSTEnd2_3w, kSTEnd3_3w, kSTCantswim_3w, kSTGot1_3w, kSTGot2_3w,
+ kSTCantcatch_3w, kSTAdios1_3w, kSTAdios2_3w, kSTAdios3_3w, kSTRubcrystal_3w,
+ kSTRemedytip_3w, kSTOldmantip_3w, kSTMagictip_3w, kSTDammedtip_3w, kSTCubestip_3w,
+ kSTMousetip_3w, kSTSticktip_3w, kSTModeltip_3w, kSTPlanetip_3w, kSTSwingtip_3w,
+ kSTAttackghost_3w, kSTBook1_3w, kSTExor1_3w, kSTExor2_3w, kSTFoundbook_3w,
+ kSTNospell_3w, kSTExordone_3w, kSTCavewarn_3w, kSTThruwindow_3w, kSTRideelephant_3w,
+ kSTGetelephant_3w, kSTShowmouse_3w, kSTSwingbridge_3w, kSTGetbridgevines_3w, kSTNoblow_3w,
+ kSTIntofire_3w, kSTTakegirl_3w, kSTTakenative_3w, kSTMakeoffer_3w, kSTLookatweb_3w,
+ kSTTakepenny_3w, kSTTalkpenny_3w, kSTBridgedown_3w, kSTCantswing_3w, kSTTakeghost_3w,
+ kSTAllwrong_3w, kSTTiedvine_3w, kSTUntievine_3w, kSTNottied_3w, kSTMissed_3w,
+ kSTStuckpin_3w, kSTTakedoctor0_3w, kSTTakedoctor1_3w, kSTVillagething_3w, kSTTakething_3w,
+ kSTBridgeprompt_3w, kSTNotip_3w, kSTBridgetip_3w, kSTLookele2_3w, kSTNostick_3w,
+ kSTNoclay_3w, kSTLookwfall1_3w, kSTLookwfall2_3w, kSTOpenplanedoor_3w, kSTYesResponse_3w,
+ kSTNoResponse_3w, kSTCagePrompt_3w, kSTDartElephant_3w
+};
+
+enum string_t_1d {
+//***************************************************************************
+// Hugo 1 Dos - Not stored in a dat file!!!
+//***************************************************************************
+ kSTsnosee_1d, kSTokgen_1d, kSTspbreak_1d, kSTsseepk_1d, kSTsseedw_1d,
+ kSTsseepkdw_1d, kSTsthrown_1d, kSTsdefbat1_1d, kSTsdefbat2_1d, kSTsbut1_1d,
+ kSTsbut2_1d, kSTsopenp_1d, kSTsopenr_1d, kSTshelpp1_1d, kSTshelpp2_1d,
+ kSTsq1_1d, kSTsq2_1d, kSTsq3_1d, kSTsq4_1d, kSTsq5_1d,
+ kSTsq6_1d, kSTsq7_1d, kSTsrep1_1d, kSTsrep2_1d, kSTsrep3_1d,
+ kSTsrep4_1d, kSTsrep5_1d, kSTsrep6_1d, kSTtrywalk_1d, kSTnothing_1d,
+ kSTnopurps_1d, kSTnoidea_1d, kSTdull_1d, kSTempty_1d, kSTchop1_1d,
+ kSTnowayhose_1d, kSTnounder_1d, kSTnojump_1d, kSTnoclimb_1d, kSTnotalk_1d,
+ kSTnoattack_1d, kSTnobreak_1d, kSTnolisten_1d, kSTnosmell_1d, kSTnolook_1d,
+ kSTnohelp_1d, kSTlooks0tree_1d, kSTlooks0fence_1d, kSTlooks0house_1d, kSTlooks0window_1d,
+ kSTlooks0moon_1d, kSTeats0pkin_1d, kSTunders0carpet_1d, kSTlooks0_1d, kSTlooks1bat_1d,
+ kSTlooks1picture_1d, kSTlooks1table_1d, kSTlooks1stairs_1d, kSTlooks1light_1d, kSTlooks1_1d,
+ kSTlistens1_1d, kSTlooks2bed_1d, kSTrides2bed_1d, kSTlooks2ward_1d, kSTlooks2cupb_1d,
+ kSTlooks2window_1d, kSTlooks2face_1d, kSTlooks2_1d, kSTlooks3table_1d, kSTlooks3butler_1d,
+ kSTlooks3plant_1d, kSTlooks3witch_1d, kSTlooks3window_1d, kSTlooks3food_1d, kSTlooks3man_1d,
+ kSTlooks3woman_1d, kSTlooks3_1d, kSTsits3_1d, kSTtakes3food_1d, kSTtalks3man_1d,
+ kSTtalks3woman_1d, kSTtalkS3butler_1d, kSTkisss3_1d, kSTlistens3_1d, kSTdrinks3_1d,
+ kSTlooks4mirror_1d, kSTlooks4toilet_1d, kSTlooks4_1d, kSTcraps4_1d, kSTsits4_1d,
+ kSTwashs4hands_1d, kSTlooks5units_1d, kSTlooks5window_1d, kSTlooks5broom_1d, kSTtakes5broom_1d,
+ kSTrides5broom_1d, kSTlooks5_1d, kSTsweeps5_1d, kSTlooks6sched_1d, kSTclimbs6tree_1d,
+ kSTlooks6gardenbits_1d, kSTlooks6_1d, kSTunbolts7trap_1d, kSTlooks7mousehole_1d, kSTtakes7droppings_1d,
+ kSTlooks7_1d, kSTlooks8door_1d, kSToils8door_1d, kSTpushs8door_1d, kSTlooks8rock_1d,
+ kSTbreaks8door_1d, kSTopens8door_1d, kSTunlocks8door_1d, kSTknocks8door_1d, kSTtalks8penelope_1d,
+ kSTlistens8_1d, kSTlooks8_1d, kSTlooks9_1d, kSTlooks9rock_1d, kSTlooks10_1d,
+ kSTlooks10tomb_1d, kSTlooks11_1d, kSTlakeverbss11_1d, kSTplugs11_1d, kSTlooks12_1d,
+ kSTtalks12guard_1d, kSTlooks15_1d, kSTtalks15igor_1d, kSTtalks15prof_1d, kSTlooks15machinebits_1d,
+ kSTpushs15machinebits_1d, kSTlooks15table_1d, kSTopens15door_1d, kSTlooks15light_1d, kSTsadwwhy_1d,
+ kSTsablowt_1d, kSTsanought_1d, kSTsa115e_1d, kSTsabut6a_1d, kSTsabut6b_1d,
+ kSTsabut6c_1d, kSTsabut9a_1d, kSTsabut9b_1d, kSTsabut11_1d, kSTsaeatchop_1d,
+ kSTsachopthrown_1d, kSTsanoopen_1d, kSTsaopen4_1d, kSTsadoggy4_1d, kSTsat78a_1d,
+ kSTsaopenfail_1d, kSTsahelps1_1d, kSTsanohelp_1d, kSTsahelps2_1d, kSTsabat5a_1d,
+ kSTsabat5b_1d, kSTsamum4_1d, kSTsabung1_1d, kSTsanodeboat_1d, kSTsamoving_1d,
+ kSTsanotcut_1d, kSTsarepyep_1d, kSTsarepnop_1d, kSTsamans1_1d, kSTsarepno5_1d,
+ kSTsarepyep2_1d, kSTsamans3_1d, kSTsamans4_1d, kSTsamans5_1d, kSTsamans6_1d,
+ kSTsamans7_1d, kSTsajails1_1d, kSTsajails2_1d, kSTsajails3_1d, kSTsajails4_1d,
+ kSTsagive1_1d, kSTsagive2_1d, kSTsanogive_1d, kSTsabye1_1d, kSTsadmsg3_1d,
+ kSTsadmsg2_1d, kSTsadmsg1_1d, kSTsalab12_1d, kSTsalab13_1d, kSTsabox2_1d,
+ kSTsabox3_1d, kSTsabox5_1d, kSTsabox6_1d, kSTsainorm_1d, kSTsaigor32_1d,
+ kSTsaigor22_1d, kSTsaigor13_1d, kSTsaigor0_1d, kSTsagobox_1d, kSTsknock_1d,
+ kSTnomagic_1d, kSTnodig_1d, kSTnorude_1d, kSTnoknock_1d
+};
+
+enum string_t_2d {
+//Hugo 2 DOS
+ kSTOkgen_2d, kSTNopurps_2d, kSTClick_2d, kSTNocarry_2d, kSTEmpty_2d,
+ kSTMorespecific_2d, kSTStory_2d, kSTStory1_2d, kSTSmaid1_1_2d, kSTSmaid1_2_2d,
+ kSTSmaid1_3_2d, kSTSmaid1_4_2d, kSTSmaid1_5_2d, kSTSmaid1_6_2d, kSTSmaid1_7_2d,
+ kSTSmaid1_8_2d, kSTSmaid1_9_2d, kSTSmaid1_10_2d, kSTSfirst_2d, kSTTired_2d,
+ kSTTired2_2d, kSTSfaint1_2d, kSTSfaint2_2d, kSTSfaint3_2d, kSTSfaint4_2d,
+ kSTFirst2_2d, kSTSgone1_2d, kSTSgone2_2d, kSTSgone3_2d, kSTSgone4_2d,
+ kSTSgone5_2d, kSTSgone6_2d, kSTSgone7_2d, kSTHole1_2d, kSTLock1_2d,
+ kSTDumb1_2d, kSTDumb2_2d, kSTMatch1_2d, kSTMatch2_2d, kSTMatch3_2d,
+ kSTArgue1_2d, kSTCook1_2d, kSTCook2_2d, kSTCook3_2d, kSTCook4_2d,
+ kSTCook5_2d, kSTSgard1_2d, kSTSgard2_2d, kSTSgard3_2d, kSTSgard4_2d,
+ kSTSgard5_2d, kSTSgard6_2d, kSTSgarl1_2d, kSTSgarl2_2d, kSTPush1_2d,
+ kSTRumble_2d, kSTSwarn_2d, kSTStung_2d, kSTMatch4_2d, kSTSwarnz_2d,
+ kSTStingeroo_2d, kSTSbug5b_2d, kSTSom1_2d, kSTSom2_2d, kSTSom3_2d,
+ kSTSom3a_2d, kSTSom4_2d, kSTSom5_2d, kSTSom6_2d, kSTSom7_2d,
+ kSTSom8_2d, kSTWell1_2d, kSTSnake1_2d, kSTSnake2_2d, kSTSnake3_2d,
+ kSTSnake4_2d, kSTSnake5_2d, kSTSserum1_2d, kSTSserum2_2d, kSTSdial1_2d,
+ kSTSdial2_2d, kSTSafepr_2d, kSTCall1_2d, kSTCall2_2d, kSTCall3_2d,
+ kSTCall4_2d, kSTCall5_2d, kSTCall6_2d, kSTTard1_2d, kSTTard2_2d,
+ kSTBrrr_2d, kSTWeee_2d, kSTDyn1_2d, kSTDyn2_2d, kSTDyn3_2d,
+ kSTDyn4_2d, kSTDyn5_2d, kSTDyn6_2d, kSTDyn7_2d, kSTDyn8_2d,
+ kSTDyn9_2d, kSTRub1_2d, kSTRub2_2d, kSTChasm1_2d, kSTBanana1_2d,
+ kSTBanana2_2d, kSTTrap1_2d, kSTSsafe1_2d, kSTScomb1_2d, kSTScomb2_2d,
+ kSTSwill1_2d, kSTSwill2_2d, kSTSwill3_2d, kSTSwill4_2d, kSTSclimax1_2d,
+ kSTSclimax2_2d, kSTSclimax3_2d, kSTSclimax4_2d, kSTSclimax5_2d, kSTSclimax6_2d,
+ kSTSclimax7_2d, kSTNobody_2d, kSTNo_one1_2d, kSTNo_one2_2d, kSTSharry_2d,
+ kSTScheat1_2d, kSTScheat2_2d, kSTSdidnt1_2d, kSTSdidnt2_2d, kSTSphoto_2d,
+ kSTSphoto1_2d, kSTBlah_2d, kSTMaid1_2d, kSTMaid2_2d, kSTMaid3_2d,
+ kSTMaid4_2d, kSTMaid5_2d, kSTBell1_2d, kSTBell2_2d, kSTMaid6_2d,
+ kSTMaid7_2d, kSTMaid8_2d, kSTCat1_2d, kSTCat2_2d, kSTCat3_2d,
+ kSTSridkey_2d, kSTSpen1_2d, kSTSpen2_2d, kSTSpen3_2d, kSTSdone1_2d,
+ kSTSdone2_2d, kSTSdone3_2d, kSTSdone4_2d, kSTSdone5_2d, kSTSdone6_2d,
+ kSTOrgan1_2d, kSTOrgan2_2d, kSTOrgan3_2d, kSTOrgan4_2d, kSTNod1_2d,
+ kSTSay1_2d, kSTSay2_2d, kSTHest1_2d, kSTHest2_2d, kSTHest3_2d,
+ kSTHest4_2d, kSTHest5_2d, kSTHest6_2d, kSTHest7_2d, kSTHest8_2d,
+ kSTHest9_2d, kSTShest1_2d, kSTYes_2d, kSTFire1_2d, kSTFire2_2d,
+ kSTFire3_2d, kSTSdalek1_2d, kSTSdalek2_2d, kSTSdalek3_2d, kSTSsonic1_2d,
+ kSTSsonic2_2d, kSTSsonic3_2d, kSTSsonic4_2d, kSTLookpen_2d, kSTMmmm_2d,
+ kSTHeadache_2d, kSTSplant_2d, kSTSpicture_2d, kSTDull_2d, kSTNo_on_2d,
+ kSTSjump_2d, kSTTrywalk_2d, kSTNothing_2d, kSTNoidea_2d, kSTNospecial_2d,
+ kSTSsearch_2d, kSTNowayhose_2d, kSTNounder_2d, kSTLookover_2d, kSTNouse_2d,
+ kSTNosee_2d, kSTTmaiddoor_2d, kSTSclimb_2d, kSTStalk_2d, kSTSattack_2d,
+ kSTSbreak_2d, kSTQuiet_2d, kSTAroma_2d, kSTFalling_2d, kSTShelp_2d,
+ kSTSmagic_2d, kSTSdig_2d, kSTSrude_2d, kSTNoanswer_2d, kSTWontopen_2d,
+ kSTCantunlock_2d, kSTHi_2d, kSTNothanks_2d, kSTWelcome_2d, kSTTmaid_2d,
+ kSTChatmaid1_2d, kSTChatmaid2_2d, kSTChatmaid3_2d, kSTRudemaid_2d, kSTSdoor_2d,
+ kSTLookhall_2d, kSTS2bed_2d, kSTLookbed1_2d, kSTLookbed_2d, kSTZzzz_2d,
+ kSTS3phone_2d, kSTS3dumb_2d, kSTS3bird_2d, kSTLookbed2_2d, kSTParrot_2d,
+ kSTSbutton_2d, kSTSinto_2d, kSTLooklook_2d, kSTLookbed3_2d, kSTS6garden_2d,
+ kSTS6dull_2d, kSTLookkitchen_2d, kSTLookback_2d, kSTLookwin_2d, kSTLookshed_2d,
+ kSTLookatshed_2d, kSTS9tools1_2d, kSTS9tools2_2d, kSTLookinshed_2d, kSTSomebuttons_2d,
+ kSTMore_2d, kSTRudeshed_2d, kSTIgnore_2d, kSTShedclose_2d, kSTLookvenus_2d,
+ kSTS11look_2d, kSTS12look_2d, kSTS13look_2d, kSTS14look_2d, kSTS15look_2d,
+ kSTS15wand1_2d, kSTS15wand2_2d, kSTNoreply_2d, kSTS16look_2d, kSTNotclose_2d,
+ kSTS17look_2d, kSTS17kill_2d, kSTS18look_2d, kSTS19look_2d, kSTS20look_2d,
+ kSTDonthaveone_2d, kSTS21look_2d, kSTTooheavy_2d, kSTS22look_2d, kSTS23look_2d,
+ kSTS24look_2d, kSTS25look_2d, kSTS26look_2d, kSTS27look_2d, kSTS28look_2d,
+ kSTS28hole_2d, kSTS28mouse_2d, kSTSdroppings_2d, kSTS30look_2d, kSTS31look_2d,
+ kSTS32look_2d, kSTS33look_2d, kSTS35look_2d, kSTS36book_2d, kSTLookhest_2d,
+ kSTS37look_2d, kSTS38look_2d, kSTDraught_2d, kSTLookboxdoor_2d, kSTDumbwaiter_2d,
+ kSTThrowmatch_2d, kSTGates1_2d, kSTGates2_2d, kSTGates3_2d, kSTDull2_2d,
+ kSTWindwell_2d, kSTIntowell_2d, kSTStrokedog_2d, kSTBudge_2d, kSTTalkgenie_2d,
+ kSTS36table_2d, kSTNotmirror_2d, kSTPleasego_2d, kSTUnlocksafe_2d, kSTBalloon1_2d,
+ kSTBalloon2_2d, kSTBalloon3_2d, kSTSblock_2d, kSTStoobigtofit_2d, kSTReadpaper_2d,
+ kSTSherring_2d, kSTTalkcook_2d, kSTLookcook_2d, kSTLookknife_2d, kSTTakeknife_2d,
+ kSTListenkitchen_2d, kSTNoswitch_2d, kSTSnojump_2d, kSTNobanana_2d, kSTSundress_2d,
+ kSTStired_2d, kSTSstrokecat_2d, kSTSplaycat_2d, kSTStalkcat_2d, kSTSlookpost_2d,
+ kSTSgivecat_2d, kSTSlookbox_2d, kSTSgetinbox_2d, kSTLookchute_2d, kSTUpchute_2d,
+ kSTPlayorgan_2d, kSTTalkhester_2d, kSTSeatbanana_2d, kSTBirdfull_2d, kSTBlotter_2d,
+ kSTGetonwithit_2d, kSTRubcatnip1_2d, kSTRubcatnip2_2d, kSTHearorgan_2d, kSTHearlaugh_2d,
+ kSTTryrope_2d, kSTSclue09a_2d, kSTSclue09b_2d, kSTSclue09c_2d, kSTSexplainb_2d,
+ kSTSgraf_2d
+};
+
+enum string_t_3d {
+//Hugo 3 DOS
+ kSTOkgen_3d, kSTNopurps_3d, kSTClick_3d, kSTNocarry_3d, kSTNonecarried_3d,
+ kSTGotit_3d, kSTEmpty1_3d, kSTMorespecific_3d, kSTLookpen_3d, kSTMmmm_3d,
+ kSTHeadache_3d, kSTSjump_3d, kSTTrywalk_3d, kSTSclimb_3d, kSTStalk_3d,
+ kSTSattack_3d, kSTSbreak_3d, kSTQuiet_3d, kSTAroma_3d, kSTFalling_3d,
+ kSTShelp_3d, kSTSmagic_3d, kSTSdig_3d, kSTSrude_3d, kSTNoanswer_3d,
+ kSTWontopen_3d, kSTCantunlock_3d, kSTHi_3d, kSTNothanks_3d, kSTNothing_3d,
+ kSTNoidea_3d, kSTNospecial_3d, kSTSsearch_3d, kSTSundress_3d, kSTStired_3d,
+ kSTNowayhose_3d, kSTNounder_3d, kSTLookover_3d, kSTNouse_3d, kSTNosee_3d,
+ kSTDull_3d, kSTNo_on_3d, kSTSnaughty_3d, kSTNotclose_3d, kSTLookcrash_3d,
+ kSTLookwfall_3d, kSTLookwfall_b_3d, kSTLookwbase_3d, kSTLookpath_ul_3d, kSTLookbridge1_3d,
+ kSTLookbridge2_3d, kSTLookweb_3d, kSTLookstream1_3d, kSTLookstream2_3d, kSTLookvillage_3d,
+ kSTLookhut_out_3d, kSTLookhut_in_3d, kSTLookgarden_3d, kSTLookclifftop_3d, kSTLookoldman_3d,
+ kSTLookcliff_3d, kSTLookcamp_3d, kSTLookturn_3d, kSTLookplane_3d, kSTLookslope_3d,
+ kSTLookpath2_1_3d, kSTLookpath2_2_3d, kSTLookcave1_3d, kSTLookcave2_3d, kSTBlk1_3d,
+ kSTBlk2_3d, kSTStep1_3d, kSTMouse1_3d, kSTProd1_3d, kSTProd2_3d,
+ kSTMousefree_3d, kSTScare1_3d, kSTSleepy_3d, kSTDarted_3d, kSTScared_3d,
+ kSTDammed_3d, kSTCom0_3d, kSTCom1_3d, kSTCom2_3d, kSTCom3_3d,
+ kSTCom4_3d, kSTCom5_3d, kSTCom6_3d, kSTCom7_3d, kSTCom8_3d,
+ kSTCom9_3d, kSTGiveb1_3d, kSTGiveb2_3d, kSTRefuse_3d, kSTOldrsp1_3d,
+ kSTOldman0a_3d, kSTOldman0b_3d, kSTOldman1_3d, kSTOldman2_3d, kSTOldman3_3d,
+ kSTOldman4_3d, kSTOldman5_3d, kSTOldmantakeball_3d, kSTOldmannotake_3d, kSTWrong_3d,
+ kSTNoremedy_3d, kSTNofill_3d, kSTFillord_3d, kSTFillmagic_3d, kSTEmptyord_3d,
+ kSTEmptymagic_3d, kSTDrinkno_3d, kSTDrinkyes_3d, kSTYummy_3d, kSTCanttake_3d,
+ kSTMousegone_3d, kSTPutitdown_3d, kSTAsleep_3d, kSTElewaking_3d, kSTWaterfalling_3d,
+ kSTPenny1_3d, kSTPenny2_3d, kSTPenny3_3d, kSTPenny4_3d, kSTPenny5_3d,
+ kSTSpider1_3d, kSTSpider2_3d, kSTSpider3_3d, kSTHelp1_3d, kSTMission1_3d,
+ kSTMission2_3d, kSTMission3_3d, kSTMission4_3d, kSTMission5_3d, kSTMission6_3d,
+ kSTSaylook_3d, kSTYouarein_3d, kSTTalkweb_3d, kSTCantcross_3d, kSTListenfall_3d,
+ kSTToomuddy_3d, kSTLookdocbits_3d, kSTTakedocbits_3d, kSTLookspider_3d, kSTTakespider_3d,
+ kSTLooksnake_3d, kSTTakesnake_3d, kSTLookinhut_3d, kSTLookouthut_3d, kSTTakeincage_3d,
+ kSTLookhut_in2_3d, kSTLookshelfbits_3d, kSTTakeshelfbits_3d, kSTLookshelfbits2_3d, kSTLookfire_3d,
+ kSTCantlookin_3d, kSTLookinfire_3d, kSTTalkdoc_3d, kSTTalkdoc2_3d, kSTLookorchid_3d,
+ kSTTakeorchid_3d, kSTCrossgarden_3d, kSTLookpole_3d, kSTLookhut_3d, kSTLookintohut_3d,
+ kSTEatroast_3d, kSTLookrock_3d, kSTUnderrock_3d, kSTOntorock_3d, kSTLookjungle_3d,
+ kSTBehindhut_3d, kSTLookhyena_3d, kSTStickpin_3d, kSTRefuseflask_3d, kSTNostickpin_3d,
+ kSTMakeeffigy_3d, kSTNomake_3d, kSTLookinhole_3d, kSTTalkmouse_3d, kSTPicklock_3d,
+ kSTGivemouse_3d, kSTGetinpot_3d, kSTEnd1_3d, kSTEnd2_3d, kSTEnd3_3d,
+ kSTCantswim_3d, kSTGot1_3d, kSTGot2_3d, kSTCantcatch_3d, kSTAdios1_3d,
+ kSTAdios2_3d, kSTRubcrystal_3d, kSTRemedytip_3d, kSTOldmantip_3d, kSTMagictip_3d,
+ kSTDammedtip_3d, kSTCubestip_3d, kSTMousetip_3d, kSTSticktip_3d, kSTModeltip_3d,
+ kSTPlanetip_3d, kSTSwingtip_3d, kSTAttackghost_3d, kSTBook1_3d, kSTExor1_3d,
+ kSTExor2_3d, kSTFoundbook_3d, kSTNospell_3d, kSTExordone_3d, kSTCavewarn_3d,
+ kSTThruwindow_3d, kSTRideelephant_3d, kSTGetelephant_3d, kSTShowmouse_3d, kSTSwingbridge_3d,
+ kSTGetbridgevines_3d, kSTNoblow_3d, kSTIntofire_3d, kSTTakegirl_3d, kSTTakenative_3d,
+ kSTMakeoffer_3d, kSTLookatweb_3d, kSTTakepenny_3d, kSTTalkpenny_3d, kSTBridgedown_3d,
+ kSTCantswing_3d, kSTTakeghost_3d, kSTAllwrong_3d, kSTTiedvine_3d, kSTUntievine_3d,
+ kSTNottied_3d, kSTMissed_3d, kSTStuckpin_3d, kSTTakedoctor0_3d, kSTTakedoctor1_3d,
+ kSTVillagething_3d, kSTTakething_3d, kSTBridgeprompt_3d, kSTTiprsp_3d, kSTNotip_3d,
+ kSTBridgetip_3d, kSTLookele2_3d, kSTNostick_3d, kSTNoclay_3d, kSTLookwfall1_3d,
+ kSTLookwfall2_3d, kSTOpenplanedoor_3d
+};
+
+enum seqReqList_1w {
+//***************************************************************************
+// Hugo 1 Windows
+//***************************************************************************
+ kRDummy = 0,
+ kRkey_1w = 1, kRpkin_1w, kRcandle_1w, kRmask_1w, kRoil_1w,
+ kRknife_1w, kRbung_1w
+};
+
+enum seqReqList_2w {
+//***************************************************************************
+// Hugo 2 Windows
+//***************************************************************************
+ kRgarlic_2w = 1, kRmatch_2w, kRstick_2w, kRdyn_2w, kRlamp_2w,
+ kRbanana_2w, kRbell_2w, kRcatnip_2w, kRgun_2w, kRpaper_2w,
+ kRpencil_2w, kRmagnify_2w, kRwill_2w, kRserum_2w
+};
+
+enum seqReqList_3w {
+//***************************************************************************
+// Hugo 3 Windows
+//***************************************************************************
+ kRpins_3w = 1, kRcheese_3w, kRcrystal_3w, kRexor_3w, kRbook_3w,
+ kRbell_3w, kRpipe_3w
+};
+
+enum seqReqList_1d {
+//***************************************************************************
+// Hugo 1 DOS
+//***************************************************************************
+ kRkey_1d = 1, kRpkin_1d, kRcandle_1d, kRmask_1d, kRoil_1d,
+ kRknife_1d, kRbung_1d
+};
+
+enum seqReqList_2d {
+//***************************************************************************
+// Hugo 2 DOS
+//***************************************************************************
+ kRgarlic_2d = 1, kRmatch_2d, kRstick_2d, kRdyn_2d, kRlamp_2d,
+ kRbanana_2d, kRbell_2d, kRcatnip_2d, kRgun_2d, kRpaper_2d,
+ kRpencil_2d, kRmagnify_2d, kRwill_2d, kRserum_2d
+};
+
+enum seqReqList_3d {
+//***************************************************************************
+// Hugo 3 DOS
+//***************************************************************************
+ kRpins_3d = 1, kRcheese_3d, kRcrystal_3d, kRexor_3d, kRbook_3d,
+ kRbell_3d
+};
+
+enum cmdIdx_1w {
+ kCMDDummy, kCMDboat_1w, kCMDbolt_1w, kCMDbung_1w, kCMDcarpet_1w,
+ kCMDchop_1w, kCMDcupb_1w, kCMDdoor1_1w, kCMDdoor2_1w, kCMDdoor3_1w,
+ kCMDdoor4_1w, kCMDdrac_1w, kCMDfrank_1w, kCMDgold_1w, kCMDgwen_1w,
+ kCMDhood_1w, kCMDigor_1w, kCMDknife_1w, kCMDmask_1w, kCMDoilcan_1w,
+ kCMDoldman_1w, kCMDpeahd_1w, kCMDpkin_1w, kCMDrock_1w, kCMDrope_1w,
+ kCMDshed_1w, kCMDslime_1w, kCMDtrap_1w, kCMDward_1w, kCMDwhistle_1w
+};
+
+enum cmdIdx_2w {
+ kCMDalbum_2w = 1, kCMDballoon_2w, kCMDbanana_2w, kCMDbell_2w, kCMDblue_2w,
+ kCMDbook_2w, kCMDbottle_2w, kCMDbutton_2w, kCMDcatnip_2w, kCMDcupbp_2w,
+ kCMDdoor1_2w, kCMDdoor2_2w, kCMDdoor3_2w, kCMDdoordum_2w, kCMDdumb_2w,
+ kCMDdynamite_2w, kCMDgarlic_2w, kCMDgreen_2w, kCMDgun_2w, kCMDharry_2w,
+ kCMDkdoor_2w, kCMDkennel_2w, kCMDkeyhole_2w, kCMDlamp_2w, kCMDletter_2w,
+ kCMDlookcupb_2w, kCMDlookdesk_2w, kCMDlookgard_2w, kCMDmatches_2w, kCMDpaper_2w,
+ kCMDpdoor_2w, kCMDpencil_2w, kCMDred_2w, kCMDrobot_2w, kCMDrope_2w,
+ kCMDsafe_2w, kCMDstick_2w, kCMDtardis_2w, kCMDwell_2w, kCMDwill_2w,
+ kCMDyellow_2w
+};
+
+enum cmdIdx_3w {
+ kCMDcbell_3w = 1, kCMDcbook_3w, kCMDcbouillon_3w, kCMDccage_3w, kCMDccandle_3w,
+ kCMDccheese_3w, kCMDcclay_3w, kCMDccrystal_3w, kCMDcdart_3w, kCMDcdoctor_3w,
+ kCMDcdoor_3w, kCMDcelephant_3w, kCMDcexit_3w, kCMDcflask_3w, kCMDcghost_3w,
+ kCMDcnative_3w, kCMDcpins_3w, kCMDcplane_3w, kCMDcrock_3w, kCMDcrush_3w,
+ kCMDcscroll_3w, kCMDcsteps_3w, kCMDcswing_3w, kCMDcswingc_3w, kCMDcvine_3w,
+ kCMDcwfall_3w, kCMDcwpool_3w, kCMDcwstream_3w
+};
+
+enum cmdIdx_1d {
+ kCMDboat_1d = 1, kCMDbolt_1d, kCMDbung_1d, kCMDcarpet_1d, kCMDchop_1d,
+ kCMDcupb_1d, kCMDdoor1_1d, kCMDdoor2_1d, kCMDdoor3_1d, kCMDdoor4_1d,
+ kCMDgold_1d, kCMDigor_1d, kCMDknife_1d, kCMDmask_1d, kCMDoilcan_1d,
+ kCMDoldman_1d, kCMDpkin_1d, kCMDrope_1d, kCMDshed_1d, kCMDtrap_1d,
+ kCMDward_1d, kCMDwhistle_1d
+};
+
+enum cmdIdx_2d {
+ kCMDballoon_2d = 1, kCMDbanana_2d, kCMDbell_2d, kCMDblue_2d, kCMDbook_2d,
+ kCMDbottle_2d, kCMDbutton_2d, kCMDcatnip_2d, kCMDcupbp_2d, kCMDdoor1_2d,
+ kCMDdoor2_2d, kCMDdoor3_2d, kCMDdumb_2d, kCMDdynamite_2d, kCMDgarlic_2d,
+ kCMDgreen_2d, kCMDgun_2d, kCMDharry_2d, kCMDkdoor_2d, kCMDkennel_2d,
+ kCMDkeyhole_2d, kCMDlamp_2d, kCMDletter_2d, kCMDlookcupb_2d, kCMDlookdesk_2d,
+ kCMDmatches_2d, kCMDpaper_2d, kCMDpdoor_2d, kCMDpencil_2d, kCMDred_2d,
+ kCMDrope_2d, kCMDsafe_2d, kCMDstick_2d, kCMDtardis_2d, kCMDwell_2d,
+ kCMDwill_2d, kCMDyellow_2d
+};
+
+enum cmdIdx_3d {
+ kCMDcbell_3d = 1, kCMDcbook_3d, kCMDcbouillon_3d, kCMDccage_3d, kCMDccandle_3d,
+ kCMDccheese_3d, kCMDcclay_3d, kCMDccrystal_3d, kCMDcdart_3d, kCMDcdoor_3d,
+ kCMDcexit_3d, kCMDcflask_3d, kCMDcghost_3d, kCMDcnative_3d, kCMDcpins_3d,
+ kCMDcplane_3d, kCMDcrock_3d, kCMDcscroll_3d, kCMDcswing_3d, kCMDcswingc_3d,
+ kCMDcvine_3d, kCMDcwfall_3d, kCMDcwpool_3d, kCMDcwstream_3d
+};
+// Enumerate the different path types for an object
+enum path_t {
+ USER, // User has control of object via cursor keys
+ AUTO, // Computer has control, controlled by action lists
+ QUIET, // Computer has control and no commands allowed
+ CHASE, // Computer has control, object is chasing hero
+ CHASE2, // Same as CHASE, except keeps cycling when stationary
+ WANDER, // Computer has control, object is wandering randomly
+ WANDER2 // Same as WANDER, except keeps cycling when stationary
+};
+
+#define PERSON 4, NULL, {{4, NULL}, {4, NULL}, {2, NULL}, {2, NULL}}
+#define PERSON2 2, NULL, {{4, NULL}, {4, NULL}}
+#define PERSON3 3, NULL, {{4, NULL}, {4, NULL}, {1, NULL}}
+#define PERSON4 4, NULL, {{4, NULL}, {4, NULL}, {1, NULL}, {1, NULL}}
+#define PERSON5 3, NULL, {{4, NULL}, {4, NULL}, {4, NULL}}
+#define ANIMAL 4, NULL, {{3, NULL}, {3, NULL}, {1, NULL}, {1, NULL}}
+#define THING0 0, NULL, {{0, NULL}}
+#define THING1 1, NULL, {{1, NULL}}
+#define THING2 1, NULL, {{2, NULL}}
+#define THING3 1, NULL, {{3, NULL}}
+#define THING4 1, NULL, {{4, NULL}}
+#define THING2a 2, NULL, {{1, NULL}, {2, NULL}}
+#define THING2b 2, NULL, {{2, NULL}, {2, NULL}}
+#define THING2c 2, NULL, {{1, NULL}, {1, NULL}}
+#define THING2d 2, NULL, {{1, NULL}, {4, NULL}}
+#define THING2e 2, NULL, {{5, NULL}, {1, NULL}}
+#define THING2f 2, NULL, {{2, NULL}, {3, NULL}}
+#define THING2g 2, NULL, {{3, NULL}, {4, NULL}}
+#define GO_OBJ -1
+
+enum cycle_t {INVISIBLE, ALMOST_INVISIBLE, NOT_CYCLING, CYCLE_FORWARD, CYCLE_BACKWARD};
+// Piorities
+enum {FOREGROUND, BACKGROUND, FLOATING, OVEROVL};
+
+#define DX 5 // Num pixels moved in x by HERO per step
+#define DY 4 // Num pixels moved in y by HERO per step
+
+// Following defines the action types and action list
+enum action_t { // Parameters:
+ ANULL = 0xff, // Special NOP used to 'delete' events in DEL_EVENTS
+ ASCHEDULE = 0, // 0 - Ptr to action list to be rescheduled
+ START_OBJ = 1, // 1 - Object number
+ INIT_OBJXY = 2, // 2 - Object number, x,y
+ PROMPT = 3, // 3 - index of prompt & response string, ptrs to action
+ // lists. First if response matches, 2nd if not.
+ BKGD_COLOR = 4, // 4 - new background color
+ INIT_OBJVXY = 5, // 5 - Object number, vx, vy
+ INIT_CARRY = 6, // 6 - Object number, carried status
+ INIT_HF_COORD = 7, // 7 - Object number (gets hero's 'feet' coordinates)
+ NEW_SCREEN = 8, // 8 - New screen number
+ INIT_OBJSTATE = 9, // 9 - Object number, new object state
+ INIT_PATH = 10, // 10 - Object number, new path type
+ COND_R = 11, // 11 - Conditional on object state - req state, 2 act_lists
+ TEXT = 12, // 12 - Simple text box
+ SWAP_IMAGES = 13, // 13 - Swap 2 object images
+ COND_SCR = 14, // 14 - Conditional on current screen
+ AUTOPILOT = 15, // 15 - Set object to home in on another (stationary) object
+ INIT_OBJ_SEQ = 16, // 16 - Object number, sequence index to set curr_seq_p to
+ SET_STATE_BITS = 17, // 17 - Objnum, mask to OR with obj states word
+ CLEAR_STATE_BITS = 18, // 18 - Objnum, mask to ~AND with obj states word
+ TEST_STATE_BITS = 19, // 19 - Objnum, mask to test obj states word
+ DEL_EVENTS = 20, // 20 - Action type to delete all occurrences of
+ GAMEOVER = 21, // 21 - Disable hero & commands. Game is over
+ INIT_HH_COORD = 22, // 22 - Object number (gets hero's actual coordinates)
+ EXIT = 23, // 23 - Exit game back to DOS
+ BONUS = 24, // 24 - Get score bonus for an action
+ COND_BOX = 25, // 25 - Conditional on object within bounding box
+ SOUND = 26, // 26 - Set currently playing sound
+ ADD_SCORE = 27, // 27 - Add object's value to current score
+ SUB_SCORE = 28, // 28 - Subtract object's value from current score
+ COND_CARRY = 29, // 29 - Conditional on carrying object
+ INIT_MAZE = 30, // 30 - Start special maze hotspot processing
+ EXIT_MAZE = 31, // 31 - Exit special maze processing
+ INIT_PRIORITY = 32, // 32 - Initialize fbg field
+ INIT_SCREEN = 33, // 33 - Initialise screen field of object
+ AGSCHEDULE = 34, // 34 - Global schedule - lasts over new screen
+ REMAPPAL = 35, // 35 - Remappe palette - palette index, color
+ COND_NOUN = 36, // 36 - Conditional on noun appearing in line
+ SCREEN_STATE = 37, // 37 - Set new screen state - used for comments
+ INIT_LIPS = 38, // 38 - Position lips object for supplied object
+ INIT_STORY_MODE = 39, // 39 - Set story mode TRUE/FALSE (user can't type)
+ WARN = 40, // 40 - Same as TEXT but can't dismiss box by typing
+ COND_BONUS = 41, // 41 - Conditional on bonus having been scored
+ TEXT_TAKE = 42, // 42 - Issue text box with "take" info string
+ YESNO = 43, // 43 - Prompt user for Yes or No
+ STOP_ROUTE = 44, // 44 - Skip any route in progress (hero still walks)
+ COND_ROUTE = 45, // 45 - Conditional on route in progress
+ INIT_JUMPEXIT = 46, // 46 - Initialize status.jumpexit
+ INIT_VIEW = 47, // 47 - Initialize viewx, viewy, dir
+ INIT_OBJ_FRAME = 48, // 48 - Object number, seq,frame to set curr_seq_p to
+ OLD_SONG = 49 // Added by Strangerke - Set currently playing sound, old way: that is, using a string index instead of a reference in a file
+};
+
+#define NORMAL_TPS 9 // Number of ticks (frames) per second
+
+// Enumerate object numbers. ALL objects must have an entry here in order.
+enum objid_1w {
+ HERO = 0, DOOR1_1w, EYES1_1w, EYES2_1w, BAT_1w, PKIN_1w, KEY_1w, FENCE_1w, TREE1_1w,
+ DOOR2_1w, DOOR3_1w, EYES3_1w, EYES4_1w, BATPIC_1w, CANDLE_1w, CUPBOARD_1w, KNIFE_1w, WHISTLE_1w,
+ WARD_1w, WDOORL_1w, WDOORR_1w, MASK_1w, MONKEY_1w, WINDOW1_1w, BED_1w, BUTLER_1w, CHOP_1w,
+ REDEYES_1w, LIPS_1w, ARM_1w, HDLSHERO_1w, ZELDPIC_1w, WINDOW2_1w, HUTCH_1w, FRANK_1w, DRAC_1w,
+ LADY_1w, HOOD_1w, SLIME_1w, PEAHEAD_1w, FOOD_1w, PLANT_1w, WINDOW3_1w, TOILET_1w, BATH_1w,
+ MIRROR_1w, WINDOW4_1w, BROOM_1w, UNITS_1w, DOOR4_1w, SHED_1w, OILCAN_1w, TREE2_1w, INSHED_1w,
+ DOG_1w, CARPET_1w, TRAP_1w, BOLT_1w, HERODEAD_1w, MOUSEHOLE_1w, ROCK1_1w, ROCK2_1w, ROCK3_1w,
+ DOOR5_1w, BAT2_1w, BAT3_1w, BAT4_1w, BAT5_1w, MUMMY_1w, MDOOR_1w, GOLD_1w, ROCK4_1w,
+ BOAT_1w, ROPE_1w, OLDMAN_1w, WHERO_1w, GUARD_1w, PROF_1w, IGOR_1w, BUNG_1w, GDOOR_1w,
+ SPACHERO_1w, FUZYHERO_1w, ARC_1w, BOX_1w, BUTTONS_1w, MACHINE_1w, TABLE_1w, LASTOBJ_1w
+};
+
+enum objid_2w {
+ /* HERO_2w,*/ PENNY_2w = 1, SMOKE_2w, DOOR1_2w, DOOR5_2w, DOOR6_2w,
+ LIPS_2w, MAID_2w, HALLGO_2w, PENNYLIE_2w, PENFALL_2w, BOOKCASE_2w,
+ BOOK_2w, KEYHOLE_2w, BED_2w, PANEL_2w, CUPBOARD1_2w, BIRD_2w,
+ MATCHES_2w, DUMB1_2w, PHONE_2w, BLOTPAD_2w, DRAWER_2w, SWITCH_2w,
+ KEYHOLE2_2w, MURDER_2w, BALLOON_2w, BLOCKS_2w, PLAYPEN_2w, WINDOW1_2w,
+ WINDOW2_2w, DUMB2_2w, CUPBOARD2_2w, GARLIC_2w, KDOOR_2w, KWINDOW_2w,
+ GARDENER_2w, REDBUTTON_2w, YELLOWBUTTON_2w, GREENBUTTON_2w, BLUEBUTTON_2w, BUTTON_2w,
+ SHEDLIGHT_2w, TOOLS_2w, MAGNIFY_2w, FLY1_2w, FLY2_2w, FLY3_2w,
+ LEAF1_2w, LEAF2_2w, LEAF3_2w, LEAF4_2w, LEAF5_2w, LEAF6_2w,
+ LEAF7_2w, LEAF8_2w, GATELIGHT_2w, GATES_2w, CATNIP_2w, BRIDGE_2w,
+ ZAPPER_2w, BUG1_2w, BUG2_2w, BUG3_2w, BUG4_2w, BUG5_2w,
+ OLDMAN_2w, WELL_2w, SNAKE_2w, TARDIS_2w, GRAFFITI_2w, STICK_2w,
+ DYNAMITE_2w, KENNEL_2w, DOG_2w, ROCKFALL_2w, ROPE1_2w, ROPE2_2w,
+ OILLAMP_2w, BANANA_2w, HOLE_2w, GENIE_2w, SAFE_2w, WILL_2w,
+ MOUSEHOLE_2w, TWINDOW_2w, PICTURE3_2w, WINDOW4_2w, WINDOW5_2w, WINDOW6_2w,
+ PLANT3_2w, CUPBOARD3_2w, PDOOR_2w, ALBUM_2w, CAT_2w, PWINDOW1_2w,
+ PWINDOW2_2w, POST_2w, DOOR4_2w, PAPER_2w, PENCIL_2w, CHUTE_2w,
+ BOX_2w, DOOR2_2w, DOOR3_2w, DOOR7_2w, MIRROR_2w, HARRY_2w,
+ OWINDOW_2w, OPICTURE_2w, OPLANT_2w, ORGAN2_2w, HESTER_2w, LETTER_2w,
+ BOOKCASE2_2w, PICTURE2_2w, PLANT2_2w, WINDOW3_2w, DOCTOR_2w, ROBOT_2w,
+ SCREW_2w, DOOR8_2w, DOOR9_2w, DOOR10_2w, HPICTURE_2w, HPLANT_2w,
+ COOK_2w, COOKB_2w, COP_2w, HORACE_2w, BELL_2w, GUN_2w,
+ BOTTLE_2w, LASTOBJ_2w
+};
+
+enum objid_3w {
+ /* HERO,*/ WHERO_3w = 1, PENNY_3w, PENNYLIE_3w, LIPS_3w, INPLANE_3w, DOOR_3w,
+ PLANT1_3w, INPLANE2_3w, WATER1_3w, WATER2_3w, WATER3_3w, WATER4_3w, WATER5_3w,
+ WATER6_3w, CLAY_3w, NEEDLES_3w, FLASK_3w, BOUILLON_3w, CHEESE_3w, SPIDER_3w,
+ PLANT3_3w, PLANT4_3w, BLOCK1_3w, BLOCK2_3w, BLOCK3_3w, BLOCK4_3w, VINE_3w,
+ VINE1_3w, VINE2_3w, SWINGER_3w, STEPS_3w, DOCTOR_3w, DOCLIE_3w, CDOOR_3w,
+ MOUSE_3w, MOUSHOLE_3w, CAGE_3w, POST_FIRE1_3w, POST_FIRE2_3w, CAMPFIRE_3w, HUTFIRE_3w,
+ POT_3w, WINDOW_3w, NAT1_3w, NAT2_3w, NAT3_3w, NATB_3w, NATG_3w,
+ BLOWPIPE_3w, HUT_3w, ELEPHANT_3w, E_EYES_3w, HERO_OLD_3w, AIRCRAFT_3w, SCROLL_3w,
+ CRYSTAL_3w, ROCK_3w, PLANT2_3w, GHOST_3w, BELL_3w, BOOK_3w, CANDLE_3w,
+ VINE3_3w, RUSH1_3w, RUSH2_3w, O_EYE_3w, FIRE_4_3w, MOUTH_3w, POLE_3w,
+ PLANT5_3w, LASTOBJ_3w
+};
+
+enum objid_1d {
+ /* HERO,*/ DOOR1_1d = 1, EYES1_1d, EYES2_1d, BAT_1d,
+ PKIN_1d, KEY_1d, DOOR2_1d, DOOR3_1d, EYES3_1d,
+ EYES4_1d, CANDLE_1d, CUPBOARD_1d, KNIFE_1d, WHISTLE_1d,
+ WARD_1d, WDOORL_1d, WDOORR_1d, MASK_1d, MONKEY_1d,
+ BUTLER_1d, CHOP_1d, REDEYES_1d, LIPS_1d, ARM_1d,
+ HDLSHERO_1d, DOOR4_1d, SHED_1d, OILCAN_1d, DOG_1d,
+ CARPET_1d, TRAP_1d, BOLT_1d, HERODEAD_1d, BAT2_1d,
+ BAT3_1d, BAT4_1d, BAT5_1d, MUMMY_1d, MDOOR_1d,
+ GOLD_1d, BOAT_1d, ROPE_1d, OLDMAN_1d, WHERO_1d,
+ GUARD_1d, PROF_1d, IGOR_1d, BUNG_1d, GDOOR_1d,
+ SPACHERO_1d, FUZYHERO_1d, ARC_1d, LASTOBJ_1d
+};
+
+enum objid_2d {
+ /* HERO,*/ PENNY_2d = 1, SMOKE_2d, DOOR1_2d, LIPS_2d,
+ MAID_2d, PENNYLIE_2d, PENFALL_2d, BOOKCASE_2d, BOOK_2d,
+ KEYHOLE_2d, PANEL_2d, CUPBOARD1_2d, BIRD_2d, MATCHES_2d,
+ DUMB1_2d, MURDER_2d, BALLOON_2d, DUMB2_2d, CUPBOARD2_2d,
+ GARLIC_2d, KDOOR_2d, GARDENER_2d, BUTTON_2d, REDBUTTON_2d,
+ YELLOWBUTTON_2d, GREENBUTTON_2d, BLUEBUTTON_2d, SHEDLIGHT_2d, MAGNIFY_2d,
+ FLY1_2d, FLY2_2d, FLY3_2d, LEAF1_2d, LEAF2_2d,
+ LEAF3_2d, LEAF4_2d, LEAF5_2d, LEAF6_2d, LEAF7_2d,
+ LEAF8_2d, GATELIGHT_2d, CATNIP_2d, ZAPPER_2d, BUG1_2d,
+ BUG2_2d, BUG3_2d, BUG4_2d, BUG5_2d, OLDMAN_2d,
+ WELL_2d, SNAKE_2d, TARDIS_2d, STICK_2d, DYNAMITE_2d,
+ KENNEL_2d, DOG_2d, ROPE1_2d, ROPE2_2d, OILLAMP_2d,
+ BANANA_2d, GENIE_2d, SAFE_2d, WILL_2d, CUPBOARD3_2d,
+ PDOOR_2d, ALBUM_2d, CAT_2d, DOOR4_2d, PAPER_2d,
+ PENCIL_2d, DOOR2_2d, DOOR3_2d, HARRY_2d, HESTER_2d,
+ LETTER_2d, DOCTOR_2d, DALEK_2d, SCREW_2d, COOK_2d,
+ COOKB_2d, COP_2d, HORACE_2d, BELL_2d, GUN_2d,
+ BOTTLE_2d, LASTOBJ_2d
+};
+
+enum objid_3d {
+ /* HERO,*/ WHERO_3d = 1, PENNY_3d, PENNYLIE_3d, LIPS_3d,
+ INPLANE_3d, DOOR_3d, PLANT1_3d, INPLANE2_3d, WATER1_3d,
+ WATER2_3d, WATER3_3d, WATER4_3d, CLAY_3d, NEEDLES_3d,
+ FLASK_3d, BOUILLON_3d, CHEESE_3d, SPIDER_3d, PLANT3_3d,
+ PLANT4_3d, BLOCK1_3d, BLOCK2_3d, BLOCK3_3d, VINE_3d,
+ VINE2_3d, SWINGER_3d, DOCTOR_3d, DOCLIE_3d, CDOOR_3d,
+ MOUSE_3d, MOUSHOLE_3d, CAGE_3d, POST_FIRE1_3d, POST_FIRE2_3d,
+ CAMPFIRE_3d, HUTFIRE_3d, NAT1_3d, NAT2_3d, NAT3_3d,
+ NATB_3d, NATG_3d, BLOWPIPE_3d, ELEPHANT_3d, E_EYES_3d,
+ HERO_OLD_3d, AIRCRAFT_3d, SCROLL_3d, CRYSTAL_3d, ROCK_3d,
+ PLANT2_3d, GHOST_3d, BELL_3d, BOOK_3d, CANDLE_3d,
+ VINE3_3d, O_EYE_3d, FIRE_4_3d, MOUTH_3d, POLE_3d,
+ PLANT5_3d, LASTOBJ_3d
+};
+
+#define _BLUE 1
+#define _BLACK 0
+#define _LIGHTYELLOW 14
+#define _LIGHTMAGENTA 13
+#define _LIGHTRED 4
+#define _CYAN 3
+
+// TODO: Added by Strangerke, to be validated
+#define _GRAY 7
+
+// Enumerate sequence index matching direction of travel
+enum {RIGHT, LEFT, DOWN, _UP};
+
+enum sound_t_1w {
+//Hugo 1 Win
+ T_TRACK1 , T_TRACK2, T_TRACK3, T_TRACK4, T_TRACK5,
+ T_TRACK6 , T_TRACK7, T_TRACK8, T_TRACK9, T_TRACK10,
+ T_TRACK11, T_TRACK12 , NUM_TUNES_1w,
+ // Start of sound effects
+ SILENCE_1w, TEST_SOUND_1w, DOG_BARK_1w, BAT_FLUTTER_1w, DOOR_CREAK_1w,
+ DOOR_OPEN_1w, MACHINE_NOISE_1w, MUNCH_1w, BUTLER_GOTCHER_1w, FORK_BANG_1w,
+ MUMMY_CHASE_1w, MUMMY_GOTCHER_1w, SPLASH_1w
+};
+
+enum sound_t_2w {
+//Hugo 2 Win
+// T_TRACK1, T_TRACK2, T_TRACK3, T_TRACK4, T_TRACK5,
+// T_TRACK6, T_TRACK7, T_TRACK8, T_TRACK9, T_TRACK10,
+ /* T_TRACK11, T_TRACK12,*/ T_HARRY_ORGAN_2w = 12, NUM_TUNES_2w,
+ // Start of sound effects
+ SILENCE_2w, TEST_SOUND_2w, DOOR_CREAK_2w, GET_BOOK_2w, HORACE_SCREAM_2w,
+ PANEL_UP_2w, PANEL_DN_2w, BALLOON_POP_2w, DROP_MATCHES_2w, CLICK_2w,
+ GATES_RUMBLE_2w, STING_2w, HISS_2w, BARK_2w, GUNSHOT_2w,
+ BOOM_2w, CHASM_SCREAM_2w, GENIE_APPEAR_2w, DING_2w, MEOW_2w,
+ SCREAM_2w, URGH_2w, PLANET_2w
+};
+
+enum sound_t_3w {
+//Hugo 3 Win
+// Music and Sound Effects
+// T_TRACK1, T_TRACK2, T_TRACK3, T_TRACK4, T_TRACK5,
+// T_TRACK6, T_TRACK7, T_TRACK8, T_TRACK9, T_TRACK10,
+ /* T_TRACK11, T_TRACK12,*/ NUM_TUNES_3w = 12,
+ // Start of sound effects
+ SILENCE_3w, TEST_SOUND_3w, MAGIC_3w, WHOOSH_3w, POINK_3w,
+ ARGH_3w, HEY_3w, NELLIE_3w, YODEL_3w, SQUEAK_3w,
+ BOOM_3w, CHOMP_3w, SCREAM_3w
+};
+
+enum sound_t_1d {
+//Hugo 1 DOS
+// Music and Sound Effects are not present in DOS version
+ NUM_TUNES_1d = -1, SILENCE_1d = -1, TEST_SOUND_1d = -1
+};
+
+enum sound_t_2d {
+//Hugo 2 DOS
+// Music and Sound Effects are not present in DOS version
+ NUM_TUNES_2d = -1, SILENCE_2d = -1, TEST_SOUND_2d = -1
+};
+
+enum sound_t_3d {
+//Hugo 3 DOS
+// Music and Sound Effects are not present in DOS version
+ NUM_TUNES_3d = -1, SILENCE_3d = -1, TEST_SOUND_3d = -1
+};
+
+enum TEXTCOLORS {
+ _TBLACK, _TBLUE, _TGREEN, _TCYAN,
+ _TRED, _TMAGENTA, _TBROWN, _TWHITE,
+ _TGRAY, _TLIGHTBLUE, _TLIGHTGREEN, _TLIGHTCYAN,
+ _TLIGHTRED, _TLIGHTMAGENTA, _TLIGHTYELLOW, _TBRIGHTWHITE
+};
+
+#endif
diff --git a/tools/create_hugo/module.mk b/tools/create_hugo/module.mk
new file mode 100644
index 0000000000..797ff3a1a0
--- /dev/null
+++ b/tools/create_hugo/module.mk
@@ -0,0 +1,10 @@
+MODULE := tools/create_hugo
+
+MODULE_OBJS := \
+ create_hugo.o
+
+# Set the name of the executable
+TOOL_EXECUTABLE := create_hugo
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/tools/create_hugo/staticdata.h b/tools/create_hugo/staticdata.h
new file mode 100644
index 0000000000..880d67128f
--- /dev/null
+++ b/tools/create_hugo/staticdata.h
@@ -0,0 +1,11891 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef STATICDATA_H
+#define STATICDATA_H
+
+#define NUM_VARIANTE 6
+#define MAZE_SCREEN 39 // First maze screen
+#define DONT_CARE 0xFF // Any state allowed in command verb
+#define DOORDELAY 12 // Time for a door to open
+#define PENDELAY 25 // Hold off going upstairs
+#define STORYDELAY (5 * NORMAL_TPS)
+#define LIPDX 11 // To position LIPS object on person
+#define LIPDY 8
+#define DARTTIME 70 // This many ticks to fall asleep
+
+//***************************************************************************
+// Hugo 1 Windows
+//***************************************************************************
+const char *textData_1w[] = {
+ "",
+ "You don't have it.",
+ "You don't have the key.",
+ "It is too dark to see\nanything in there.",
+ "You don't have anything\nto oil it with.",
+//5
+ "You don't have anything\nto cut it with.",
+// Strings for when object is in wrong state for cmd
+ "That wouldn't work.",
+ "It is already locked.",
+ "It is already unlocked.",
+ "You unlock the door with the key.",
+//10
+ "You grasp the pumpkin\nand try to prise it apart.",
+ "It is locked.",
+ "It is already open.",
+ "It is already closed.",
+ "It is already smashed.",
+//15
+ "There is nothing in there.",
+ "You are already wearing it\nyou cross-eyed baboon!",
+ "You don't have it on,\nI know it's hard to tell!",
+ "You'll need to\ntake it off first.",
+ "You already oiled it,\nwhy don't you just\nopen it???",
+//20
+ "Despite your best efforts the\nbolt refuses to budge.",
+ "I believe you already cut it!",
+ "It is a rock, of no\nparticular significance.",
+// Strings for when cmd successfully carried out (cmnd->donestr)
+ "Ok.",
+ "You blow the whistle.",
+//25
+ "The shed seems to have fallen\ninto disuse and is pretty\nmuch full of garbage, either\nbroken or rusted to pieces.\nYou are just on the point of\nleaving when you notice an\noilcan sitting on a shelf.",
+ "I said it's an oil-CAN,\nnot an oil-LAMP dummy!",
+ "Look what you found - a trapdoor!",
+ "You put a few drops of\noil on the rusty bolt.",
+ "With a mighty effort you\nmanage to slide the bolt open!",
+//30
+ "Stupidly, you slide the bolt shut.",
+ "You cut the rope with your knife.\nThe boat is now floating free!",
+ "The rope is knotted too tightly\nand you are, alas, unable to\nuntie it despite your best efforts!",
+ "This rope is a lot stronger\nthan you and you are, alas,\nunable to break it.",
+ "The boat is now watertight!",
+//35
+ "The oldman seems somewhat\nsurprised by your attack and a\nlittle offended.\n\nYou may wish to try a different\nstrategy!",
+// Added in data1.cpp by Strangerke, to avoid hardcoded strings in background_t variable initialization*/
+ "Nobody answers!",
+ "It's not locked!",
+// Object descriptions, invoked by the words "look" (at object)
+ "It is you, the hero.",
+ "Why not try opening it?",
+//40
+ "Just a regular wooden closet.",
+ "They appear to be looking at you!",
+ "It's just flapping around up there.",
+ "There appears to be\nsomething inside it.",
+ "Looks like a front door key to me.",
+//45
+ "A useful looking candle.",
+ "A rather useful looking penknife.",
+ "It is a little silver whistle.",
+ "It appears to be a halloween mask\nlooking somewhat like a grotesque\nmonkey's head!",
+ "I don't think you want to mess with\nthis guy!",
+//50
+ "A rather yummy looking pork chop.",
+ "Frankenstein's monster. Nice suit and tie!",
+ "Count Dracula. Wonder what he's drinking!",
+ "It's Gwendolin, the mad professor's daughter.",
+ "It's the Fiendish Friar of Frankfurt!",
+//55
+ "This monster is called \"Slime\".",
+ "This monster has a head\nthe size and color of a pea.",
+ "This little oilcan looks like\nit contains some oil.",
+ "A little wooden trapdoor.",
+ "A rather rusty (but strong)\nmetal bolt.",
+//60
+ "Believe me, this is no Lassie!",
+ "It looks like a serviceable boat.\nI wonder whether it would get\nyou to the other side?",
+ "The rope is to stop\nthe boat drifting away!",
+ "Wooo! A small fortune in gold!",
+ "He looks at least\n200 years old!!",
+//65
+ "This is one dude you\ndon't want to argue with!",
+ "He looks totally gone!",
+ "He has a certain charm,\nI suppose!",
+ "Well, it's sort of\nround and rubbery!",
+ "Try getting Hugo to\nbreak the pumpkin open!",
+//70
+ "Use the key on a door\nto unlock it!",
+ "You don't need to do\nanything with the candle,\njust holding it is sufficient!",
+ "The only thing you can do\nwith the mask is wear it.",
+ "You can't use the\nbung on that!",
+ "That's not the way\nto use the chop!",
+//75
+ "Trying to cut that won't help you!",
+ "Oiling that is not useful!",
+ "Your generous gift is refused!"
+};
+
+//***************************************************************************
+// Hugo 2
+//***************************************************************************
+const char *textData_2w[] = {
+ "",
+// Use following standard strings where applicable
+ "You see nothing very\ninteresting about it",
+ "I see no purpose\nin doing that!",
+ "You find nothing of\nany interest inside!",
+// Strings for when required object(s) not carried
+ "You don't have it",
+//5
+ "You don't have\nany matches!",
+ "You don't have a weapon!",
+// Strings for when object is in wrong state for cmd
+ "That wouldn't work",
+ "It is already closed",
+ "It is already smashed",
+//10
+ "It is already open",
+ "You already drank it!",
+ "Cousin Harry is too convulsed\nwith laughter to talk!",
+ "You can't! Great Aunt Hester\nwill see you!",
+ "Click!\nOops, I think you\nemptied it buster!",
+// Strings for when cmd successfully carried out (cmnd->donestr)
+//15
+ "Ok!",
+ "Now it's gone for ever!",
+ "You break off a shoot and\nplace it near the cat.\nThe cat awakes from its\nreverie and sniffs your\ngift excitedly. After 5\nminutes of friendly play\nit falls asleep again,\nrather contentedly!",
+ "Hmm, what an interesting flavor!\n\n(...nothing happens.)",
+ "You slide the paper under the door.",
+//20
+ "There's no point, the\nkey has already fallen.\nI'm afraid you're stuck!",
+ "You already pushed the\nkey out the other side.\nI'm afraid you're stuck!",
+ "Why don't you just\ntry reading it?",
+ "Quietly opening it, you quickly\nscan it. It appears to be a\nletter from Hester's attorney\nconcerning the life insurance\npolicy on Great Uncle Horace.\nFeeling rather uncomfortable\nabout reading other peoples'\nmail, you return it to its\nenvelope without reading any\nfurther.",
+ "It won't open!",
+//25
+ "Just walk through!\nThis door will\nopen automatically!",
+ "The door is firmly locked.",
+ "You don't have any keys!",
+ "The room is too dark to\nsee anything, now",
+ "Opening the desk drawer reveals:\na book of matches!",
+//30
+ "Opening the cupboard reveals:\na clove of garlic!",
+ "You need to say which\ncolor button to press!",
+// Added in data1.cpp by Strangerke, to avoid hardcoded strings in background_t variable initialization*/
+ "Nobody answers!",
+ "It's not locked!",
+// Object descriptions, invoked by the words "look" (at object)
+ "It is the handsome Hugo!",
+//35
+ "It is the pretty Penelope!",
+ "Why not try opening it?",
+ "The door looks solidly built.",
+ "You see a saucy looking french maid!",
+ "The maid speaks to you:\nThat is ze wrong way, monsieur!\nPlease go upstairs to your room!",
+//40
+ "What a cute doggy!",
+ "He looks at least\n200 years old!!",
+ "You can see a rather impressive\nbook collection.\nOne yellow book in particular\nseems to stand out.",
+ "One yellow book seems to be\nsticking out slightly.",
+ "It is a quaint old four-poster.",
+//45
+ "It is a brightly colored parrot.",
+ "A little book of matches.",
+ "Your matches look a little soggy!\n(Presumably because you dropped\nthem in the stream so carelessly.)",
+ "It is a brightly colored balloon.",
+ "It is a dumb waiter,\nused to carry food\nup and down from\nthe kitchen.",
+//50
+ "The rope looks climbable.",
+ "Ugh! The garlic smells foul!",
+ "You can see 4 colored buttons.\nUnderneath the buttons is some\nlettering. The lettering is very\nfaded and you can only make out\nthe following characters under\nthe green button:\n\"B*g *a*pe*\"",
+ "The shed light is on!",
+ "The gate lanterns are now on!",
+//55
+ "It is a strong-scented mint plant containing\na substance attractive to cats.",
+ "A rickety old bridge. Watch your step!",
+ "They are small but have\nvery vicious looking\nproboscises.",
+ "It is one of the rarer\nvenomous species:\nbeautiful but very deadly!",
+ "It looks like a regular phone booth, on\nthe outside. It seems unexpectedly\nroomy, on the inside.",
+//60
+ "Examining the gun, you see\nit contains one bullet!",
+ "Examining the gun, you see\nit is now empty!",
+ "The stick of dynamite has\na fuse at one end.",
+ "You peer down into the\nmurky depths of the well\nand see only blackness...\nTaking a small pebble, you\nlean over and drop it down.\nAfter a while you hear a\ndull thud...",
+ "It looks like an ancient\noil lamp. It appears to\nbe totally empty now,\nexcept it feels curiously\nheavy.",
+//65
+ "It looks pretty moldy, I don't\nthink I'd try eating it!",
+ "Just your regular genie type!",
+ "It's Hugo's affable cousin Harry!",
+ "It's Hugo's lovable aunt Hester!",
+ "Yes, there is an envelope\non the table with a letter\ninside it!",
+//70
+ "Who is this mysterious fellow, I wonder?\nWho he is and where he comes from\nI have simply no idea!",
+ "It's the cook!",
+ "He's a very authoritative\nlooking police officer!",
+ "A sprightly looking old man!",
+ "It is an evil mechanized monster\nbent on the destruction of the\nuniverse!",
+//75
+ "It is a pile of smouldering metal!",
+ "It's the kind of bell\none might use to\nsummon aid.",
+ "Looking through the\nkeyhole, you can\nsee the key has been\nleft in the lock.\nToo bad it's on the\nother side!",
+ "It's just a regular pencil.",
+ "It is a magnifying glass\nused (for example) for\nreading small print.",
+//80
+ "It is a pretty solid\nlooking safe, I don't\nthink there's any way\nto open it unless you\nknow the combination!",
+ "It is an extremely intricate\nlooking device, I'm afraid\nit's workings are quite\nbeyond me!",
+ "It has some printing\non it, some of which\nis readable.",
+ "It contains several old photos\nof Hugo as a child. One photo\nin particular catches your\nattention. It shows Hugo\nwith a young girl of about\nthe same age standing in front\nof a huge pointed tower.\nSomething about the girl strikes\nyou as being very familiar...",
+ "A rather wistful-looking cat",
+//85
+ "It is a clear glass bottle.\nA label is attached with the\nword \"SERUM\" printed on it.",
+ "It has a U-shaped fluorescent\nlight tube at its center, with\na series of metal rods spaced\nvertically around it.\nSurrounding the rods is a thick\nmesh-like screen which also acts\nas the frame of the device.",
+// Strings when objects not used together
+ "Setting fire to that would\nnot be very useful!",
+ "Try giving the garlic\nto Penelope to eat!",
+ "That's not the way\nto use the stick!",
+//90
+ "The serum is for\ncuring snake bites!",
+ "I'd save the dynamite for\nlater, if I were you!",
+ "That would not help you!",
+ "I've no idea what you're trying to do!",
+ "That won't work!",
+//95
+ "You can't unscrew that!",
+ "Ding Dong!\n\n(...nothing happens)",
+ "That's not the way\nto use the catnip!",
+ "This is no time to\nread a newspaper!",
+ "You can't use a\npencil on that!",
+//100
+ "Your examination reveals\nnothing of interest."
+};
+
+//***************************************************************************
+// Hugo 3
+//***************************************************************************
+const char *textData_3w[] = {
+ "",
+// Use following standard strings where applicable
+ "You see nothing very\ninteresting about it",
+ "Nothing happens.",
+// Strings for when required object(s) not carried
+ "You don't have it",
+ "You don't have a weapon!",
+//5
+ "You don't have anything\nto stick in it.",
+ "There are three things\nrequired to perform an\nexorcism. You do not\nhave all of them...",
+// Strings for when object is in wrong state for cmd
+ "That wouldn't work.",
+ "It is already closed.",
+ "It is already smashed.",
+//10
+ "It is already open.",
+ "There is nothing in there.",
+ "You already used the clay\nto make an effigy of the\nWitch Doctor",
+ "It already has some\nwater inside it.",
+ "There is nothing more\nto find there.",
+//15
+ "You can see a very slight\ndepression in the earth\nwhere something spherical\nprobably once rested there.",
+ "It is already lit.",
+ "It is not lit.",
+ "Wheeee!",
+// Strings for when cmd successfully carried out (cmnd->donestr)
+ "Ok.",
+//20
+ " LOST!\n\nNear the mighty boulder,\nMy precious crystal ball,\nI guess I couldn't hold 'er,\nSo I must've let her fall!\n\nIf anyone should find it,\nPlease return it to my keep,\nBe careful if you use it,\nFor its powers runneth deep!\n\nsigned: The old man.",
+ "My my, we are thorough,\naren't we? Well, just\nfor you:\n\nThere is a crystal ball\nlying behind the rock,\nglinting in the sun.\n\nYou fetch it out...",
+ "Ding dong!\n\n(Nothing happens...)",
+ "You start to swing...\n\nThe ghost is impressed by\nyour fine acrobatics (but\nstill won't let you pass)!",
+ "You grab the vine\nand start swinging...",
+//25
+ "It looks much like any other water.",
+ "Mmm! Delicious cool water!",
+ "Mmm! The water tastes delicious!\nBut what about poor Penelope?",
+ "Swoosh!\n\nOops, missed him! Your\naim is terrible, you need\na bigger target, ha ha!",
+// Make use of object with another (unsuccessfully)
+ "You can't use the clay like that!",
+//30
+ "That's not the way to use the flask!",
+ "You can't use the\nbouillon cubes like that!",
+ "Doing that with the cage isn't useful!",
+ "Get Hugo to rub the crystal ball!",
+ "That's not the way to use it!",
+//35
+ "The ghost will not let you pass!",
+ "Use an elephant? You're funny!",
+ "Get Hugo to read it!",
+ "The candle cannot be\nused in such a manner.",
+ "Ding dong!\n\nNothing happens...",
+//40
+ "Shooting your blowpipe\nat that won't help!",
+// Added in data1.cpp by Strangerke, to avoid hardcoded strings in background_t variable initialization*/
+ "Nobody answers!",
+ "It's not locked!",
+// Object descriptions, invoked by the words "look" (at object)
+ "It is the handsome Hugo!",
+ "It is the pretty Penelope!",
+//45
+ "Poor Penelope doesn't\nlook very well!",
+ "It doesn't look too badly damaged.",
+ "The waterfall is flowing too\nswiftly for you to cross.",
+ "The water looks clean\nenough to drink.",
+ "This is the magical pool of life!\nTake some water to Penelope to save her.",
+//50
+ "The vines look pretty sturdy.",
+ "You see nothing unusual\nabout the bullrushes.",
+ "Some very narrow stepping\nstones cross the stream.",
+ "Not the kind of guy you'd\nwant to meet in a dark alley!",
+ "It is the kind used to\nmold shapes with.",
+//55
+ "They look very sharp!",
+ "An empty water flask.",
+ "A flask containing\nsome regular water.",
+ "A flask containing\nsome magic water.",
+ "You see nothing out of\nthe ordinary about him",
+//60
+ "You see nothing out of\nthe ordinary about her",
+ "It is gray and furry\nand rather cute!",
+ "It is a small cage suitable\nfor holding small animals.",
+ "It is a small cage with a\ncute furry mouse inside.",
+ "You can see a blowpipe with some\ndarts full of sleeping potion!",
+//65
+ "It is big, gray and\nlooks extremely heavy!",
+ "It is a box of bouillon cubes\nnormally used as seasoning in\ncooking but often carried for\nemergency rations in aircraft.",
+ "You are looking at what appears\nto be the half-eaten remains of\na cheese sandwich.",
+ "It is an extremely\nvoracious-looking spider!",
+ "The scroll appears\nto have some writing\non it.",
+//70
+ "The rock itself looks\nlike any other mighty\nboulder you might find\nin these parts.",
+ "The crystal ball appears cloudy.",
+ "The ghost does not appear\nto be very friendly and\nwill not let you pass.",
+ "The bell is small and golden.\nIt makes a pleasant tinkling\nring which you find rather\ncomforting for some reason.",
+ "The book is old and very worn.\nThe pages although yellow with\nage, still have discernible\nwriting on them. You feel\nthe book has hidden powers.",
+//75
+ "The candle stick is golden and\nvery heavy. The flickering of\nthe candle feels comforting,\neven in the daylight."
+};
+
+//***************************************************************************
+// Hugo 1 Dos
+//***************************************************************************
+const char *textData_1d[] = {
+ "",
+ "You don't have it",
+ "You don't have the key",
+ "It is too dark to see\nanything in there",
+ "You don't have anything\nto oil it with",
+ "You don't have anything\nto cut it with",
+ "That wouldn't work",
+ "It is already locked",
+ "It is already unlocked",
+ "It is locked",
+ "It is already closed",
+ "It is already smashed",
+ "It is already open",
+ "There is nothing in there",
+ "You are already wearing it\nyou cross-eyed baboon!",
+ "You don't have it on,\nI know it's hard to tell!",
+ "You'll need to\ntake it off first",
+ "You already oiled it,\nwhy don't you just\nopen it???",
+ "Despite your best efforts the\nbolt refuses to budge",
+ "I believe you already did!",
+ "Ok.",
+ "The shed seems to have fallen\ninto disuse and is pretty\nmuch full of garbage, either\nbroken or rusted to pieces.\nYou are just on the point of\nleaving when you notice an\noilcan sitting on a shelf",
+ "I said it's an oil-CAN,\nnot an oil-LAMP dummy!",
+ "The boat is now floating free!",
+ "The rope is knotted too tightly\nand you are, alas, unable to\nuntie it despite your best efforts!",
+ "This rope is a lot stronger\nthan you and you are, alas,\nunable to break it",
+ "The oldman seems somewhat\nsurprised by your attack \nand a little offended.\n\nYou may wish to try a\ndifferent strategy!",
+ "It is you, the hero.",
+ "Why not try opening it?",
+ "I can see no more than\nyou at this moment",
+ "They appear to be looking at you!",
+ "It's just flapping around up there",
+ "There appears to be\nsomething inside it",
+ "Looks like a front door key to me",
+ "A useful looking candle",
+ "A rather useful looking penknife",
+ "It is a little silver whistle",
+ "It appears to be a halloween mask\nlooking somewhat like a grotesque\nmonkey's head!",
+ "I don't think you want to mess with\nthis guy!",
+ "A rather yummy looking pork chop",
+ "This little oilcan looks like\nit contains some oil",
+ "Believe me, this is no Lassie!",
+ "It looks like a serviceable\nboat. I wonder whether it\nwould get you to the other side?",
+ "The rope is to stop\nthe boat drifting away!",
+ "Wooo! A small fortune in gold!",
+ "He looks at least\n200 years old!!",
+ "This is one dude you\ndon't want to argue with!",
+ "He looks totally gone!",
+ "He has a certain charm,\nI suppose!",
+ "Well, it's sort of\nround and rubbery!",
+ "Nobody answers!",
+ ".", // No song
+ ".O0L5CL1DL3D#CL6..L5CL1DL3D#CL6G#L1GGFEbEbDL5CL1DL3D#CL6..L5CL1DL3D#CL6O1L1C>B<CC#DD#L3ECO2L1F.FE.CD.DC.>A<L3DL6CL1CDEL1F.FE.CD.DC.>A<Eb..L9D>L1GGAA#A#<L6C>L1AAA#<CCL6DL1>GGGbGGAA#A#AGG<DL9CL1CDEF.FE.CD.DC.>A<L3DL6CL1>AAGFFA<CCD#DDC>BbBbA<DDDL9DL1>GGAA#A#<L3CL1DEEL3FL1C>L3AL6<DL1C.C>B.<CC#.DD#.EL3FGG#AL1BbFDBbFDAFCAFCGECGECAFCAFCBbFDBbFDAFCAFC>CB<CC#DEF>..F.",
+ "O3L1E.>E<EF.>F<FE.>E<EF.>F<FE.F.G.A.G.A.B.<C.D.DbC>B.<D.Db.C.E.F.L4EFL6E.",
+ "O2L4G<C>GEL6CL2AGEL4GL9D."
+};
+
+//***************************************************************************
+// Hugo 2 DOS
+//***************************************************************************
+const char *textData_2d[] = {
+ "",
+ "You see nothing very\ninteresting about it",
+ "I see no purpose\nin doing that!",
+ "You find nothing of\nany interest inside!",
+ "You don't have it",
+ "You don't have\nany matches!",
+ "You don't have a weapon!",
+ "That wouldn't work",
+ "It is already closed",
+ "It is already smashed",
+ "It is already open",
+ "There is nothing in there",
+ "Cousin Harry is too convulsed\nwith laughter to talk!",
+ "You can't! Great Aunt Hester\nwill see you!",
+ "You don't have any\nmore quarters!",
+ "Click!\nOops, I think you\nemptied it buster!",
+ "Ok.",
+ "Ok.",
+ "Now it's gone for ever!",
+ "You break off a shoot and\nplace it near the cat.\nThe cat awakes from its\nreverie and sniffs your\ngift excitedly. After 5\nminutes of friendly play\nit falls asleep again,\nrather contentedly!",
+ "Why don't you just\ntry reading it?",
+ "Quietly opening it, you quickly\nscan it. It appears to be a\nletter from Hester's attorney\nconcerning the life insurance\npolicy on Great Uncle Horace.\nFeeling rather uncomfortable\nabout reading other peoples'\nmail, you return it to its\nenvelope without reading any\nfurther.",
+ "It won't open!",
+ "Just walk through!\nThis door will\nopen automatically!",
+ "The room is too dark to\nsee anything, now",
+ "Opening the desk drawer reveals:\na book of matches!",
+ "Opening the cupboard reveals:\na clove of garlic!",
+ "It is the handsome Hugo!",
+ "It is the pretty Penelope!",
+ "Why not try opening it?",
+ "You see a saucy looking french maid!",
+ "What a cute doggy!",
+ "He looks at least\n200 years old!!",
+ "You can see a rather impressive\nbook collection.\nOne yellow book in particular\nseems to stand out",
+ "One yellow book seems to be\nsticking out slightly",
+ "It is a brightly colored parrot.",
+ "It is a brightly colored balloon.",
+ "It is a dumb waiter,\nused to carry food\nup and down from\nthe kitchen",
+ "The rope looks climbable",
+ "Ugh! The garlic smells foul!",
+ "The gardener returns your stare!",
+ "You can see 4 colored buttons.\nUnderneath the buttons is some\nlettering. The lettering is\nvery faded and you can only make\nout the following characters\nunder the green button:\nb*g *a*pe*",
+ "They are small but have\nvery vicious looking\nproboscises",
+ "It is one of the rarer\nvenomous species:\nbeautiful but very deadly!",
+ "The stick of dynamite has\na fuse at one end.",
+ "You peer down into the\nmurky depths of the well\nand see only blackness...\nTaking a small pebble, you\nlean over and drop it down.\nAfter a while you hear a\ndull thud...",
+ "It looks like an ancient\noil lamp. It appears to\nbe totally empty now,\nexcept it feels curiously\nheavy.",
+ "It looks pretty moldy, I don't\nthink I'd try eating it!",
+ "Just your regular genie type!",
+ "It's Hugo's affable cousin Harry!",
+ "It's Hugo's lovable aunt Hester!",
+ "Yes, there is an envelope\non the table with a letter\ninside it!",
+ "This mysterious fellow calls himself\n""the Doctor"".\nWho he is and where he comes from\nI have simply no idea!",
+ "It's the cook!",
+ "He's a very authoritative\nlooking police officer!",
+ "A sprightly looking old man!",
+ "It is an evil mechanized monster\nbent on the destruction\nof the universe!",
+ "It's the kind of bell\none might use to\nsummon aid.",
+ "It looks real, I\nwonder if it works?",
+ "Looking through the\nkeyhole, you can\nsee the key has been\nleft in the lock.\nToo bad it's on the\nother side!",
+ "It is a magnifying glass\nused (for example) for\nreading small print.",
+ "It is a pretty solid\nlooking safe, I don't\nthink there's any way\nto open it unless you\nknow the combination!",
+ "It is an extremely intricate\nlooking device, I'm afraid\nit's workings are quite\nbeyond me!",
+ "It has some printing\non it, some of which\nis readable.",
+ "It contains several old photos\nof Hugo as a child. One photo\nin particular catches your\nattention. It shows Hugo\nwith a young girl of about\nthe same age standing in front\nof a huge pointed tower.\nSomething about the girl strikes\nyou as being very familiar...",
+ "It is a clear glass bottle.\nA label is attached with the\nword \"SERUM\" printed on it.",
+ "It has a U-shaped fluorescent\nlight tube at its center, with\na series of metal rods spaced\nvertically around it.\nSurrounding the rods is a thick\nmesh-like screen which also acts\nas the frame of the device.",
+ "Nobody answers!",
+ "It's not locked!",
+ "You need to say which\ncolor button to press!",
+ ".",
+ ".O2L1C^EGBACEAGAGFEDEFG^GCGvD^GvG^GvEFEDC.^C.vC^EGBACEAGAGFEDEFG^GCGvD^GvG^GvEFEDC.^C.vCDCvABAG.^CDCvABAG.^C.CvBA.^D.vB^CvBAGvG^ABvC^EGBACEAGAGFEDEFG^GCGvD^GvG^GvEFEDC.^C.",
+ ".O2L1CEG^C.",
+ ".O3L1CvGEC.",
+ ".O1L1AbAAbFAbAAbFAbAAbFAbAAbFAbAAbFAbAAbFAbAAbFAbAAbF.",
+ ".O2L1^CvGEC^CvGECBGECBGECAGECAGECBGECBGEC^CvGEC^CvGECBGECBGECAGECAGECBF#DvB^BF#DvB^GDvBG^GDvBG^GbDvBG^GbDvBG^EDvBG^EDvBG^GbDvBG^GbDvBG^GDvBG^GDvBG^GbDvBG^GbDvBG^EDvBG^EDvBG^Gb.......^CvGEC^CvGECBGECBGECAGECAGECBGECBGEC^CvGEC^CvGECBGECBGECAGECAGECBF#DvB^BF#DvB^GDvBG^GDvBG^GbDvBG^GbDvBG^EDvBG^EDvBG^GbDvBG^GbDvBG^GDvBG^GDvBG^GbDvBG^GbDvBG^EDvBG^EDvBG^GbDvBG^Gb...",
+ ".O0L1CC#CC#CC#CC#CC#CC#CC#CC#CC#.",
+ ".O1L3^CvL1G.GL3G#L1G.....L1B..^C.",
+ "O3L1E.vE^EF.vF^FE.vE^EF.vF^FE.F.G.A.G.A.B.^C.D.DbCvB.^D.Db.C.E.F.L4EFL6E.",
+ "O2L4G<C>GEL6CL2AGEL4GL9D."
+};
+
+//***************************************************************************
+// Hugo 3 DOS
+//***************************************************************************
+const char *textData_3d[] = {
+ "",
+ "You see nothing very\ninteresting about it",
+ "I see no purpose\nin doing that!",
+ "You find nothing of\nany interest inside!",
+ "Nothing happens.",
+ "You don't have it",
+ "You don't have a weapon!",
+ "You don't have anything\nto stick in it.",
+ "There are three things\nrequired to perform an\nexorcism. You do not\nhave all of them...",
+ "That wouldn't work.",
+ "It is already closed.",
+ "It is already smashed.",
+ "It is already open.",
+ "There is nothing in there.",
+ "You already have!",
+ "It already has some\nwater inside it.",
+ "You can see a very slight\ndepression in the earth\nwhere something spherical\nprobably once rested there.",
+ "It is already lit.",
+ "It is not lit.",
+ "Ok.",
+ "Now it's gone for ever!",
+ "It won't open!",
+ " LOST!\n\nNear the mighty boulder,\nMy precious crystal ball,\nI guess I couldn't hold 'er,\nSo I must've let her fall!\n\nIf anyone should find it,\nPlease return it to my keep,\nBe careful if you use it,\nFor its powers runneth deep!\n\nsigned: The old man.",
+ "My my, we are thorough,\naren't we? Well, just\nfor you:\n\nThere is a crystal ball\nlying behind the rock,\nglinting in the sun.\n\nYou fetch it out...",
+ "Ding dong!\n\n(Nothing happens...)",
+ "The ghost is impressed by\nyour fine acrobatics (but\nstill won't let you pass)!",
+ "Nobody answers!",
+ "It's not locked!",
+ "It is the handsome Hugo!",
+ "It is the pretty Penelope!",
+ "It doesn't look too badly damaged.",
+ "The vines look pretty sturdy.",
+ "Not the kind of guy you'd\nwant to meet in a dark alley!",
+ "It is the kind used to\nmold shapes with.",
+ "They look very sharp!",
+ "You see nothing out of\nthe ordinary about him",
+ "You see nothing out of\nthe ordinary about her",
+ "It is a flask for\nholding drinking water.",
+ "It is gray and furry\nand rather cute!",
+ "It is a small cage suitable\nfor holding small animals.",
+ "You can see a blowpipe with\nsome darts full of\nsleeping potion!",
+ "It's just sitting there,\nminding its own business!",
+ "It is a box of bouillon cubes\nnormally used as seasoning in\ncooking but often carried for\nemergency rations in aircraft.",
+ "You are looking at what appears\nto be the half-eaten remains of\na cheese sandwich.",
+ "It is an extremely\nvoracious-looking spider!",
+ "The scroll appears\nto have some writing\non it.",
+ "The crystal ball appears cloudy.",
+ "The ghost does not appear\nto be very friendly and\nwill not let you pass.",
+ "The bell is small and golden.\nIt makes a pleasant tinkling\nring which you find rather\ncomforting for some reason.",
+ "The book is old and very worn.\nThe pages although yellow with\nage, still have discernible\nwriting on them. You feel\nthe book has hidden powers.",
+ "The candle stick is golden and\nvery heavy. The flickering of\nthe candle feels comforting,\neven in the daylight.",
+ ".",
+ ".O4L1C.C.C.",
+ ".O1L2ECEG^C.vBL6^CvGAL2G.FL6E.",
+ ".O2L1CEG^C.",
+ ".O3L1CvGEC.",
+ ".O1L1AbAAbFAbAAbFAbAAbFAbAAbFAbAAbFAbAAbFAbAAbFAbAAbF.",
+ ".O0L1CC#CC#CC#CC#CC#CC#CC#CC#CC#.",
+ ".O1L3^CvL1G.GL3G#L1G.....L1B..^C.",
+ "O3L1E.vE^EF.vF^FE.vE^EF.vF^FE.F.G.A.G.A.B.^C.D.DbCvB.^D.Db.C.E.F.L4EFL6E.",
+ "O2L4G^CvGEL6CL2AGEL4GL9D.",
+ ".O2L1AAbAA#BAL2G^CvGL1^CvC.",
+ ".O2L1DGB^D.vB^L5D.",
+ ".O3L0F.FC.CvA..ABb^F.DvBb.^C.CvA.AF..FG^E.vBbG.F.FA.A^C.vBb.Bb^D.DF.C.CE.EG....CEGBbGE.FCvAF...vFCvAF.",
+ ".O2L0EFF#GGbFE."
+};
+
+// Added by Strangerke
+const char *string_t_Data_1w[] = {""};
+const char *string_t_Data_2w[] = {""};
+const char *string_t_Data_3w[] = {""};
+const char *string_t_Data_2d[] = {""};
+const char *string_t_Data_3d[] = {""};
+
+//***************************************************************************
+// Hugo 1 Dos - Only Hugo 1 DOS doesn't use a DAT file to store those strings
+//***************************************************************************
+const char *string_t_Data_1d[] = {
+ "",
+ "There is nothing in there",
+ "Ok.",
+ "The pumpkin breaks open to reveal:\n\nA key!",
+ "There is a little penknife lying\nin the dust on the floor",
+ "There is a little whistle lying\nin the dust on the floor",
+ "I don't see anything much\nin here... Wait! there\nis a little penknife lying\nin the dust on the floor\nand next to it is a little\nsilver whistle",
+ "Now it's gone for ever!",
+ "Hmm... that seems to have had\na strange effect on the bats!",
+ "Hey, what do you know!!!\nYou appear to have confused\nthe bats' sense of direction.\nIt must be something to do\nwith their sonar-like hearing!",
+ "Care for a chop, sir?", // Prompt
+ "yes", // Response
+ "This door appears to be locked\nwith a combination lock.\nWhat's the combination?",
+ "333", // 333
+ "You appear to be having a\nlittle difficulty here...\n\nWould you like some help?",
+ "You still appear to be having\na little difficulty here...\n\nWould you like some help?",
+ "What was the first name of\nthe hero in 'The Hobbit'?",
+ "Where did Aslan live?\n(Hint: Not in a wardrobe!)",
+ "Who invented Count Dracula?",
+ "What should you do with a\nPan-galactic gargle blaster?\n(a) Ride it\n(b) Fire it\n(c) Drink it\n(d) Run away from it",
+ "And now a riddle:\nWhat's the name of the only\nmammal that can't fly\nthat can fly?",
+ "Nearly there, just 2 more to go!\n\nWhat was the name of Roy\nRogers's dog?",
+ "And lastly:\nAre you sure you want\nto rescue Penelope??",
+ "'Z^]c", // "bilbo"
+ "3Rdi]L", // "narnia"
+ "cSh4^]Ya'<", // "bram stoker"
+ "(", // "c",
+ "2R`", // "man"
+ "'f^gY_", // "bullet"
+ "Try walking there!",
+ "Nothing happens...",
+ "I see no purpose\nin doing that!",
+ "I'm afraid I have no idea!",
+ "You see nothing very\ninteresting about it",
+ "You find nothing of\nany interest inside!",
+ "Seeing how ferocious he looks,\nyou may well be better off\nthrowing it!!",
+ "I love your sense of humor!",
+ "Since you can't lift it\nI don't see how you can\nlook under it!",
+ "No jumping allowed in this game!",
+ "You try but fail miserably!",
+ "You ought to be aware that\ntalking to oneself is\nthe first sign of madness!",
+ "You know you really should\ncurb those violent tendencies!",
+ "You should try to be\nmore constructive!",
+ "All is quiet!",
+ "It has an indistinct aroma!",
+ "Why, is it falling?",
+ "Try pressing the F1 key!",
+ "An oak tree, I think",
+ "It's a pretty boring fence",
+ "It sure is a spooky looking house.\nI think you should go inside!",
+ "I can see no more than you can!",
+ "You'll go blind!",
+ "Yeuch! Raw pumpkin? No thanks!",
+ "Nice try!\n\nNothing under there, though!",
+ "You are in front of the house\nwhere Penelope was last seen.\n\nIf you are to rescue her, you\nmust find a way inside, no\nmatter what lies ahead...!",
+ "I'd rather not,\nit's too scary!",
+ "An exquisitely bad work of art",
+ "It is a small round wooden\ntable, useful for putting\nthings on, like candles",
+ "There are some rooms upstairs",
+ "It is a candle",
+ "You are in the hall. It sounds as\nif a big feast or something is\ngoing on in the room on the right.\nThere is a flight of stairs to the\nleft. So far your presence has\ngone undetected!",
+ "You can hear the sounds of a\nfeast in the room to the right",
+ "You get down on your hands and\nknees and peer under the bed to\nfind... absolutely nothing!",
+ "This is not the time\nfor a snooze!!",
+ "It certainly looks like a\nwardrobe, wonder what's inside!",
+ "It looks more like a wardrobe!",
+ "It's pretty dark out there,\nyou can just make out the\noutline of a shed below,\nin amongst some trees",
+ "I'd describe it more like a mask",
+ "You are in one of the upstairs\nbedrooms. There doesn't appear\nto be much of any interest at\nall in here.",
+ "That's some kind of spread. I don't\nknow whether I'd want to taste any\nof it, though!",
+ "I'd stay out of his way\nif I were you!",
+ "It's pretty, but useless!",
+ "It is Zelda, wicked witch\nof the west!",
+ "Apart from the moon,\nthere's not much to see",
+ "It doesn't look very tempting\nbesides, there's very little left",
+ "Just your regular old monster type",
+ "But what would Penelope say?",
+ "A feast is in full swing here in\nthe dining room. Some of the\nguests look rather ugly! Something\ntells me this is not a good place\nto be unless, of course, you want\nto end up on the dinner plate!",
+ "But you're not invited!",
+ "I think you should\nwait for the butler to\noffer you something!",
+ "These guys are only\ninterested in eating!",
+ "Get lost, dweeb!",
+ "The butler is too busy\nto engage in chit-chat",
+ "Please control yourself until\nyou rescue Penelope!!",
+ "All you can hear are various\nslurping and chomping sounds",
+ "Hugo says he's not thirsty!",
+ "There appears to be something\ndaubed on the mirror in red.\nIt looks like the number \"333\"",
+ "I'd rather not, thanks",
+ "You have arrived at the bathroom.",
+ "Yeugh! How uncouth!",
+ "You don't have\ntime for that!!",
+ "Look, are you taking this\ngame seriously, or what?",
+ "Peering inside, you find nothing\nto write home about!",
+ "It's pretty dark out there,\nyou can just make out the\noutline of a shed, in\namongst some trees",
+ "A pretty ordinary\nlooking broom",
+ "Gonna do some sweeping\nare we?\nHey! the broom must\nbe gripped by some\nmagical powers! Despite\nyour best efforts you\ncan't budge it!!",
+ "Nothing happens...\n(You look pretty silly, too!)",
+ "From the looks of it, this\nis the kitchen. You can hear\nthe sounds of a feast or some-\nthing going on in the room to\nthe right.",
+ "They have a housemaid\nto do that!!",
+ "It probably warrants further\ninvestigation inside!",
+ "You shinny up the tree,\nfind lots of branches\nand leaves and stuff,\nand shinny down again.\nGood excercise, huh?",
+ "Everything in the garden\nis as it seems!",
+ "You are behind the house, now,\nin what appears to be a small\nfenced in yard. To the rear\nof the garden is a little shed",
+ "Please say 'undo bolt'",
+ "You rummage around in the\nhole and feel something soft\nand slightly moist.\nPhew! A medium sized pile of\nmouse droppings!!",
+ "For goodness sakes!!\nGive me a break!",
+ "This is a pretty empty looking\nroom adjoining the kitchen.\nThe only thing of any interest\nthat immediately catches your\neye is a rather large and ugly\nlooking dog!",
+ "Looking through the door,\nyou can make out your\nbeloved Penelope's tear-\nstreaked face!",
+ "Nice try!\n\nToo bad all you end up with\nis an oily door that still\nwon't budge!",
+ "Grunt! Grunt! Heave! Phew!!\nNope! This door won't budge!",
+ "You examine every rock\nin minute detail and\ncome up with: Zilch!",
+ "This door is impregnable!\nTry as you might, it\nis impervious to\nyour attack!",
+ "Are you kidding? Well,\nI suppose you had to\ntry! Needless to say,\nthe door is locked!",
+ "Well, for a start there's\nno keyhole and secondly\nno bolts either!",
+ "Nobody answers... (Surprised?)",
+ "Penelope, alas, can't speak\nsince she is gagged!",
+ "All you can hear is\nsome muffled sobbing!",
+ "You are below the house now. The\nwalls appear to be partly hewn out\nof rock. To the right of the\nbasement is a large, extremely\nheavy looking door. You can hear\nthe muffled sounds of someone\nsobbing!",
+ "You are in a cave full\nof bats.",
+ "Seen one rock, seen 'em all!",
+ "You are in a cave\nwith the mummy's tomb!",
+ "The tomb looks very unusual,\nbut then you don't see one\nevery day, do you?!",
+ "You are now in a large open cavern.\nThere is a small underground lake\nhere, at the far side of which is\nsome sort of jetty and a very old\nlooking man who appears to be just\nsitting on the jetty, fishing.\n\nTo the far right, at the back of\nthe cavern, you can see a tunnel!",
+ "You'd be a lot better off\nin the boat, my friend!",
+ "You must be more specific.",
+ "You have arrived in a passage\nwith a room at the end. There\nis a large guard at the end who\nappears to be standing outside\na kind of jail. Wait! Behind\nthe guard you can make out a\nfamiliar shape! Yes! It's\nPenelope, being held prisoner!",
+ "He doesn't understand you!",
+ "You have arrived in the\nmad-professor's laboratory!\nThere is a strange looking\nbox connected to some weird\nmachine with flashing lights.\n\nIn the left-hand corner of\nthe room is a little table\nwith an assortment of odd-\nshaped items on it.",
+ "Igor is good at taking orders\nbut is not much of a\nconversationalist!",
+ "'Look, just do as you're told,\nok ?'",
+ "You see lots of buttons\nand dials and flashing\nlights!\n\nPlease don't ask me to\ntry and figure it out!",
+ "I think you'd better\nleave that to Igor!",
+ "The only thing you recognize\nis a useful looking rubber\nbung!",
+ "The door to the professor's\nbox can only be opened\nand closed by the machine!",
+ "Lots of flashing lights!",
+ "I wonder what the whistle is for?",
+ "Nothing seems to happen...\nHey, maybe it's one of those\ndog whistles that only dogs\ncan hear!!",
+ "Nothing seems to happen",
+ "The high frequency cosmic\nradiation emanating from\nthis room knocks your mask\nonto the floor!\n(You can pick it up again\nwhen you come out!)",
+ "Very good sir, <sniff>",
+ "'Ere! just a moment! You're\nnot one of us, you're a bloomin'\ninterloper! Come 'ere you\nlittle blighter, I'm going to\n chop yer 'ead off!!",
+ "It appears your game is up, so to\nspeak. The butler deftly slices\nyour head off with a handy carving\nknife. So much for rescuing\nPenelope!",
+ "Very good sir, <sniff>, enjoy!",
+ "The butler hands you a\njuicy looking chop.\nYou take it from him\nwith a polite 'Thank you'",
+ "Very good sir, <sniff>,\nperhaps a little later.",
+ "Mmmm! You feel\nsomewhat invigorated!",
+ "That seems to have caught\nthe dog's attention! It\nlooks like he's going to\nbe rather busy for a while!",
+ "I'm sorry, that combination\ndoesn't seem to work!",
+ "Bingo! The door opens...",
+ "Oh dear, it seems the\nnice doggy has eaten\nyou all up!\n\nYou'll never get to rescue\nPenelope this way!",
+ "You casually throw the mask away,\nsince you won't be needing\nit any more!",
+ "The trapdoor appears to be\nbolted shut!",
+ "Well, the answer to this puzzle\nis extremely simple. In fact,\nyou don't have to type anything!",
+ "Oh very well then...\n\nGood luck!",
+ "OK, here's the scoop...\nWalk between the rocks!",
+ "Gotcher!!",
+ "Oh dear, you seem to have\nwandered a bit too close\nto one of the vampire bats!\n\nLooks like it's curtains\nfor you, now you'll never\nbe able to rescue Penelope!",
+ "Oh how careless! You seem\nto have landed yourself in\nthe clutches of the evil mummy!\n\nWell, since it's curtains\nfor you, you'll never be able\nto rescue your sweetheart!",
+ "I'm afraid the boat has\na hole in the bottom!\nUnless you can plug it\nwith something, this\nboat will surely sink\nbefore you get to the\nother shore!",
+ "The old man is blocking\nyour path!",
+ "Shutup and enjoy the ride, buster!",
+ "The boat wobbles a bit\nbut doesn't really go\nanywhere due to the fact\nthat it is still tied to\nthe post!",
+ "Correct! And the next\nquestion is:",
+ "I'm sorry, that is incorrect",
+ "Since you have failed to\nanswer my questions I\nhereby doom you to float\nforever on my lake!",
+ "Well in that case, I can hardly\nlet you pass can I? You do\nunderstand don't you? In all\ngood conscience I feel I must\nnow doom you to float forever\nhere on this lake of mine!!!",
+ "Wonderful! Thou art truly a\nnoble and wise adventurer!!\n\nGo in peace, my friend and\ngood luck in thy mission!",
+ "The old man seems about to speak...",
+ "Ah! Welcome to my lake, my fine\nyoung friend. I have been waiting\nfor you! I am well aware of your\nquest and I would hasten you on your\nway. However, before I let you pass\nI must satisfy myself that you have\nthe experience to handle the dangers\nthat lurk through yonder passage...",
+ "To this end, you will permit me\nto test your mettle with a few\nquestions the answers to which\nwould come readily to the lips\nof any seasoned adventurer.\n\nBe warned, however that I can\nonly accept your first answer!",
+ "The old man clears his throat\nand asks:",
+ "The old man has nothing\nmore to say to you!",
+ "Congratulations!!",
+ "You are so glad to have rescued\nPenelope, you dance for joy!",
+ "After cutting her ropes with\nyour penknife, you open the\nbolts of the jail door and find\nyourself back in the basement!",
+ "From here you trip hand in hand\nup the basement stairs, past the\nferocious doggy, through the\nkitchen and out the front door\nto freedom!\n\n(And live happily ever after!)",
+ "You hand over one coin from\nyour little bag of golden coins!",
+ "He makes a gruff noise which\nyou assume was a 'Thank you'\nand steps aside allowing you\nto pass!\n\nNearly there, Hugo!",
+ "Your generous gift is refused!",
+ "Goodbye!",
+ "Too bad! In your current state\nyou can't grip the door handle\nto open it!",
+ "Too bad! In your current state\nyou can't coordinate your hand\nto turn the door handle!",
+ "Too bad! In your current state\nyou can't reach the door handle!",
+ "The mad professor speaks:\n\nAh! There you are!\nI've been looking all over\nthe house for you! Look,\nyou're late and we haven't\nmuch time! Step into the\nbox and we'll begin the\nexperiment!",
+ "The professor beckons you\nto step into the large cubicle\nin the center of the room",
+ "'Good!', says the professor.\n'Ok, Igor, press the BLUE button!'",
+ "Igor grumbles something\nincoherent and deftly\npresses the RED button!",
+ "'You idiot, Igor!!', roars the\nprofessor. 'That's all I need, a\ncolor-blind imbecile for an\nassistant!'\n\nOh dear, I've got my headache\ncoming on again! I've had\nenough hassle for one day, I'm\ngoing to have a lie down!'",
+ "The professor storms off, leaving\nyou alone with Igor...",
+ "Igor is fed up pressing buttons\nand refuses!!\n\nI think you should go while you\ncan!!",
+ "Igor deftly presses\nthe BLUE button!",
+ "Igor deftly presses\nthe GREEN button!",
+ "Igor deftly presses\nthe YELLOW button!",
+ "Igor refuses!",
+ "But you're not in\nthe box, master!",
+ "Nobody answers!",
+ "We are getting desperate,\naren't we!",
+ "No digging allowed!",
+ "Same to you, loser!",
+ "Nobody answers...!"
+};
+
+// Nouns and synonyms (N.B. put null string at end of last synonym)
+// For ambiguous substrings, e.g.lock, unlock, put longest first.
+// For objects, the first name is used as the file name
+// The second is used when hero types "look"
+// The third is used with the mouse pointer
+
+// Ambiguous ones (multi-version)
+const char *nBell_2w[] = {"bell", "a bell", "bell", ""};
+const char *nBell_3w[] = {"bell", "a golden bell", "bell", ""};
+const char *nBlock_3w[] = {"block", ""};
+const char *nBook_2w[] = {"book", "book", "book", ""};
+const char *nBook_3w[] = {"book", "a spell book", "book", "spell", ""};
+const char *nCage_3w[] = {"cage", "a little cage", "cage", "door", ""};
+const char *nCandle_1w[] = {"candle", "a candle", "candle", ""};
+const char *nCandle_3w[] = {"candle", "a golden candle", "candle", ""};
+const char *nCupb_1w[] = {"cupboard", "cabinet", "cupboard", "dresser", "hutch", "sideboard", "bureau", ""};
+const char *nCupb_2w[] = {"cupboard", "cabinet", "cupboard", "hutch", "dresser", "sideboard", "bureau", "desk", "drawer", ""};
+const char *nDoctor_2w[] = {"doctor", "man", "Strange man", ""};
+const char *nDoctor_3w[] = {"doctor", "witch", "Witch Doctor", "native", "man", ""};
+const char *nDog_1w[] = {"dog", "~", "dog", ""};
+const char *nDog_2w[] = {"dog", "dog", "dog", ""};
+const char *nDoor_1w[] = {"door", "~", "door", ""};
+const char *nDoor_2w[] = {"door", "gate", "door", ""};
+const char *nDoor_3w[] = {"door", ""};
+const char *nHero_1w[] = {"hero", "self", "Hugo", "hugo", ""};
+const char *nHero_2w[] = {"hero", "self", "Hugo", ""};
+const char *nKey_1w[] = {"xkey", "a door key", " key", ""};
+const char *nKey_2w[] = {"key", "key", "key", ""};
+const char *nKnife_1w[] = {"knife", "a penknife", "penknife", ""};
+const char *nKnife_2w[] = {"knife", "knife", "knife", ""};
+const char *nLips_1w[] = {"lips", ""};
+const char *nOldman_1w[] = {"oldman", "old", "Old man", "man", ""};
+const char *nOldman_2w[] = {"oldman", "old", "man", ""};
+const char *nPenny_2w[] = {"penelope", "woman", "Penelope", "girl", "lady", ""};
+const char *nPennylie_2w[] = {"pennylie", "woman", "Penelope", ""};
+const char *nRope_1w[] = {"rope", "some rope", "rope", "string", ""};
+const char *nRope_2w[] = {"rope", "string", "rope", ""};
+const char *nShed_1w[] = {"shed", "~", "shed", ""};
+const char *nShed_2w[] = {"shed", ""};
+const char *nSnake_2w[] = {"snake", "snake", "snake", ""};
+const char *nSnake_3w[] = {"snake", ""};
+const char *nTrap_1w[] = {"trap", "~", "trapdoor", ""};
+const char *nTrap_2w[] = {"trap", ""};
+const char *nWard_1w[] = {"wardrobe", "cabinet", "closet", "door", ""};
+const char *nWard_2w[] = {"wardrobe", "cabinet", "closet", ""};
+const char *nWhero_1w[] = {"whero", "~", "Hugo", ""};
+
+const char *nBed_1w[] = {"bed", "~", "bed", ""};
+const char *nBed_2w[] = {"bed", "bed", "bed", ""};
+const char *nBlock_2w[] = {"block", "brick", "blocks", ""};
+const char *nBridge_2w[] = {"bridge", "~", "bridge", ""};
+const char *nBridge_3w[] = {"bridge", ""};
+const char *nBroom_1w[] = {"broom", "~", "broom", ""};
+const char *nBroom_2w[] = {"broom", "brush", ""};
+const char *nCage_2w[] = {"cage", "pen", "playpen", ""};
+const char *nDroppings_1w[] = {"droppings", ""};
+const char *nFence_1w[] = {"fence", "~", "fence", ""};
+const char *nFence_2w[] = {"fence", "hedge", "bush", ""};
+const char *nFood_1w[] = {"food", "plate", "food", ""};
+const char *nFood_2w[] = {"food", "plate", ""};
+const char *nFood_3w[] = {"food", "meat", "hyena", ""};
+const char *nGardenbits_1w[] = {"grass", "fence", "Branch", "path", ""};
+const char *nGround_1w[] = {"ground", "floor", ""};
+const char *nHouse_1w[] = {"house", ""};
+const char *nLight_1w[] = {"light", "lamp", ""};
+const char *nMan_1w[] = {"man", "dracula", "monster", "frank", "alien", "guest", "vampire", ""};
+const char *nMan_2w[] = {"man", ""};
+const char *nMirror_1w[] = {"mirror", "~", "mirror", ""};
+const char *nMoon_1w[] = {"moon", ""};
+const char *nMouse_2w[] = {"mouse", "rat", "rodent", "animal", "furry", ""};
+const char *nMouse_3w[] = {"mouse", "rat", "mouse", "rodent", "animal", "furry", ""};
+const char *nMousehole_1w[] = {"hole", "~", "mousehole", ""};
+const char *nMousehole_2w[] = {"hole", "~", "mouse hole", ""};
+const char *nPicture_1w[] = {"picture", "painting", "picture", ""};
+const char *nPlant_1w[] = {"plant", "flower", "pot plant", "vase", ""};
+const char *nPlant_2w[] = {"plant", "flower", "plant", "vase", ""};
+const char *nRock_1w[] = {"rock", "boulder", "rock", "stone", ""};
+const char *nRock_2w[] = {"rock", "boulder", "rockfall", "stone", ""};
+const char *nRock_3w[] = {"rock", "stone", "boulder", ""};
+const char *nRoof_1w[] = {"roof", "chimney", ""};
+const char *nSink_1w[] = {"sink", ""};
+const char *nSky_1w[] = {"sky", "ceiling", ""};
+const char *nStairs_1w[] = {"stairs", "landing", ""};
+const char *nStairs_2w[] = {"stair", "landing", "ladder", ""};
+const char *nTable_1w[] = {"table", "~", "table", ""};
+const char *nTable_2w[] = {"table", "bench", ""};
+const char *nTree_1w[] = {"tree", "~", "tree", ""};
+const char *nTree_2w[] = {"tree", ""};
+const char *nUnits_1w[] = {"Unit", "oven", "cupboard", "sink", "cupb", "drawer", "pantry", "cabinet", "range", "counter", ""};
+const char *nUnits_2w[] = {"Unit", "oven", "sink", "cupb", "drawer", "pantry", "cabinet", "range", "counter", "cooker", ""};
+const char *nWall_1w[] = {"wall", ""};
+const char *nWater_2w[] = {"water", ""};
+const char *nWater_3w[] = {"water", "stream", "river", "pool", "lake", ""};
+const char *nWindow_1w[] = {"window", "outside", "window", "inside", ""};
+const char *nWindow_3w[] = {"window", "~", "window", ""};
+const char *nWoman_1w[] = {"woman", "girl", "lady", ""};
+
+//Unique ones
+//***************************************************************************
+// Hugo 1 Windows
+//***************************************************************************
+const char *nDummy[] = {"",""};
+const char *nBat_1w[] = {"bat", "~", "bat", ""};
+const char *nEyes_1w[] = {"eyes", "~", "eyes", ""};
+const char *nBatpic_1w[] = {"bat", "~", "picture", ""};
+const char *nPkin_1w[] = {"pumpkin", "a pumpkin", "pumpkin", "punkin", ""};
+const char *nWhistle_1w[] = {"whistle", "a whistle", "whistle", ""};
+const char *nWdoorl_1w[] = {"wdoorl", ""};
+const char *nWdoorr_1w[] = {"wdoorr", ""};
+const char *nMask_1w[] = {"mask", "a mask", "mask", ""};
+const char *nButler_1w[] = {"butler", "waiter", "butler", "servant", ""};
+const char *nChop_1w[] = {"chop", "a juicy chop", "chop", "meat", "steak", ""};
+const char *nRedeyes_1w[] = {"redeyes", ""};
+const char *nArm_1w[] = {"arm", ""};
+const char *nHdlshero_1w[] = {"hdlshero", "~", "Hugo", ""};
+const char *nMonkey_1w[] = {"monkee", "~", "Hugo", ""};
+const char *nCarpet_1w[] = {"carpet", "mat", "rug", ""};
+const char *nBolt_1w[] = {"bolt", "~", "bolt", ""};
+const char *nHerodead_1w[] = {"herodead", "~", "Hugo", ""};
+const char *nOilcan_1w[] = {" oil", "an oilcan", "oilcan", ""};
+const char *nMummy_1w[] = {"mummy", "monster", "Mummy", ""};
+const char *nMdoor_1w[] = {"mdoor", "~", "tomb", ""};
+const char *nGold_1w[] = {"gold", "a bag of gold", "gold", "money", "treasure", "bag", "jewels", ""};
+const char *nBoat_1w[] = {"boat", "~", "boat", ""};
+const char *nGuard_1w[] = {"guard", "man", "Guard", ""};
+const char *nProf_1w[] = {"prof", "~", "Professor", ""};
+const char *nIgor_1w[] = {"igor", "man", "Igor", ""};
+const char *nBung_1w[] = {"bung", "a rubber bung", "bung", ""};
+const char *nGdoor_1w[] = {"glasdoor", "~", "door", ""};
+const char *nSpachero_1w[] = {"spachero", "~", "Hugo", ""};
+const char *nFuzyhero_1w[] = {"fuzyhero", "~", "Hugo", ""};
+const char *nSpark_1w[] = {"arc", ""};
+const char *nFrank_1w[] = {"frank", "monster", "Frankie", "man", ""};
+const char *nDracula_1w[] = {"drac", "monster", "Dracula", "man", ""};
+const char *nGwen_1w[] = {"gwen", "monster", "Gwendolin", "lady", ""};
+const char *nHood_1w[] = {"hood", "friar", "Hood", "monster", "man", ""};
+const char *nSlime_1w[] = {"slime", "monster", "Slime", "man", ""};
+const char *nPeahead_1w[] = {"pea", "monster", "Pea Head", "man", ""};
+const char *nFace_1w[] = {"face", "head", ""};
+const char *nWitch_1w[] = {"witch", ""};
+const char *nToilet_1w[] = {"toilet", "~", "toilet", ""};
+const char *nBath_1w[] = {"bath", "~", "tub", ""};
+const char *nPenelope_1w[] = {"penelope", ""};
+const char *nTomb_1w[] = {"tomb", "coffin", "tomb", "box", "sarcop", ""};
+const char *nBooth_1w[] = {"booth", "box", "cubicle", ""};
+const char *nMachinebits_1w[] = {"machine", "control", "button", "dial", "knob", "computer", ""};
+const char *nMachine_1w[] = {"machine", "~", "machine", ""};
+const char *nHands_1w[] = {"hands", ""};
+const char *nCut_1w[] = {"cut", ""};
+const char *nOil_1w[] = {"oil ", ""};
+
+const char **arrayNouns_1w[] = {
+ nDummy, nHero_1w, nTrap_1w, nWard_1w, nDoor_1w,
+ nBat_1w, nEyes_1w, nBatpic_1w, nPkin_1w, nCandle_1w,
+ nRope_1w, nCupb_1w, nKnife_1w, nWhistle_1w, nWdoorl_1w,
+ nWdoorr_1w, nMask_1w, nButler_1w, nChop_1w, nRedeyes_1w,
+ nLips_1w, nArm_1w, nHdlshero_1w, nMonkey_1w, nKey_1w,
+ nShed_1w, nDog_1w, nCarpet_1w, nBolt_1w, nHerodead_1w,
+ nOilcan_1w, nMummy_1w, nMdoor_1w, nGold_1w, nBoat_1w,
+ nOldman_1w, nWhero_1w, nGuard_1w, nProf_1w, nIgor_1w,
+ nBung_1w, nGdoor_1w, nSpachero_1w, nFuzyhero_1w, nSpark_1w,
+ nFrank_1w, nDracula_1w, nGwen_1w, nHood_1w, nSlime_1w,
+ nPeahead_1w, nSky_1w, nWall_1w, nGround_1w, nTree_1w,
+ nFence_1w, nHouse_1w, nRoof_1w, nLight_1w, nMoon_1w,
+ nPicture_1w, nTable_1w, nStairs_1w, nBed_1w, nFace_1w,
+ nPlant_1w, nWitch_1w, nFood_1w, nWoman_1w, nMan_1w,
+ nMirror_1w, nToilet_1w, nBath_1w, nSink_1w, nUnits_1w,
+ nBroom_1w, nGardenbits_1w, nMousehole_1w, nPenelope_1w, nRock_1w,
+ nTomb_1w, nBooth_1w, nDroppings_1w, nMachinebits_1w, nMachine_1w,
+ nHands_1w, nWindow_1w, nCut_1w, nOil_1w
+};
+
+//***************************************************************************
+// Hugo 2 Windows
+//***************************************************************************
+const char *nPenfall_2w[] = {"penfall", "woman", "Penelope", ""};
+const char *nSmoke_2w[] = {"smoke", "~", "~", ""};
+const char *nMaid_2w[] = {"maid", "waitress", "maid", "woman", "girl", "lady", ""};
+const char *nHallgo_2w[] = {"hallgo", "~", "~", ""};
+const char *nBookcase_2w[] = {"bookcase", "bookcase", "bookcase", ""};
+const char *nKeyhole_2w[] = {"hole", "hole", "keyhole", ""};
+const char *nPanel_2w[] = {"panel", ""};
+const char *nMatches_2w[] = {"matches", "a box of matches", "matches", "match", ""};
+const char *nCrate_2w[] = {"crate", "box", "box", ""};
+const char *nDumb_2w[] = {"dumb", "waiter", "dumb waiter", "box", ""};
+const char *nMurder_2w[] = {"murder", "~", "~", ""};
+const char *nGardner_2w[] = {"gard", "man", "gardener", ""};
+const char *nGate_2w[] = {"gate", "~", "gates", ""};
+const char *nRed_2w[] = {"red", "red", "red button", ""};
+const char *nYellow_2w[] = {"yellow", "yellow", "yellow button", ""};
+const char *nGreen_2w[] = {"green", "green", "green button", ""};
+const char *nBlue_2w[] = {"blue", "blue", "blue button", ""};
+const char *nFly_2w[] = {"fly", "~", "fly", ""};
+const char *nLeaf_2w[] = {"leaf", "~", "venus fly trap", ""};
+const char *nGarlic_2w[] = {"garlic", "some garlic", "garlic", "clove", ""};
+const char *nButton_2w[] = {"button", "switch", "button", "knob", ""};
+const char *nShedlight_2w[] = {"slight", "~", "light bulb", ""};
+const char *nGatelight_2w[] = {"glight", "~", "lantern", ""};
+const char *nZapper_2w[] = {"zapper", "lamp", "bug zapper", "light", "lantern", ""};
+const char *nBug_2w[] = {"bug", "insect", "bee", "wasp", ""};
+const char *nStick_2w[] = {"stick", "a pile of sticks", "stick", "twig", ""};
+const char *nDynamite_2w[] = {"dynamite", "a stick of dynamite", "dynamite", "fuze", "fuse", ""};
+const char *nKennel_2w[] = {"kennel", "house", "dog house", ""};
+const char *nWell_2w[] = {"well", "rope", "well", ""};
+const char *nBanana_2w[] = {"banana", "a moldy banana", "banana", ""};
+const char *nLamp_2w[] = {"lamp", "an old dusty oil lamp", "oil lamp", ""};
+const char *nGenie_2w[] = {"genie", "man", "Genie", ""};
+const char *nTardis_2w[] = {"tardis", "phone", "phone booth", ""};
+const char *nHarry_2w[] = {"harry", "man", "Harry", ""};
+const char *nHester_2w[] = {"hester", "woman", "Hester", "girl", "lady", ""};
+const char *nLetter_2w[] = {"letter", "envelope", "letter", "card", ""};
+const char *nRobot_2w[] = {"alek", "monster", "robot", ""};
+const char *nCook_2w[] = {"cook", "woman", "cook", "girl", "lady", ""};
+const char *nCookb_2w[] = {"cookb", ""};
+const char *nCop_2w[] = {"cop", "man", "Officer Higgins", ""};
+const char *nHorace_2w[] = {"horace", "man", "Horace", ""};
+const char *nCatnip_2w[] = {"catnip", "some catnip", "catnip", ""};
+const char *nCat_2w[] = {"cat", "puss", "cat", ""};
+const char *nGun_2w[] = {"gun", "a gun", "pistol", "revolver", "weapon", ""};
+const char *nPaper_2w[] = {"paper", "a newspaper", "newspaper", "notepad", " pad", "blotter", ""};
+const char *nPencil_2w[] = {"pencil", "a pencil", "pencil", " pen", ""};
+const char *nMagnify_2w[] = {"magnifier", "a magnifying glass", "magnifying glass", "magnify", "glass", ""};
+const char *nSafe_2w[] = {"safe", "safe", "safe", ""};
+const char *nScrew_2w[] = {"screwdriver", "sonic", "screwdriver", ""};
+const char *nWill_2w[] = {"will", "print", "Horace's will", ""};
+const char *nAlbum_2w[] = {"album", "photo", "album", ""};
+const char *nBottle_2w[] = {"bottle", "a bottle", "serum", ""};
+const char *nBalloon_2w[] = {"balloon", "balloon", "balloon", ""};
+
+const char *nBird_2w[] = {"bird", "budgie", "parrot", ""};
+const char *nPhone_2w[] = {"phone", "phone", "phone", ""};
+const char *nBlotpad_2w[] = {"blotter", "~", "blotter", ""};
+const char *nDrawer_2w[] = {"drawer", "~", "drawer", ""};
+const char *nChair_2w[] = {"chair", "seat", "couch", "settee", ""};
+const char *nTools_2w[] = {"tools", "hammer", "tools", "pliers", "screw", "knife", "saw", ""};
+const char *nBucket_2w[] = {"bucket", "container", ""};
+const char *nWand_2w[] = {"wand", ""};
+const char *nHole_2w[] = {"hole", "~", "chasm", ""};
+const char *nHandle_2w[] = {"handle", "lever", ""};
+const char *nChute_2w[] = {"chute", "~", "chute", ""};
+const char *nOrgan_2w[] = {"organ", "piano", "organ", "pipe", ""};
+const char *nPost_2w[] = {"post", "pole", "scratching post", ""};
+const char *nGraf_2w[] = {"graffiti", "graf", "graffiti", "writing", ""};
+const char *nSwitch_2w[] = {"switch", "~", "switch", ""};
+
+const char **arrayNouns_2w[] = {
+ nDummy, nHero_2w, nPenny_2w, nPennylie_2w, nPenfall_2w,
+ nSmoke_2w, nLips_1w, nMaid_2w, nHallgo_2w, nBookcase_2w,
+ nBook_2w, nKeyhole_2w, nPanel_2w, nMatches_2w, nCrate_2w,
+ nDumb_2w, nMurder_2w, nGardner_2w, nTrap_2w, nWard_2w,
+ nDoor_2w, nGate_2w, nRope_2w, nRed_2w, nYellow_2w,
+ nGreen_2w, nBlue_2w, nFly_2w, nLeaf_2w, nCupb_2w,
+ nGarlic_2w, nButton_2w, nShedlight_2w, nGatelight_2w, nZapper_2w,
+ nBug_2w, nKnife_2w, nShed_2w, nOldman_2w, nSnake_2w,
+ nStick_2w, nDynamite_2w, nKennel_2w, nDog_2w, nWell_2w,
+ nBanana_2w, nLamp_2w, nGenie_2w, nTardis_2w, nHarry_2w,
+ nHester_2w, nLetter_2w, nDoctor_2w, nRobot_2w, nCook_2w,
+ nCookb_2w, nCop_2w, nHorace_2w, nBell_2w, nCatnip_2w,
+ nCat_2w, nGun_2w, nPaper_2w, nPencil_2w, nKey_2w,
+ nMagnify_2w, nSafe_2w, nScrew_2w, nWill_2w, nAlbum_2w,
+ nBottle_2w, nBalloon_2w, nSky_1w, nWall_1w, nGround_1w,
+ nTree_2w, nFence_2w, nHouse_1w, nRoof_1w, nLight_1w,
+ nMoon_1w, nPicture_1w, nTable_2w, nStairs_2w, nBed_2w,
+ nPlant_2w, nFood_2w, nWoman_1w, nMan_2w, nMirror_1w,
+ nSink_1w, nUnits_2w, nBroom_2w, nGardenbits_1w, nRock_2w,
+ nDroppings_1w, nWindow_1w, nBird_2w, nCage_2w, nPhone_2w,
+ nBlotpad_2w, nDrawer_2w, nChair_2w, nTools_2w, nBridge_2w,
+ nWater_2w, nBucket_2w, nMouse_2w, nWand_2w, nHole_2w,
+ nMousehole_2w, nHandle_2w, nChute_2w, nOrgan_2w, nPost_2w,
+ nGraf_2w, nSwitch_2w, nBlock_2w
+};
+
+//***************************************************************************
+// Hugo 3 Windows
+//***************************************************************************
+const char *nHero_old_3w[] = {"hero_old", "~", "Hugo", ""};
+const char *nWheroold_3w[] = {"wheroold", "~", "Hugo", ""};
+const char *nPlane_3w[] = {"plane", "craft", "cabin", "cockpit", ""};
+const char *nCdoor_3w[] = {"door", "cage", "door", "gate", ""};
+const char *nVine_3w[] = {"vine", "rope", "vine", ""};
+const char *nSwinger_3w[] = {"swinger", ""};
+const char *nSteps_3w[] = {"step", "step", "stones", ""};
+const char *nClay_3w[] = {"clay", "some clay", "modelling clay", "plasticine", "model", "effigy", "voodoo", "doll", ""};
+const char *nDoorlock_3w[] = {"lock", ""};
+const char *nNeedles_3w[] = {"needle", "some pins", "needles", "pin", ""};
+const char *nNative_3w[] = {"native", "man", "native", "lady", ""};
+const char *nNat1_3w[] = {"nat1", "man", "native", ""};
+const char *nNat2_3w[] = {"nat2", "man", "native", ""};
+const char *nNat3_3w[] = {"nat3", "man", "native", ""};
+const char *nNatb_3w[] = {"natb", "man", "native", ""};
+const char *nNatg_3w[] = {"natg", "man", "native girl", "girl", ""};
+const char *nBottles_3w[] = {"bottles", ""};
+const char *nFlask_3w[] = {"flask", "a water flask", "flask", "water", "remedy", "antidote", ""};
+const char *nPipe_3w[] = {"blowpipe", "blowpipe and darts", "blowpipe", "dart", ""};
+const char *nElephant_3w[] = {"elephant", "animal", "elephant", ""};
+const char *nE_eyes_3w[] = {"e_eyes", ""};
+const char *nBouillon_3w[] = {"bouillon", "bouillon cubes", "bouillon cubes", "bouil", "boull", "boulion", "cube", "season", "oxo", "knorr", ""};
+const char *nMoushole_3w[] = {"moushole", ""};
+const char *nDoclie_3w[] = {"doclie", ".", "witch doctor", ""};
+const char *nCheese_3w[] = {"cheese", "a sandwich", "sandwich", ""};
+const char *nSpider_3w[] = {"spider", "insect", "spider", "tarantula", ""};
+const char *nFire_3w[] = {"fire", "flame", "pot", ""};
+const char *nDocbits_3w[] = {"skull", "shield", "torch", "spear", "bone", ""};
+const char *nFire_1_3w[] = {"fire_1", ""};
+const char *nFire_2_3w[] = {"fire_2", ""};
+const char *nFire_3_3w[] = {"fire_3", ""};
+const char *nFroth_3w[] = {"froth", ""};
+const char *nScroll_3w[] = {"scroll", "an old scroll", "scroll", "writing", ""};
+const char *nCrystal_3w[] = {"crystal", "a crystal ball", "crystal ball", "ball", ""};
+const char *nGhost_3w[] = {"ghost", "ghoul", "ghost", "spirit", ""};
+const char *nRush_3w[] = {"rushes", "ferns", "bullrushes", ""};
+
+const char *nPool_3w[] = {"pool", "pool", "pool", ""};
+const char *nWaterfall_3w[] = {"waterfall", "waterfall", "waterfall", ""};
+const char *nShelfbits_3w[] = {"shelf", "bottle", "jar", "medicine", "label", ""};
+const char *nJungle_3w[] = {"tree", "vine", "flower", "fern", "frond", "plant", "jungle", "undergrowth", ""};
+const char *nOrchid_3w[] = {"orchid", "flower", "plant", ""};
+const char *nPole_3w[] = {"pole", "stick", "wood", ""};
+const char *nHut_3w[] = {"hut", "house", "hut", "shed", ""};
+const char *nAircraft_3w[] = {"aircraft", ""};
+const char *nPlant1_3w[] = {"plant1", ""};
+const char *nPlant2_3w[] = {"plant2", ""};
+const char *nPlant3_3w[] = {"plant3", ""};
+const char *nPlant4_3w[] = {"plant4", ""};
+const char *nPlant5_3w[] = {"plant5", ""};
+const char *nWeb_3w[] = {"web", ""};
+const char *nO_eye_3w[] = {"o_eye", ""};
+const char *nFire_4_3w[] = {"fire_4", ""};
+const char *nMouth_3w[] = {"mouth", ""};
+const char *nThem_3w[] = {"them", ""};
+
+const char **arrayNouns_3w[] = {
+ nDummy, nHero_2w, nWhero_1w, nHero_old_3w, nPenny_2w,
+ nPennylie_2w, nLips_1w, nPlane_3w, nDoor_3w, nBlock_3w,
+ nCdoor_3w, nVine_3w, nSwinger_3w, nSteps_3w, nDoctor_3w,
+ nClay_3w, nDoorlock_3w, nNeedles_3w, nNative_3w, nNat1_3w,
+ nNat2_3w, nNat3_3w, nNatb_3w, nNatg_3w, nBottles_3w,
+ nFlask_3w, nPipe_3w, nElephant_3w, nE_eyes_3w, nBouillon_3w,
+ nMoushole_3w, nDoclie_3w, nCheese_3w, nCage_3w, nSpider_3w,
+ nSnake_3w, nFire_3w, nDocbits_3w, nFire_1_3w, nFire_2_3w,
+ nFire_3_3w, nScroll_3w, nCrystal_3w, nGhost_3w, nBell_3w,
+ nBook_3w, nCandle_3w, nRush_3w, nSky_1w, nWall_1w,
+ nGround_1w, nFence_2w, nBridge_3w, nWater_3w, nPool_3w,
+ nWaterfall_3w, nMouse_3w, nWindow_3w, nShelfbits_3w, nOrchid_3w,
+ nPole_3w, nHut_3w, nRock_3w, nAircraft_3w, nPlant1_3w,
+ nPlant2_3w, nPlant3_3w, nPlant4_3w, nPlant5_3w, nJungle_3w,
+ nWeb_3w, nO_eye_3w, nFire_4_3w, nMouth_3w, nFood_3w,
+ nThem_3w
+};
+
+//***************************************************************************
+// Hugo 1 Dos
+//***************************************************************************
+
+const char *nHero_1d[] = {"hero", "self", ""};
+const char *nTrap_1d[] = {"trap", ""};
+const char *nWard_1d[] = {"wardrobe", "closet", "cabinet", ""};
+const char *nDoor_1d[] = {"door", ""};
+const char *nBat_1d[] = {"bat", ""};
+const char *nEyes_1d[] = {"eyes", ""};
+const char *nPkin_1d[] = {"pumpkin", ""};
+const char *nCandle_1d[] = {"candle", ""};
+const char *nRope_1d[] = {"rope", "string", ""};
+const char *nCupb_1d[] = {"cupboard", "cabinet", "dresser", "hutch", "sideboard", "bureau", ""};
+const char *nKnife_1d[] = {"knife", "penknife", ""};
+const char *nWhistle_1d[] = {"whistle", ""};
+const char *nWdoorl_1d[] = {"wdoorl", ""};
+const char *nWdoorr_1d[] = {"wdoorr", ""};
+const char *nMask_1d[] = {"mask", ""};
+const char *nButler_1d[] = {"butler", "waiter", "servant", ""};
+const char *nChop_1d[] = {"chop", "meat", "steak", ""};
+const char *nRedeyes_1d[] = {"redeyes", ""};
+const char *nLips_1d[] = {"lips", ""};
+const char *nArm_1d[] = {"arm", ""};
+const char *nHdlshero_1d[] = {"hdlshero", ""};
+const char *nMonkey_1d[] = {"monkey", ""};
+const char *nKey_1d[] = {"key", ""};
+const char *nDog_1d[] = {"dog", ""};
+const char *nCarpet_1d[] = {"carpet", "rug", "mat", ""};
+const char *nBolt_1d[] = {"bolt", ""};
+const char *nHerodead_1d[] = {"herodead", ""};
+const char *nOilcan_1d[] = {" oil", ""};
+const char *nMummy_1d[] = {"mummy", ""};
+const char *nMdoor_1d[] = {"mdoor", ""};
+const char *nGold_1d[] = {"gold", "money", "treasure", "bag", "jewels", ""};
+const char *nBoat_1d[] = {"boat", ""};
+const char *nWhero_1d[] = {"whero", ""};
+const char *nOldman_1d[] = {"oldman", "old", "man", ""};
+const char *nGuard_1d[] = {"guard", "man", ""};
+const char *nProf_1d[] = {"prof", ""};
+const char *nIgor_1d[] = {"igor", "man", ""};
+const char *nBung_1d[] = {"bung", ""};
+const char *nGdoor_1d[] = {"glasdoor", "door", ""};
+const char *nSpachero_1d[] = {"spachero", ""};
+const char *nFuzyhero_1d[] = {"fuzyhero", ""};
+const char *nArc_1d[] = {"arc", ""};
+
+const char *nTree_1d[] = {"tree", ""};
+const char *nFence_1d[] = {"fence", ""};
+const char *nPicture_1d[] = {"picture", "painting", ""};
+const char *nTable_1d[] = {"table", ""};
+const char *nBed_1d[] = {"bed", ""};
+const char *nPlant_1d[] = {"plant", "flower", "vase", ""};
+const char *nFood_1d[] = {"food", "plate", ""};
+const char *nMan_1d[] = {"man", "monster", "dracula", "frankenstein", "alien", "guest", "vampire", ""};
+const char *nMirror_1d[] = {"mirror", ""};
+const char *nToilet_1d[] = {"toilet", ""};
+const char *nBath_1d[] = {"bath", "tub", ""};
+const char *nUnits_1d[] = {"Unit", "oven", "sink", "cupb", "drawer", "pantry", "cabinet", "range", "counter", ""};
+const char *nBroom_1d[] = {"broom", ""};
+const char *nMousehole_1d[] = {"hole", ""};
+const char *nRock_1d[] = {"rock", "boulder", "stone", ""};
+const char *nTomb_1d[] = {"tomb", "coffin", "box", "sarcop", ""};
+const char *nWindow_1d[] = {"window", "outside", "inside", ""};
+
+const char **arrayNouns_1d[] = {
+ nDummy, nHero_1d, nTrap_1d, nWard_1d, nDoor_1d,
+ nBat_1d, nEyes_1d, nPkin_1d, nCandle_1d, nRope_1d,
+ nCupb_1d, nKnife_1d, nWhistle_1d, nWdoorl_1d, nWdoorr_1d,
+ nMask_1d, nButler_1d, nChop_1d, nRedeyes_1d, nLips_1d,
+ nArm_1d, nHdlshero_1d, nMonkey_1d, nKey_1d, nShed_2w,
+ nDog_1d, nCarpet_1d, nBolt_1d, nHerodead_1d, nOilcan_1d,
+ nMummy_1d, nMdoor_1d, nGold_1d, nBoat_1d, nWhero_1d,
+ nOldman_1d, nGuard_1d, nProf_1d, nIgor_1d, nBung_1d,
+ nGdoor_1d, nSpachero_1d, nFuzyhero_1d, nArc_1d, nSky_1w,
+ nWall_1w, nGround_1w, nTree_1d, nFence_1d, nHouse_1w,
+ nRoof_1w, nLight_1w, nMoon_1w, nPicture_1d, nTable_1d,
+ nStairs_1w, nBed_1d, nFace_1w, nPlant_1d, nWitch_1w,
+ nFood_1d, nWoman_1w, nMan_1d, nMirror_1d, nToilet_1d,
+ nBath_1d, nSink_1w, nUnits_1d, nBroom_1d, nGardenbits_1w,
+ nMousehole_1d, nPenelope_1w, nRock_1d, nTomb_1d, nDroppings_1w,
+ nMachinebits_1w, nHands_1w, nWindow_1d
+};
+
+//***************************************************************************
+// Hugo 2 Dos
+//***************************************************************************
+const char *nHero_2d[] = {"hero", "self", ""};
+const char *nPenny_2d[] = {"penelope", "woman", "girl", "lady", ""};
+const char *nPennylie_2d[] = {"pennylie", ""};
+const char *nPenfall_2d[] = {"penfall", ""};
+const char *nSmoke_2d[] = {"smoke", ""};
+const char *nLips_2d[] = {"lips", ""};
+const char *nMaid_2d[] = {"maid", "waitress", "woman", "girl", "lady", ""};
+const char *nBookcase_2d[] = {"bookcase", ""};
+const char *nBook_2d[] = {"book", ""};
+const char *nKeyhole_2d[] = {"hole", ""};
+const char *nPanel_2d[] = {"panel", ""};
+const char *nMatches_2d[] = {"matches", "a box of matches", "match", ""};
+const char *nCrate_2d[] = {"crate", "box", ""};
+const char *nDumb_2d[] = {"dumb", "waiter", "box", ""};
+const char *nMurder_2d[] = {"murder", ""};
+const char *nTrap_2d[] = {"trap", ""};
+const char *nWard_2d[] = {"wardrobe", "closet", "cabinet", ""};
+const char *nDoor_2d[] = {"door", "gate", ""};
+const char *nRope_2d[] = {"rope", "string", ""};
+const char *nCupb_2d[] = {"cupboard", "cabinet", "dresser", "hutch", "sideboard", "bureau", "desk", "drawer", ""};
+const char *nGarlic_2d[] = {"garlic", "some garlic", "clove", ""};
+const char *nGardner_2d[] = {"gard", "man", ""};
+const char *nButton_2d[] = {"button", "switch", "knob", ""};
+const char *nRed_2d[] = {"red", ""};
+const char *nYellow_2d[] = {"yellow", ""};
+const char *nGreen_2d[] = {"green", ""};
+const char *nBlue_2d[] = {"blue", ""};
+const char *nFly_2d[] = {"fly", ""};
+const char *nLeaf_2d[] = {"leaf", ""};
+const char *nShedlight_2d[] = {"slight", ""};
+const char *nGatelight_2d[] = {"glight", ""};
+const char *nZapper_2d[] = {"zapper", "lamp", "light", "lantern", ""};
+const char *nBug_2d[] = {"bug", "bee", "insect", "wasp", ""};
+const char *nKnife_2d[] = {"knife", ""};
+const char *nShed_2d[] = {"shed", ""};
+const char *nOldman_2d[] = {"oldman", "old", "man", ""};
+const char *nSnake_2d[] = {"snake", ""};
+const char *nStick_2d[] = {"stick", "a pile of sticks", "twig", ""};
+const char *nDynamite_2d[] = {"dynamite", "a stick of dynamite", "fuze", "fuse", ""};
+const char *nKennel_2d[] = {"kennel", "house", ""};
+const char *nDog_2d[] = {"dog", ""};
+const char *nWell_2d[] = {"well", "rope", ""};
+const char *nBanana_2d[] = {"banana", "a moldy banana", ""};
+const char *nLamp_2d[] = {"lamp", "an old dusty oil lamp", ""};
+const char *nGenie_2d[] = {"genie", "man", ""};
+const char *nTardis_2d[] = {"tardis", "phone", ""};
+const char *nHarry_2d[] = {"harry", "man", ""};
+const char *nHester_2d[] = {"hester", "woman", "girl", "lady", ""};
+const char *nLetter_2d[] = {"letter", "envelope", "card", ""};
+const char *nDoctor_2d[] = {"doctor", "man", ""};
+const char *nDalek_2d[] = {"alek", "robot", "monster", ""};
+const char *nCook_2d[] = {"cook", "woman", "girl", "lady", ""};
+const char *nCookb_2d[] = {"cookb", ""};
+const char *nCop_2d[] = {"cop", "man", ""};
+const char *nHorace_2d[] = {"horace", "man", ""};
+const char *nBell_2d[] = {"bell", "a bell", ""};
+const char *nCatnip_2d[] = {"catnip", "some catnip", ""};
+const char *nCat_2d[] = {"cat", "puss", ""};
+const char *nGun_2d[] = {"gun", "a gun", "revolver", "pistol", "weapon", ""};
+const char *nPaper_2d[] = {"paper", "a newspaper", "notepad", " pad", "blotter", ""};
+const char *nPencil_2d[] = {"pencil", "a pencil", " pen", ""};
+const char *nKey_2d[] = {"key", ""};
+const char *nMagnify_2d[] = {"magnifier", "a magnifying glass", "magnify", "glass", ""};
+const char *nSafe_2d[] = {"safe", ""};
+const char *nScrew_2d[] = {"screwdriver", "sonic", ""};
+const char *nWill_2d[] = {"will", "print", ""};
+const char *nAlbum_2d[] = {"album", "photo", ""};
+const char *nBottle_2d[] = {"bottle", "a bottle", "serum", ""};
+const char *nBalloon_2d[] = {"balloon", ""};
+
+const char *nSky_2d[] = {"sky", "ceiling", ""};
+const char *nWall_2d[] = {"wall", ""};
+const char *nGround_2d[] = {"ground", "floor", ""};
+const char *nTree_2d[] = {"tree", ""};
+const char *nFence_2d[] = {"fence", "hedge", "bush", ""};
+const char *nHouse_2d[] = {"house", ""};
+const char *nRoof_2d[] = {"roof", "chimney", ""};
+const char *nLight_2d[] = {"light", "lamp", ""};
+const char *nMoon_2d[] = {"moon", ""};
+const char *nPicture_2d[] = {"picture", "painting", ""};
+const char *nTable_2d[] = {"table", "bench", ""};
+const char *nStairs_2d[] = {"stair", "landing", "ladder", ""};
+const char *nBed_2d[] = {"bed", ""};
+const char *nPlant_2d[] = {"plant", "flower", "vase", ""};
+const char *nFood_2d[] = {"food", "plate", ""};
+const char *nWoman_2d[] = {"woman", "girl", "lady", ""};
+const char *nMan_2d[] = {"man", ""};
+const char *nMirror_2d[] = {"mirror", ""};
+const char *nSink_2d[] = {"sink", ""};
+const char *nUnits_2d[] = {"Unit", "oven", "sink", "cupb", "drawer", "pantry", "cabinet", "range", "counter", "cooker", ""};
+const char *nBroom_2d[] = {"broom", "brush", ""};
+const char *nGardenbits_2d[] = {"grass", "fence", "Branch", "path", ""};
+const char *nRock_2d[] = {"rock", "boulder", "stone", ""};
+const char *nDroppings_2d[] = {"droppings", ""};
+const char *nWindow_2d[] = {"window", "outside", "inside", ""};
+const char *nBird_2d[] = {"bird", "parrot", "budgie", ""};
+const char *nCage_2d[] = {"cage", "pen", ""};
+const char *nPhone_2d[] = {"phone", ""};
+const char *nChair_2d[] = {"chair", "seat", "couch", "settee", ""};
+const char *nTools_2d[] = {"tools", "hammer", "pliers", "screw", "knife", "saw", ""};
+const char *nBridge_2d[] = {"bridge", ""};
+const char *nWater_2d[] = {"water", ""};
+const char *nBucket_2d[] = {"bucket", "container", ""};
+const char *nMouse_2d[] = {"mouse", "rat", "rodent", "animal", "furry", ""};
+const char *nWand_2d[] = {"wand", ""};
+const char *nHole_2d[] = {"hole", ""};
+const char *nHandle_2d[] = {"handle", "lever", ""};
+const char *nChute_2d[] = {"chute", ""};
+const char *nOrgan_2d[] = {"organ", "piano", "pipe", ""};
+const char *nPost_2d[] = {"post", "pole", ""};
+const char *nGraf_2d[] = {"graffiti", "graf", "writing", ""};
+
+const char **arrayNouns_2d[] = {
+ nDummy, nHero_2d, nPenny_2d, nPennylie_2d, nPenfall_2d,
+ nSmoke_2d, nLips_2d, nMaid_2d, nBookcase_2d, nBook_2d,
+ nKeyhole_2d, nPanel_2d, nMatches_2d, nCrate_2d, nDumb_2d,
+ nMurder_2d, nTrap_2d, nWard_2d, nDoor_2d, nRope_2d,
+ nCupb_2d, nGarlic_2d, nGardner_2d, nButton_2d, nRed_2d,
+ nYellow_2d, nGreen_2d, nBlue_2d, nFly_2d, nLeaf_2d,
+ nShedlight_2d, nGatelight_2d, nZapper_2d, nBug_2d, nKnife_2d,
+ nShed_2d, nOldman_2d, nSnake_2d, nStick_2d, nDynamite_2d,
+ nKennel_2d, nDog_2d, nWell_2d, nBanana_2d, nLamp_2d,
+ nGenie_2d, nTardis_2d, nHarry_2d, nHester_2d, nLetter_2d,
+ nDoctor_2d, nDalek_2d, nCook_2d, nCookb_2d, nCop_2d,
+ nHorace_2d, nBell_2d, nCatnip_2d, nCat_2d, nGun_2d,
+ nPaper_2d, nPencil_2d, nKey_2d, nMagnify_2d, nSafe_2d,
+ nScrew_2d, nWill_2d, nAlbum_2d, nBottle_2d, nBalloon_2d,
+ nSky_2d, nWall_2d, nGround_2d, nTree_2d, nFence_2d,
+ nHouse_2d, nRoof_2d, nLight_2d, nMoon_2d, nPicture_2d,
+ nTable_2d, nStairs_2d, nBed_2d, nPlant_2d, nFood_2d,
+ nWoman_2d, nMan_2d, nMirror_2d, nSink_2d, nUnits_2d,
+ nBroom_2d, nGardenbits_2d, nRock_2d, nDroppings_2d, nWindow_2d,
+ nBird_2d, nCage_2d, nPhone_2d, nChair_2d, nTools_2d,
+ nBridge_2d, nWater_2d, nBucket_2d, nMouse_2d, nWand_2d,
+ nHole_2d, nHandle_2d, nChute_2d, nOrgan_2d, nPost_2d,
+ nGraf_2d
+};
+
+const char *nHero_3d[] = {"hero", "self", ""};
+const char *nWhero_3d[] = {"whero", ""};
+const char *nHero_old_3d[] = {"hero_old", ""};
+const char *nWheroold_3d[] = {"wheroold", ""};
+const char *nPenny_3d[] = {"penelope", "woman", "girl", "lady", ""};
+const char *nPennylie_3d[] = {"pennylie", ""};
+const char *nLips_3d[] = {"lips", ""};
+const char *nPlane_3d[] = {"plane", "craft", "cabin", "cockpit", ""};
+const char *nDoor_3d[] = {"door", ""};
+const char *nCdoor_3d[] = {"door", "cage", "gate", ""};
+const char *nBlock_3d[] = {"block", ""};
+const char *nVine_3d[] = {"vine", "rope", ""};
+const char *nSwinger_3d[] = {"swinger", ""};
+const char *nDoctor_3d[] = {"doctor", "witch", "native", "man", ""};
+const char *nClay_3d[] = {"clay", "some clay", "plasticine", "model", "effigy", "voodoo", "doll", ""};
+const char *nDoorlock_3d[] = {"lock", ""};
+const char *nNeedles_3d[] = {"needle", "some pins", "pin", ""};
+const char *nNative_3d[] = {"native", "man", "lady", ""};
+const char *nNat1_3d[] = {"nat1", "native", "man", ""};
+const char *nNat2_3d[] = {"nat2", "native", "man", ""};
+const char *nNat3_3d[] = {"nat3", "native", "man", ""};
+const char *nNatb_3d[] = {"natb", "native", "man", ""};
+const char *nNatg_3d[] = {"natg", "native", "man", "girl", ""};
+const char *nBottles_3d[] = {"bottles", ""};
+const char *nFlask_3d[] = {"flask", "a water flask", "water", "remedy", "antidote", ""};
+const char *nCage_3d[] = {"cage", "a little cage", "door", ""};
+const char *nPipe_3d[] = {"blowpipe", "blowpipe & darts", "dart", ""};
+const char *nElephant_3d[] = {"elephant", "animal", ""};
+const char *nE_eyes_3d[] = {"e_eyes", ""};
+const char *nBouillon_3d[] = {"bouillon", "bouillon cubes", "bouil", "boull", "boulion", "cube", "season", "oxo", "knorr", ""};
+const char *nMoushole_3d[] = {"moushole", ""};
+const char *nDoclie_3d[] = {"doclie", ""};
+const char *nCheese_3d[] = {"cheese", "a sandwich", "sandwich", ""};
+const char *nSpider_3d[] = {"spider", "insect", "tarantula", ""};
+const char *nSnake_3d[] = {"snake", ""};
+const char *nFire_3d[] = {"fire", "flame", "pot", ""};
+const char *nDocbits_3d[] = {"skull", "shield", "torch", "fire", "flame", "spear", "bone", ""};
+const char *nFire_1_3d[] = {"fire_1", ""};
+const char *nFire_2_3d[] = {"fire_2", ""};
+const char *nFire_3_3d[] = {"fire_3", ""};
+const char *nFroth_3d[] = {"froth", ""};
+const char *nScroll_3d[] = {"scroll", "an old scroll", "writing", ""};
+const char *nCrystal_3d[] = {"crystal", "a crystal ball", "ball", ""};
+const char *nGhost_3d[] = {"ghost", "ghoul", "spirit", ""};
+const char *nBell_3d[] = {"bell", "a golden bell", ""};
+const char *nBook_3d[] = {"book", "a spell book", "spell", ""};
+const char *nCandle_3d[] = {"candle", "a golden candle", ""};
+
+const char *nSky_3d[] = {"sky", "ceiling", ""};
+const char *nWall_3d[] = {"wall", ""};
+const char *nGround_3d[] = {"ground", "floor", ""};
+const char *nFence_3d[] = {"fence", "hedge", "bush", ""};
+const char *nBridge_3d[] = {"bridge", ""};
+const char *nWater_3d[] = {"water", "stream", "river", "pool", "lake", ""};
+const char *nMouse_3d[] = {"mouse", "rat", "rodent", "animal", "furry", ""};
+const char *nWindow_3d[] = {"window", ""};
+const char *nShelfbits_3d[]= {"shelf", "bottle", "jar", "medicine", "label", ""};
+const char *nJungle_3d[] = {"tree", "vine", "flower", "fern", "frond", "plant", "jungle", "undergrowth", ""};
+const char *nOrchid_3d[] = {"orchid", "flower", "plant", ""};
+const char *nPole_3d[] = {"pole", "stick", "wood", ""};
+const char *nHut_3d[] = {"hut", "house", "shed", ""};
+const char *nRock_3d[] = {"rock", "boulder", "stone", ""};
+const char *nAircraft_3d[] = {"aircraft", ""};
+const char *nPlant1_3d[] = {"plant1", ""};
+const char *nPlant2_3d[] = {"plant2", ""};
+const char *nPlant3_3d[] = {"plant3", ""};
+const char *nPlant4_3d[] = {"plant4", ""};
+const char *nPlant5_3d[] = {"plant5", ""};
+const char *nWeb_3d[] = {"web", ""};
+const char *nO_eye_3d[] = {"o_eye", ""};
+const char *nFire_4_3d[] = {"fire_4", ""};
+const char *nMouth_3d[] = {"mouth", ""};
+const char *nFood_3d[] = {"food", "meat", "hyena", ""};
+const char *nThem_3d[] = {"them", ""};
+
+const char **arrayNouns_3d[] = {
+ nDummy, nHero_3d, nWhero_3d, nHero_old_3d, nWheroold_3d,
+ nPenny_3d, nPennylie_3d, nLips_3d, nPlane_3d, nDoor_3d,
+ nCdoor_3d, nBlock_3d, nVine_3d, nSwinger_3d, nDoctor_3d,
+ nClay_3d, nDoorlock_3d, nNeedles_3d, nNative_3d, nNat1_3d,
+ nNat2_3d, nNat3_3d, nNatb_3d, nNatg_3d, nBottles_3d,
+ nFlask_3d, nCage_3d, nPipe_3d, nElephant_3d, nE_eyes_3d,
+ nBouillon_3d, nMoushole_3d, nDoclie_3d, nCheese_3d, nSpider_3d,
+ nSnake_3d, nFire_3d, nDocbits_3d, nFire_1_3d, nFire_2_3d,
+ nFire_3_3d, nFroth_3d, nScroll_3d, nCrystal_3d, nGhost_3d,
+ nBell_3d, nBook_3d, nCandle_3d, nSky_3d, nWall_3d,
+ nGround_3d, nFence_3d, nBridge_3d, nWater_3d, nMouse_3d,
+ nWindow_3d, nShelfbits_3d, nJungle_3d, nOrchid_3d, nPole_3d,
+ nHut_3d, nRock_3d, nAircraft_3d, nPlant1_3d, nPlant2_3d,
+ nPlant3_3d, nPlant4_3d, nPlant5_3d, nWeb_3d, nO_eye_3d,
+ nFire_4_3d, nMouth_3d, nFood_3d, nThem_3d
+};
+
+// Verbs and synonyms (N.B. put null string at end of last synonym)
+//***************************************************************************
+// Multi-version verbs
+//***************************************************************************
+const char *vDummy[] = {"", ""};
+const char *vBlow_1w[] = {"blow", ""};
+const char *vClose_1w[] = {"close ", "shut", ""};
+const char *vCut_1w[] = {"cut", ""};
+const char *vDial_2w[] = {"dial", "ring", "call", ""};
+const char *vEat_1w[] = {"eat", ""};
+const char *vBreak_2w[] = {"break", "smash", "destroy", "kick", "slash", "pop ", "burst", ""};
+const char *vAttack_2w[] = {"attack", "hit", "kill", "fight", "punch", ""};
+const char *vGive_1w[] = {"give", "offer", ""}; // Must come before off
+const char *vHerring_2w[] = {"herring", ""}; // Must come before ring
+const char *vLift_1w[] = {"lift", ""};
+const char *vLock_1w[] = {"lock", ""};
+const char *vLook_2w[] = {"look", "examine", "search", ""};// Must come after under
+const char *vMakeUseOf_1w[] = {"makeuseof", ""};
+const char *vMove_1w[] = {"move", ""};
+const char *vOff_1w[] = {"off", "remove", ""}; // e.g. take off, turn off
+const char *vOil_1w[] = {"oil ", ""}; // Note this is a noun too! (hence space)
+const char *vOpen_1w[] = {"open", ""};
+const char *vOutof_1w[] = {"get out", ""};
+const char *vPush_2w[] = {"push", "press", "slide", "slip", ""};// Must come before off
+const char *vRead_2w[] = {"read", ""};
+const char *vRest_2w[] = {"rest", "lie down", "lie on", ""};
+const char *vRide_1w[] = {"ride", "mount", "get on", ""};
+const char *vRing_2w[] = {"ring", ""};
+const char *vStrike_2w[] = {"strike", "light", ""}; // As in matches, fuze
+const char *vTake_1w[] = {"take", "get", "carry", "pick up", "grab", ""};
+const char *vTalk_2w[] = {"talk", "speak", "say", "tell", "ask", ""};
+const char *vThrowit_1w[] = {"throw", "hurl", "fling", ""};
+const char *vUnder_1w[] = {"under", ""}; // e.g. look under
+const char *vUnlock_1w[] = {"unlock", "undo", ""};
+const char *vUntie_1w[] = {"untie", ""};
+const char *vWear_1w[] = {"wear", "put on", ""};
+
+const char *vClimb_1w[] = {"climb", ""};
+const char *vDig_1w[] = {"dig", "burrow", ""}; // Must come before under
+const char *vDrink_1w[] = {"drink", ""};
+const char *vFeed_1w[] = {"feed", ""};
+const char *vGo_1w[] = {"go", ""};
+const char *vHelp_1w[] = {"help", ""};
+const char *vJump_1w[] = {"jump", ""};
+const char *vKiss_1w[] = {"kiss", ""};
+const char *vKnock_1w[] = {"knock", ""};
+const char *vListen_1w[] = {"listen", ""};
+const char *vMagic_2w[] = {"sesame", "abraca", "xyzzy", ""};// Before open
+const char *vPlay_2w[] = {"play", ""};
+const char *vQuery_1w[] = {"what", "why", "when", "where", "which", "who", "how", "?", ""};
+const char *vShout_1w[] = {"shout", "call", ""};
+const char *vSit_1w[] = {"sit", ""};
+const char *vSmell_1w[] = {"smell", ""};
+const char *vStroke_2w[] = {"stroke", "pet ", ""};
+const char *vSweep_1w[] = {"sweep", ""};
+const char *vSwitch_1w[] = {"switch", ""};
+const char *vTie_2w[] = {"tie ", "attach", ""};
+const char *vUndress_2w[] = {"undress", ""}; // Must come before take
+const char *vUnscrew_2w[] = {"unscrew", ""}; // Must come before rude
+const char *vUse_2w[] = {"use ", ""};
+const char *vWash_1w[] = {"wash", ""};
+const char *vWind_2w[] = {"wind", "turn", "rotate", "winch", ""}; // As in wind, unwind rope
+const char *vWish_2w[] = {"wish", ""};
+
+//***************************************************************************
+// Hugo 1 Windows
+//***************************************************************************
+const char *vPush_1w[] = {"push", "press", "cast off", ""};// Must come before off
+const char *vInto_1w[] = {"get in", "enter", ""}; // Must come before take (get)
+const char *vDrop_1w[] = {"drop", "put down", ""};
+const char *vAttack_1w[] = {"attack", "hit", "kill", "fight", ""};
+const char *vBreak_1w[] = {"break", "smash", "destroy", "kick", "slash", ""};
+const char *vRub_1w[] = {"rub", ""}; // Must come before Oil
+const char *vLook_1w[] = {"look", "examine", ""}; // Must come after under
+const char *vTalk_1w[] = {"talk", "speak", "say", ""};
+const char *vPlug_1w[] = {"plug", ""};
+
+const char *vEnter_1w[] = {"enter", ""};
+const char *vCrap_1w[] = {"crap", "shit", "piss", ""};
+const char *vUnbolt_1w[] = {"unbolt", ""};
+const char *vLakeverbs_1w[] = {"swim", "paddle", "wade", ""};
+const char *vMagic_1w[] = {"sesame", "abraca", "xyzzy", "zelda", ""};// Before open
+const char *vRude_1w[] = {"fuck", "fart", ""};
+const char *vStroke_1w[] = {"stroke", ""};
+const char *vHide_1w[] = {"hide", "behind", ""};
+ // Added by Strangerke to ease usage of hugo.dat
+const char *vBolt_1w[] = {"bolt", "~", "bolt", ""};
+const char *vHero_1w[] = {"hero", "self", "Hugo", "hugo", ""};
+
+const char **arrayVerbs_1w[] = {
+ vDummy, vMakeUseOf_1w, vMagic_1w, vOpen_1w, vClose_1w,
+ vUnlock_1w, vLock_1w, vPush_1w, vGive_1w, vRude_1w,
+ vOff_1w, vInto_1w, vOutof_1w, vCrap_1w, vRide_1w,
+ vTake_1w, vDrop_1w, vAttack_1w, vBreak_1w, vThrowit_1w,
+ vWear_1w, vRub_1w, vOil_1w, vMove_1w, vLift_1w,
+ vDig_1w, vUnder_1w, vLook_1w, vEat_1w, vBlow_1w,
+ vUntie_1w, vCut_1w, vTalk_1w, vPlug_1w, vShout_1w,
+ vQuery_1w, vJump_1w, vGo_1w, vEnter_1w, vClimb_1w,
+ vSwitch_1w, vListen_1w, vKnock_1w, vSmell_1w, vSit_1w,
+ vKiss_1w, vUnbolt_1w, vLakeverbs_1w, vHelp_1w, vDrink_1w,
+ vSweep_1w, vFeed_1w, vWash_1w, vStroke_1w, vHide_1w,
+ vBolt_1w, vHero_1w
+};
+
+//***************************************************************************
+// Hugo 2 Windows
+//***************************************************************************
+// Verbs and synonyms (N.B. put null string at end of last synonym)
+const char *vBlock_2w[] = {"block", "brick", "blocks", ""}; // Must come before lock
+const char *vSearch_2w[] = {"search", "examine", ""};
+const char *vInto_2w[] = {"get in", "enter", "go in", " in ", ""};// Must come before take (get)
+const char *vDrop_2w[] = {"drop", "put down", "place", "put ", ""};
+const char *vFire_2w[] = {"fire", "shoot", ""};
+
+const char *vSwitch_2w[] = {"switch", "~", "switch", ""};
+const char *vHello_2w[] = {"hello", "hi ", " hi", ""};
+const char *vRude_2w[] = {"fuck", "fart", "screw ", ""};// Must come before off
+const char *vScribble_2w[] = {"scribble", ""};
+
+const char **arrayVerbs_2w[] = {
+ vDummy, vMakeUseOf_1w, vBlock_2w, vUse_2w, vPush_2w,
+ vUnder_1w, vSearch_2w, vLook_2w, vMagic_2w, vOpen_1w,
+ vClose_1w, vUnlock_1w, vLock_1w, vRide_1w, vRest_2w,
+ vUndress_2w, vGive_1w, vUnscrew_2w, vRude_2w, vOff_1w,
+ vInto_2w, vOutof_1w, vTake_1w, vDrop_2w, vAttack_2w,
+ vBreak_2w, vThrowit_1w, vWear_1w, vRub_1w, vOil_1w,
+ vMove_1w, vLift_1w, vDig_1w, vEat_1w, vBlow_1w,
+ vUntie_1w, vCut_1w, vTalk_2w, vStrike_2w, vHerring_2w,
+ vRing_2w, vRead_2w, vDial_2w, vFire_2w, vShout_1w,
+ vQuery_1w, vJump_1w, vGo_1w, vClimb_1w, vSwitch_2w,
+ vListen_1w, vKnock_1w, vSmell_1w, vSit_1w, vKiss_1w,
+ vHelp_1w, vDrink_1w, vSweep_1w, vFeed_1w, vWash_1w,
+ vHello_2w, vWind_2w, vTie_2w, vStroke_2w, vPlay_2w,
+ vWish_2w, vScribble_2w
+};
+
+//***************************************************************************
+// Hugo 3 Windows
+//***************************************************************************
+// Verbs and synonyms (N.B. put null string at end of last synonym)
+const char *vSearch_3w[] = {"search", "examine", "inside", "look in", ""};
+const char *vBehind_3w[] = {"behind", ""}; // As in look behind
+const char *vInto_3w[] = {"get in", "enter", "go in", ""};// Must come before take (get)
+const char *vOutof_3w[] = {"get out", "get down", "go back", "exit", ""};
+const char *vTake_3w[] = {"take", "get", "carry", "pick ", "grab", "catch", ""};
+const char *vDrop_3w[] = {"drop", " down", "place", ""};
+const char *vRub_3w[] = {"rub", "clean", "wipe", "polish", ""};
+const char *vFill_3w[] = {"fill", ""}; // Must come before ask
+const char *vEmpty_3w[] = {"empty", "pour", ""};
+const char *vShoot_3w[] = {"fire ", "shoot", ""};
+const char *vSwing_3w[] = {"swing", ""};
+const char *vCross_3w[] = {"cross", ""};
+const char *vMake_3w[] = {"make", "build", "construct", ""};
+const char *vStick_3w[] = {"stick", "push", "prick", "stab", "put", ""}; // As in pins
+const char *vRepair_3w[] = {"repair", "fix ", "mend ", ""};
+const char *vFly_3w[] = {"fly ", ""};
+const char *vDouse_3w[] = {"douse", "extinguish", "put out", ""};
+const char *vExorcise_3w[] = {"exorcise", "banish", "frighten", "scare", ""};
+
+const char *vHello_3w[] = {"hello", "hi ", " hi", "howd", ""};
+const char *vRude_3w[] = {"fuck", "fart", "screw ", "shit", ""}; // Must come before off
+const char *vNaughty_3w[] = {"fondle", "breasts", "tits", "fanny", "kiss", ""};
+const char *vPut_3w[] = {"put ", ""};
+const char *vSwim_3w[] = {"swim", "wade", ""};
+const char *vShow_3w[] = {"show", ""}; // As in show mouse to elephant
+
+const char **arrayVerbs_3w[] = {
+ vDummy, vMakeUseOf_1w, vPush_2w, vUnder_1w, vSearch_3w,
+ vBehind_3w, vLook_2w, vMagic_2w, vOpen_1w, vClose_1w,
+ vRide_1w, vRest_2w, vUndress_2w, vGive_1w, vUnscrew_2w,
+ vRude_3w, vNaughty_3w, vOff_1w, vInto_3w, vOutof_3w,
+ vTake_3w, vDrop_3w, vUnlock_1w, vLock_1w, vAttack_2w,
+ vBreak_2w, vThrowit_1w, vWear_1w, vRub_3w, vOil_1w,
+ vMove_1w, vLift_1w, vDig_1w, vEat_1w, vBlow_1w,
+ vUntie_1w, vCut_1w, vFill_3w, vEmpty_3w, vDrink_1w,
+ vStrike_2w, vHerring_2w, vRing_2w, vRead_2w, vDial_2w,
+ vShoot_3w, vRepair_3w, vFly_3w, vDouse_3w, vExorcise_3w,
+ vSwing_3w, vCross_3w, vMake_3w, vStick_3w, vTalk_2w,
+ vShout_1w, vQuery_1w, vJump_1w, vGo_1w, vClimb_1w,
+ vSwitch_1w, vListen_1w, vKnock_1w, vSmell_1w, vSit_1w,
+ vKiss_1w, vHelp_1w, vSweep_1w, vFeed_1w, vWash_1w,
+ vHello_3w, vWind_2w, vTie_2w, vStroke_2w, vPlay_2w,
+ vWish_2w, vPut_3w, vUse_2w, vSwim_3w, vShow_3w
+};
+
+//***************************************************************************
+// Hugo 1 Dos
+//***************************************************************************
+// Verbs and synonyms (N.B. put null string at end of last synonym)
+const char *vPush_1d[] = {"push", "press", "cast off", ""}; // Must come before off
+const char *vInto_1d[] = {"get in", "enter", ""}; // Must come before take (get)
+const char *vOutof_1d[] = {"get out", ""};
+const char *vTake_1d[] = {"take", "get", "carry", "pick up", "grab", ""};
+const char *vDrop_1d[] = {"drop", "put down", ""};
+const char *vAttack_1d[] = {"attack", "hit", "kill", "fight", ""};
+const char *vBreak_1d[] = {"break", "smash", "destroy", "kick", "slash", ""};
+const char *vThrow_1d[] = {"throw", "hurl", "fling", ""};
+const char *vRub_1d[] = {"rub", ""}; // Must come before Oil
+const char *vLook_1d[] = {"look", "examine", ""}; // Must come after under
+const char *vTalk_1d[] = {"talk", "speak", "say", ""};
+
+const char *vSwitch_1d[] = {"switch", ""};
+const char *vMagic_1d[] = {"sesame", "abraca", "xyzzy", "zelda", ""}; // Before open
+
+const char **arrayVerbs_1d[] = {
+ vDummy, vMagic_1d, vOpen_1w, vClose_1w, vUnlock_1w,
+ vLock_1w, vPush_1d, vGive_1w, vRude_1w, vOff_1w,
+ vInto_1d, vOutof_1d, vCrap_1w, vRide_1w, vTake_1d,
+ vDrop_1d, vAttack_1d, vBreak_1d, vThrow_1d, vWear_1w,
+ vRub_1d, vOil_1w, vMove_1w, vLift_1w, vDig_1w,
+ vUnder_1w, vLook_1d, vEat_1w, vBlow_1w, vUntie_1w,
+ vCut_1w, vTalk_1d, vPlug_1w, vShout_1w, vQuery_1w,
+ vJump_1w, vGo_1w, vEnter_1w, vClimb_1w, vSwitch_1d,
+ vListen_1w, vKnock_1w, vSmell_1w, vSit_1w, vKiss_1w,
+ vUnbolt_1w, vLakeverbs_1w, vHelp_1w, vDrink_1w, vSweep_1w,
+ vFeed_1w, vWash_1w
+};
+
+//***************************************************************************
+// Hugo 2 Dos
+//***************************************************************************
+const char *vBlock_2d[] = {"block", "brick", ""}; // Must come before lock
+const char *vUse_2d[] = {"use ", ""};
+const char *vPush_2d[] = {"push", "press", "slide", "slip", ""};// Must come before off
+const char *vUnder_2d[] = {"under", ""}; // e.g. look under. Must come after push
+const char *vSearch_2d[] = {"search", "examine", ""};
+const char *vLook_2d[] = {"look", "examine", "search", ""}; // Must come after under
+const char *vOpen_2d[] = {"open", ""};
+const char *vClose_2d[] = {"close ", "shut", ""};
+const char *vUnlock_2d[] = {"unlock", "undo", ""};
+const char *vLock_2d[] = {"lock", ""};
+const char *vRide_2d[] = {"ride", "mount", "get on", ""};
+const char *vRest_2d[] = {"rest", "lie down", "lie on", ""};
+const char *vOff_2d[] = {"off", "remove", ""}; // e.g. take off, turn off
+const char *vInto_2d[] = {"get in", "enter", "go in", " in ", ""};// Must come before take (get)
+const char *vOutof_2d[] = {"get out", ""};
+const char *vTake_2d[] = {"take", "get", "carry", "pick up", "grab", ""};
+const char *vDrop_2d[] = {"drop", "put down", "place", "put ", ""};
+const char *vAttack_2d[] = {"attack", "hit", "kill", "fight", "punch", ""};
+const char *vBreak_2d[] = {"break", "smash", "destroy", "kick", "slash", "pop ", "burst", ""};
+const char *vThrow_2d[] = {"throw", "hurl", "fling", ""};
+const char *vWear_2d[] = {"wear", "put on", ""};
+const char *vRub_2d[] = {"rub", ""}; // Must come before Oil
+const char *vOil_2d[] = {"oil ", ""}; // Note this is a noun too! (hence space)
+const char *vMove_2d[] = {"move", ""};
+const char *vLift_2d[] = {"lift", ""};
+const char *vEat_2d[] = {"eat", ""};
+const char *vBlow_2d[] = {"blow", ""};
+const char *vUntie_2d[] = {"untie", ""};
+const char *vCut_2d[] = {"cut", ""};
+const char *vTalk_2d[] = {"talk", "speak", "say", "tell", "ask", ""};
+const char *vGive_2d[] = {"give", "offer", ""}; // Must come before off
+const char *vStrike_2d[] = {"strike", "light", ""}; // As in matches, fuze
+const char *vHerring_2d[] = {"herring", ""}; // Must come before ring
+const char *vRing_2d[] = {"ring", ""};
+const char *vRead_2d[] = {"read", ""};
+const char *vDial_2d[] = {"dial", "ring", "call", ""};
+const char *vFire_2d[] = {"fire", "shoot", ""};
+
+const char *vShout_2d[] = {"shout", "call", ""};
+const char *vQuery_2d[] = {"what", "why", "when", "where", "which", "who", "how", "?", ""};
+const char *vJump_2d[] = {"jump", ""};
+const char *vGo_2d[] = {"go", ""};
+const char *vClimb_2d[] = {"climb", ""};
+const char *vSwitch_2d[] = {"switch", ""};
+const char *vListen_2d[] = {"listen", ""};
+const char *vKnock_2d[] = {"knock", ""};
+const char *vSmell_2d[] = {"smell", ""};
+const char *vSit_2d[] = {"sit", ""};
+const char *vKiss_2d[] = {"kiss", ""};
+const char *vHelp_2d[] = {"help", ""};
+const char *vMagic_2d[] = {"sesame", "abraca", "xyzzy", ""}; // Before open
+const char *vDig_2d[] = {"dig", "burrow", ""}; // Must come before under
+const char *vDrink_2d[] = {"drink", ""};
+const char *vSweep_2d[] = {"sweep", ""};
+const char *vFeed_2d[] = {"feed", ""};
+const char *vWash_2d[] = {"wash", ""};
+const char *vHello_2d[] = {"hello", "hi ", " hi", ""};
+const char *vWind_2d[] = {"wind", "turn", "rotate", "winch", ""}; // As in wind, unwind rope
+const char *vTie_2d[] = {"tie ", "attach", ""};
+const char *vStroke_2d[] = {"stroke", "pet ", ""};
+const char *vUnscrew_2d[] = {"unscrew", ""}; // Must come before rude
+const char *vRude_2d[] = {"fuck", "fart", "screw ", ""}; // Must come before off
+const char *vUndress_2d[] = {"undress", ""}; // Must come before take
+const char *vPlay_2d[] = {"play", ""};
+const char *vWish_2d[] = {"wish", ""};
+
+const char **arrayVerbs_2d[] = {
+ vDummy, vBlock_2d, vUse_2d, vPush_2d, vUnder_2d,
+ vSearch_2d, vLook_2d, vOpen_2d, vClose_2d, vUnlock_2d,
+ vLock_2d, vRide_2d, vRest_2d, vOff_2d, vInto_2d,
+ vOutof_2d, vTake_2d, vDrop_2d, vAttack_2d, vBreak_2d,
+ vThrow_2d, vWear_2d, vRub_2d, vOil_2d, vMove_2d,
+ vLift_2d, vEat_2d, vBlow_2d, vUntie_2d, vCut_2d,
+ vTalk_2d, vGive_2d, vStrike_2d, vHerring_2d, vRing_2d,
+ vRead_2d, vDial_2d, vFire_2d, vShout_2d, vQuery_2d,
+ vJump_2d, vGo_2d, vClimb_2d, vSwitch_2d, vListen_2d,
+ vKnock_2d, vSmell_2d, vSit_2d, vKiss_2d, vHelp_2d,
+ vMagic_2d, vDig_2d, vDrink_2d, vSweep_2d, vFeed_2d,
+ vWash_2d, vHello_2d, vWind_2d, vTie_2d, vStroke_2d,
+ vUnscrew_2d, vRude_2d, vUndress_2d, vPlay_2d, vWish_2d
+};
+
+// Verbs and synonyms (N.B. put null string at end of last synonym)
+const char *vPush_3d[] = {"push", "press", "slide", "slip", ""};
+const char *vUnder_3d[] = {"under", ""};
+const char *vSearch_3d[] = {"search", "examine", "inside", "look in", ""};
+const char *vBehind_3d[] = {"behind", ""};
+const char *vLook_3d[] = {"look", "examine", "search", ""};
+const char *vOpen_3d[] = {"open", ""};
+const char *vClose_3d[] = {"close ", "shut", ""};
+const char *vRide_3d[] = {"ride", "mount", "get on", ""};
+const char *vRest_3d[] = {"rest", "lie down", "lie on", ""};
+const char *vOff_3d[] = {"off", "remove", ""};
+const char *vInto_3d[] = {"get in", "enter", "go in", ""};
+const char *vOutof_3d[] = {"get out", "get down", "go back", "exit", ""};
+const char *vTake_3d[] = {"take", "get", "carry", "pick ", "grab", "catch", ""};
+const char *vDrop_3d[] = {"drop", " down", "place", ""};
+const char *vUnlock_3d[] = {"unlock", "undo", ""};
+const char *vLock_3d[] = {"lock", ""};
+const char *vAttack_3d[] = {"attack", "hit", "kill", "fight", "punch", ""};
+const char *vBreak_3d[] = {"break", "smash", "destroy", "kick", "slash", "pop ", "burst", ""};
+const char *vThrow_3d[] = {"throw", "hurl", "fling", ""};
+const char *vWear_3d[] = {"wear", "put on", ""};
+const char *vRub_3d[] = {"rub", "clean", "wipe", "polish", ""};
+const char *vOil_3d[] = {"oil ", ""};
+const char *vMove_3d[] = {"move", ""};
+const char *vLift_3d[] = {"lift", ""};
+const char *vEat_3d[] = {"eat", ""};
+const char *vBlow_3d[] = {"blow ", ""};
+const char *vUntie_3d[] = {"untie", ""};
+const char *vCut_3d[] = {"cut", ""};
+const char *vFill_3d[] = {"fill", ""};
+const char *vEmpty_3d[] = {"empty", "pour", ""};
+const char *vDrink_3d[] = {"drink", ""};
+const char *vGive_3d[] = {"give", "offer", ""};
+const char *vStrike_3d[] = {"strike", "light", ""};
+const char *vHerring_3d[] = {"herring", ""};
+const char *vRing_3d[] = {"ring", ""};
+const char *vRead_3d[] = {"read", ""};
+const char *vDial_3d[] = {"dial", "ring", "call", ""};
+const char *vShoot_3d[] = {"fire ", "shoot", ""};
+const char *vSwing_3d[] = {"swing", ""};
+const char *vCross_3d[] = {"cross", ""};
+const char *vMake_3d[] = {"make", "build", "construct", ""};
+const char *vStick_3d[] = {"stick", "push", "prick", "stab", "put", ""};
+const char *vTalk_3d[] = {"talk", "speak", "say", "tell", "ask ", ""};
+const char *vRepair_3d[] = {"repair", "fix ", "mend ", ""};
+const char *vFly_3d[] = {"fly ", ""};
+const char *vDouse_3d[] = {"douse", "extinguish", "put out", ""};
+const char *vExorcise_3d[] = {"exorcise", "banish", "frighten", "scare", ""};
+
+const char *vShout_3d[] = {"shout", "call", ""};
+const char *vQuery_3d[] = {"what", "why", "when", "where", "which", "who", "how", "?", ""};
+const char *vJump_3d[] = {"jump", ""};
+const char *vGo_3d[] = {"go", ""};
+const char *vClimb_3d[] = {"climb", ""};
+const char *vSwitch_3d[] = {"switch", ""};
+const char *vListen_3d[] = {"listen", ""};
+const char *vKnock_3d[] = {"knock", ""};
+const char *vSmell_3d[] = {"smell", ""};
+const char *vSit_3d[] = {"sit", ""};
+const char *vKiss_3d[] = {"kiss", ""};
+const char *vHelp_3d[] = {"help", ""};
+const char *vMagic_3d[] = {"sesame", "abraca", "xyzzy", ""}; // Before open
+const char *vDig_3d[] = {"dig", "burrow", ""}; // Must come before under
+const char *vSweep_3d[] = {"sweep", ""};
+const char *vFeed_3d[] = {"feed", ""};
+const char *vWash_3d[] = {"wash", ""};
+const char *vHello_3d[] = {"hello", "hi ", " hi", "howd", ""};
+const char *vWind_3d[] = {"wind", "turn", "rotate", "winch", ""};
+const char *vTie_3d[] = {"tie ", "attach", ""};
+const char *vStroke_3d[] = {"stroke", "pet ", ""};
+const char *vUnscrew_3d[] = {"unscrew", ""};
+const char *vRude_3d[] = {"fuck", "fart", "screw ", "shit", ""};
+const char *vNaughty_3d[] = {"fondle", "breasts", "tits", "fanny", "kiss", ""};
+const char *vUndress_3d[] = {"undress", ""};
+const char *vPlay_3d[] = {"play", ""};
+const char *vWish_3d[] = {"wish", ""};
+const char *vPut_3d[] = {"put ", ""};
+const char *vUse_3d[] = {"use ", ""};
+const char *vSwim_3d[] = {"swim", "wade", ""};
+const char *vShow_3d[] = {"show", ""};
+
+const char **arrayVerbs_3d[] = {
+ vDummy, vPush_3d, vUnder_3d, vSearch_3d, vBehind_3d,
+ vLook_3d, vMagic_3d, vOpen_3d, vClose_3d, vRide_3d,
+ vRest_3d, vUndress_3d, vGive_3d, vUnscrew_3d, vRude_3d,
+ vNaughty_3d, vOff_3d, vInto_3d, vOutof_3d, vTake_3d,
+ vDrop_3d, vUnlock_3d, vLock_3d, vAttack_3d, vBreak_3d,
+ vThrow_3d, vWear_3d, vRub_3d, vOil_3d, vMove_3d,
+ vLift_3d, vDig_3d, vEat_3d, vBlow_3d, vUntie_3d,
+ vCut_3d, vFill_3d, vEmpty_3d, vDrink_3d, vStrike_3d,
+ vHerring_3d, vRing_3d, vRead_3d, vDial_3d, vShoot_3d,
+ vRepair_3d, vFly_3d, vDouse_3d, vExorcise_3d, vSwing_3d,
+ vCross_3d, vMake_3d, vStick_3d, vTalk_3d, vShout_3d,
+ vQuery_3d, vJump_3d, vGo_3d, vClimb_3d, vSwitch_3d,
+ vListen_3d, vKnock_3d, vSmell_3d, vSit_3d, vKiss_3d,
+ vHelp_3d, vSweep_3d, vFeed_3d, vWash_3d, vHello_3d,
+ vWind_3d, vTie_3d, vStroke_3d, vPlay_3d, vWish_3d,
+ vPut_3d, vUse_3d, vSwim_3d, vShow_3d
+};
+
+const char *screenNames_1w[] = {
+ "House", "Hall", "Bed1", "Diningrm", "Bathroom",
+/* 5*/ "Kitchen", "Garden", "Storerm", "Basement", "Batcave",
+/*10*/ "Mummyrm", "Lakeroom", "Deadend", "Jail", "The_end",
+/*15*/ "Lab", "House"
+};
+
+const char *screenNames_2w[] = {
+ "House", "hall", "bed1", "bed2", "keyhole",
+/* 5*/ "bed3", "kitchen", "backdoor", "shed", "inshed",
+/*10*/ "venus", "gatesopn", "gatescls", "stream", "zapper",
+/*15*/ "mushroom", "well", "snakepit", "phonebox", "street",
+/*20*/ "kennel", "rockroom", "rockgone", "threeway", "lampcave",
+/*25*/ "chasm", "passage", "ladder", "traproom", "hall2",
+/*30*/ "lounge", "parlor", "catroom", "boxroom", "hall3",
+/*35*/ "organ", "hestroom", "retupmoc", "hall1", "maze12",
+/*40*/ "maze3" , "maze11", "maze8" , "maze3", "maze1" ,
+/*45*/ "maze3" , "maze11", "maze6" , "maze6", "maze15",
+/*50*/ "maze11", "maze6" , "maze10", "maze6", "maze13",
+/*55*/ "maze15", "maze2" , "maze11", "maze15", "maze2" ,
+/*60*/ "maze2" , "maze4" , "maze11", "maze12", "maze11",
+/*65*/ "maze6" , "maze8" , "maze1" , "maze1", "maze7" ,
+/*70*/ "maze6" , "maze6" , "maze6" , "maze6", "maze12",
+/*75*/ "maze1" , "maze11", "maze15", "maze14", "maze6" ,
+/*80*/ "maze5" , "maze2" , "maze2" , "maze9", "maze5" ,
+/*85*/ "maze1" , "maze9" , "maze6" , "maze13", "maze12",
+/*90*/ "maze3" , "maze1" , "maze4" , "maze1", "maze11",
+/*95*/ "maze15", "maze1" , "maze14", "mazex", "maze8" ,
+/*100*/ "maze2" , "maze1" , "maze14", "intro"
+};
+
+const char *screenNames_3w[] = {
+ "CRASH", "spider", "BRIDGE", "BRIDGE2" , "CLIFFTOP",
+/* 5*/ "WFALL", "WFALL_B", "WBASE", "STREAM", "STREAM2",
+/*10*/ "PATH_UL", "VILLAGE", "HUT_OUT", "HUT_IN", "GARDEN",
+/*15*/ "OLDMAN", "CLIFF", "SLOPE", "CAMP", "SUNSET",
+/*20*/ "TURN", "PLANE", "MAP", "PATH", "CAVE",
+/*25*/ "titlescr"
+};
+
+const char *screenNames_1d[] = {
+ "House", "Hall", "Bed1", "Diningrm", "Bathroom",
+/* 5*/ "Kitchen", "Garden", "Storerm", "Basement", "Batcave",
+/*10*/ "Mummyrm", "Lakeroom", "Deadend", "Jail", "The_end",
+/*15*/ "Lab"
+};
+
+const char *screenNames_2d[] = {
+ "House", "hall", "bed1", "bed2", "keyhole",
+/* 5*/ "bed3", "kitchen", "backdoor", "shed", "inshed",
+/*10*/ "venus", "gatesopn", "gatescls", "stream", "zapper",
+/*15*/ "mushroom", "well", "snakepit", "phonebox", "street",
+/*20*/ "kennel", "rockroom", "rockgone", "threeway", "lampcave",
+/*25*/ "chasm", "passage", "ladder", "traproom", "hall2",
+/*30*/ "lounge", "parlor", "catroom", "boxroom", "hall3",
+/*35*/ "organ", "hestroom", "retupmoc", "hall1", "maze12",
+/*40*/ "maze3", "maze11", "maze8", "maze3", "maze1",
+/*45*/ "maze3", "maze11", "maze6", "maze6", "maze15",
+/*50*/ "maze11", "maze6", "maze10", "maze6" , "maze13",
+/*55*/ "maze15", "maze2", "maze11", "maze15", "maze2",
+/*60*/ "maze2", "maze4", "maze11", "maze12", "maze11",
+/*65*/ "maze6", "maze8", "maze1", "maze1", "maze7",
+/*70*/ "maze6", "maze6", "maze6", "maze6", "maze12",
+/*75*/ "maze1", "maze11", "maze15", "maze14", "maze6",
+/*80*/ "maze5", "maze2", "maze2", "maze9", "maze5",
+/*85*/ "maze1", "maze9", "maze6", "maze13", "maze12",
+/*90*/ "maze3", "maze1", "maze4", "maze1", "maze11",
+/*95*/ "maze15", "maze1", "maze14", "mazex", "maze8",
+/*100*/ "maze2", "maze1", "maze14", "intro"
+};
+
+const char *screenNames_3d[] = {
+ "CRASH", "spider", "BRIDGE", "BRIDGE2", "CLIFFTOP",
+/*10*/ "WFALL", "WFALL_B", "WBASE", "STREAM", "STREAM2",
+ "PATH_UL", "VILLAGE", "HUT_OUT", "HUT_IN", "GARDEN",
+/*20*/ "OLDMAN", "CLIFF", "SLOPE", "CAMP", "SUNSET",
+ "TURN", "PLANE", "MAP", "PATH", "CAVE",
+/*30*/ "titlescr"
+};
+
+// The required objects lists are lists of ptrs to nouns. Suffix with 0
+uint16 rkey_1w[] = {kNKey_1w, 0};
+uint16 rpkin_1w[] = {kNPkin_1w, 0};
+uint16 rcandle_1w[] = {kNCandle_1w, 0};
+uint16 rmask_1w[] = {kNMask_1w, 0};
+uint16 roil_1w[] = {kNOilcan_1w, 0};
+uint16 rknife_1w[] = {kNKnife_1w, 0};
+uint16 rbung_1w[] = {kNBung_1w, 0};
+uint16 rDummy[] = {0, 0};
+const uint16 *arrayReqs_1w[] = {rDummy,rkey_1w, rpkin_1w, rcandle_1w, rmask_1w, roil_1w, rknife_1w, rbung_1w, };
+
+uint16 rgarlic_2w[] = {kNGarlic_2w, 0};
+uint16 rmatch_2w[] = {kNMatches_2w, 0};
+uint16 rstick_2w[] = {kNStick_2w, 0};
+uint16 rdyn_2w[] = {kNDynamite_2w, 0};
+uint16 rlamp_2w[] = {kNLamp_2w, 0};
+uint16 rbanana_2w[] = {kNBanana_2w, 0};
+uint16 rbell_2w[] = {kNBell_2w, 0};
+uint16 rcatnip_2w[] = {kNCatnip_2w, 0};
+uint16 rgun_2w[] = {kNGun_2w, 0};
+uint16 rpaper_2w[] = {kNPaper_2w, 0};
+uint16 rpencil_2w[] = {kNPencil_2w, 0};
+uint16 rmagnify_2w[]= {kNMagnify_2w, 0};
+uint16 rwill_2w[] = {kNWill_2w, 0};
+uint16 rserum_2w[] = {kNBottle_2w, 0};
+const uint16 *arrayReqs_2w[] = {
+ rDummy, rgarlic_2w, rmatch_2w, rstick_2w, rdyn_2w,
+ rlamp_2w, rbanana_2w, rbell_2w, rcatnip_2w, rgun_2w,
+ rpaper_2w, rpencil_2w, rmagnify_2w, rwill_2w, rserum_2w
+};
+
+uint16 rpins_3w[] = {kNNeedles_3w, 0};
+uint16 rcheese_3w[] = {kNCheese_3w, 0};
+uint16 rcrystal_3w[] = {kNCrystal_3w, 0};
+uint16 rexor_3w[] = {kNBell_3w, kNBook_3w, kNCandle_3w, 0};
+uint16 rbook_3w[] = {kNBook_3w, 0};
+uint16 rbell_3w[] = {kNBell_3w, 0};
+uint16 rpipe_3w[] = {kNPipe_3w, 0};
+const uint16 *arrayReqs_3w[] = {rDummy,rpins_3w, rcheese_3w, rcrystal_3w, rexor_3w, rbook_3w, rbell_3w, rpipe_3w};
+
+uint16 rkey_1d[] = {kNKey_1d, 0};
+uint16 rpkin_1d[] = {kNPkin_1d, 0};
+uint16 rcandle_1d[] = {kNCandle_1d, 0};
+uint16 rmask_1d[] = {kNMask_1d, 0};
+uint16 roil_1d[] = {kNOilcan_1d, 0};
+uint16 rknife_1d[] = {kNKnife_1d, 0};
+uint16 rbung_1d[] = {kNBung_1d, 0};
+const uint16 *arrayReqs_1d[] = {rDummy,rkey_1d, rpkin_1d, rcandle_1d, rmask_1d, roil_1d, rknife_1d, rbung_1d};
+
+uint16 rgarlic_2d[] = {kNGarlic_2d, 0};
+uint16 rmatch_2d[] = {kNMatches_2d, 0};
+uint16 rstick_2d[] = {kNStick_2d, 0};
+uint16 rdyn_2d[] = {kNDynamite_2d, 0};
+uint16 rlamp_2d[] = {kNLamp_2d, 0};
+uint16 rbanana_2d[] = {kNBanana_2d, 0};
+uint16 rbell_2d[] = {kNBell_2d, 0};
+uint16 rcatnip_2d[] = {kNCatnip_2d, 0};
+uint16 rgun_2d[] = {kNGun_2d, 0};
+uint16 rpaper_2d[] = {kNPaper_2d, 0};
+uint16 rpencil_2d[] = {kNPencil_2d, 0};
+uint16 rmagnify_2d[]= {kNMagnify_2d, 0};
+uint16 rwill_2d[] = {kNWill_2d, 0};
+uint16 rserum_2d[] = {kNBottle_2d, 0};
+
+const uint16 *arrayReqs_2d[] = {
+ rDummy, rgarlic_2d, rmatch_2d, rstick_2d, rdyn_2d,
+ rlamp_2d, rbanana_2d, rbell_2d, rcatnip_2d, rgun_2d,
+ rpaper_2d, rpencil_2d, rmagnify_2d, rwill_2d, rserum_2d
+};
+
+uint16 rpins_3d[] = {kNNeedles_3d, 0};
+uint16 rcheese_3d[] = {kNCheese_3d, 0};
+uint16 rcrystal_3d[] = {kNCrystal_3d, 0};
+uint16 rexor_3d[] = {kNBell_3d, kNBook_3d, kNCandle_3d, 0};
+uint16 rbook_3d[] = {kNBook_3d, 0};
+uint16 rbell_3d[] = {kNBell_3d, 0};
+
+const uint16 *arrayReqs_3d[] = {rDummy, rpins_3d, rcheese_3d, rcrystal_3d, rexor_3d, rbook_3d, rbell_3d};
+
+
+// List of 'hotspots' which are areas in which actions are taken if hero
+// steps on them. Note that they are only checked when hero collides with
+// a boundary, therefore they must always contain a boundary.
+// Structure is: screen of hotspot, coord box x1,y1,x2,y2, action list,
+// [+ viewx (or -1), viewy, direction for exits only]
+
+hotspot_t hotspots_1w[] = {
+ {0, 30, 132, 50, 168, kALscr1_1w, 33, 175, Common::KEYCODE_UP}, // Front of house to hall
+ {1, 99, 178, 136, 186, kALscr10_1w, 110, 181, Common::KEYCODE_DOWN}, // Hall to front of house
+ {1, 288, 110, 315, 175, kALscr13_1w, 290, 171, Common::KEYCODE_RIGHT}, // Hall to dining room
+ {1, 199, 110, 243, 158, kALscr15_1w, 211, 155, Common::KEYCODE_UP}, // Hall to kitchen
+ {1, 268, 53, 302, 101, kALscr115_1w, 273, 98, Common::KEYCODE_RIGHT}, // Hall to lab
+ {2, 158, 132, 193, 140, kALscr21_1w, 168, 132, Common::KEYCODE_DOWN}, // Bed1 to hall
+ {3, 3, 73, 14, 168, kALscr31_1w, 12, 161, Common::KEYCODE_LEFT}, // Dining room to hall
+ {3, 47, 66, 63, 126, kALscr35_1w, 62, 124, Common::KEYCODE_LEFT}, // Dining room to kitchen
+ {4, 126, 165, 160, 173, kALscr41_1w, 135, 166, Common::KEYCODE_DOWN}, // Bathroom to hall
+ {5, 215, 169, 272, 177, kALscr51_1w, 242, 172, Common::KEYCODE_DOWN}, // Kitchen to hall
+ {5, 262, 79, 280, 146, kALscr53_1w, 270, 140, Common::KEYCODE_RIGHT}, // Kitchen to dining room
+ {5, 213, 79, 244, 133, kALscr56_1w, 222, 140, Common::KEYCODE_UP}, // Kitchen to garden
+ {5, 25, 87, 43, 157, kALscr57_1w, 44, 150, Common::KEYCODE_LEFT}, // Kitchen to store room
+ {6, 232, 180, 312, 192, kALscr65_1w, 250, 180, Common::KEYCODE_DOWN}, // Garden to kitchen
+ {7, 263, 90, 285, 156, kALscr75_1w, 265, 150, Common::KEYCODE_RIGHT}, // Store room to kitchen
+ {8, 150, 141, 186, 143, kALscr89_1w, 152, 142, Common::KEYCODE_RIGHT}, // Basement to batcave
+ {8, 80, 30, 144, 58, kALscr87_1w, 120, 60, Common::KEYCODE_UP}, // Basement to storeroom
+ {9, 95, 74, 147, 109, kALscr910_1w, 108, 108, Common::KEYCODE_UP}, // Batcave to mummy room
+ {9, 250, 177, 319, 185, kALscr98_1w, 275, 179, Common::KEYCODE_DOWN}, // Batcave to basement
+ {10, 30, 178, 218, 188, kALscr109_1w, 107, 178, Common::KEYCODE_DOWN}, // Mummy room to batcave
+ {10, 258, 57, 282, 122, kALscr1011_1w, 265, 125, Common::KEYCODE_UP}, // Mummy room to lake room
+ {11, 43, 180, 88, 193, kALscr1110_1w, 55, 182, Common::KEYCODE_DOWN}, // Lake room to mummy room
+ {11, 300, 30, 319, 86, kALscr1112_1w, 300, 70, Common::KEYCODE_RIGHT}, // Lake room to dead-end
+ {12, 52, 175, 295, 190, kALscr1211_1w, 142, 176, Common::KEYCODE_DOWN}, // Dead-end to lake room
+ {12, 137, 33, 178, 80, kALscr1213_1w, 152, 75, Common::KEYCODE_UP}, // Dead-end to jail
+ {15, 19, 110, 34, 182, kALscr151_1w, 30, 177, Common::KEYCODE_LEFT}, // Laboratory to hall
+ {15, 109, 150, 144, 156, kALbox_1w, -1, -1, -1}, // Professor's box
+ {-1, -1, -1, -1, -1, 0, -1, -1, -1} // End of list marker
+};
+
+hotspot_t hotspots_2w[] = {
+ {2, 81, 177, 124, 190, kALscr0201_2w, 93, 178, Common::KEYCODE_DOWN}, // bed1 to hall
+ {3, 1, 100, 32, 168, kALscr0305_2w, 30, 162, Common::KEYCODE_LEFT}, // bed2 to bed3
+ {3, 230, 182, 277, 194, kALscr0301_2w, 242, 183, Common::KEYCODE_DOWN}, // bed2 to hall
+ {5, 207, 89, 240, 150, kALscr0503_2w, 209, 143, Common::KEYCODE_RIGHT}, // bed3 to bed2
+ {5, 167, 155, 214, 165, kALscr0301_2w, 182, 157, Common::KEYCODE_DOWN}, // bed3 to hall (same as bed2 to hall)
+ {6, 201, 80, 238, 132, kALscr0607_2w, 217, 130, Common::KEYCODE_UP}, // kitchen to backdoor
+ {6, 279, 92, 313, 162, kALscr0631_2w, 289, 156, Common::KEYCODE_RIGHT}, // kitchen to parlor
+ {7, 122, 95, 171, 159, kALscr0706_2w, 140, 157, Common::KEYCODE_UP}, // backdoor to kitchen
+ {7, 4, 179, 302, 199, kALscr0708_2w, 208, 181, Common::KEYCODE_DOWN}, // backdoor to shed
+ {7, 0, 174, 14, 190, kALscr0708_2w, 80, 181, Common::KEYCODE_LEFT}, // backdoor to shed (again)
+ {7, 294, 150, 319, 199, kALscr0710_2w, 300, 174, Common::KEYCODE_RIGHT}, // backdoor to venus fly traps
+ {8, 0, 121, 20, 171, kALscr0807_2w, 17, 148, Common::KEYCODE_LEFT}, // shed to backdoor
+ {8, 305, 121, 319, 171, kALscrgate1_2w, 307, 152, Common::KEYCODE_RIGHT}, // shed to gates
+ {8, 160, 87, 191, 134, kALscr0809_2w, 164, 132, Common::KEYCODE_RIGHT}, // shed to inside shed
+ {9, 34, 76, 66, 137, kALscr0908_2w, 64, 133, Common::KEYCODE_LEFT}, // inside shed to shed
+ {10, 0, 96, 15, 160, kALscr1007_2w, 10, 132, Common::KEYCODE_LEFT}, // venus to backdoor
+ {10, 299, 96, 319, 160, kALscrgate1_2w, 301, 124, Common::KEYCODE_RIGHT}, // venus to gates
+ {10, 32, 97, 298, 158, kALvenus_2w, -1, -1, -1}, // venus fly traps
+ {11, 0, 155, 12, 185, kALscr1108_2w, 11, 172, Common::KEYCODE_LEFT}, // gates (open) to shed
+ {12, 0, 155, 12, 185, kALscr1108_2w, 11, 172, Common::KEYCODE_LEFT}, // gates (close) to shed
+ {11, 300, 157, 319, 185, kALscr1113_2w, 301, 172, Common::KEYCODE_RIGHT}, // gates (open) to stream
+ {12, 300, 157, 319, 185, kALscr1113_2w, 301, 172, Common::KEYCODE_RIGHT}, // gates (close) to stream
+ {11, 145, 103, 195, 145, kAL11maze_2w, 167, 143, Common::KEYCODE_UP}, // gatesopn to maze
+ {13, 0, 133, 14, 163, kALscrgate2_2w, 14, 145, Common::KEYCODE_LEFT}, // stream to gates
+ {13, 303, 146, 319, 173, kALscr1314_2w, 305, 153, Common::KEYCODE_RIGHT}, // stream to zapper
+ {13, 158, 115, 226, 147, kALbridge_2w, -1, -1, -1}, // bridge over stream
+ {14, 0, 96, 14, 160, kALscr1413_2w, 10, 134, Common::KEYCODE_LEFT}, // zapper to stream
+ {14, 301, 96, 319, 160, kALscr1415_2w, 302, 134, Common::KEYCODE_RIGHT}, // zapper to mushroom
+ {15, 0, 96, 16, 130, kALscr1514_2w, 14, 130, Common::KEYCODE_LEFT}, // mushroom to zapper
+ {15, 296, 96, 312, 130, kALscr1517_2w, 298, 127, Common::KEYCODE_RIGHT}, // mushroom to snakepit
+ {15, 60, 182, 256, 196, kALscr1516_2w, 157, 183, Common::KEYCODE_DOWN}, // mushroom to well
+ {16, 83, 48, 144, 69, kALscr1615_2w, 106, 69, Common::KEYCODE_UP}, // well to mushroom
+ {17, 0, 128, 20, 152, kALscr1715_2w, 19, 143, Common::KEYCODE_LEFT}, // snakepit to mushroom
+ {17, 303, 144, 319, 172, kALscr1718_2w, 305, 150, Common::KEYCODE_RIGHT}, // snakepit to phonebox
+ {17, 301, 98, 319, 115, kALscr1720_2w, 303, 110, Common::KEYCODE_RIGHT}, // snakepit to kennel
+ {18, 0, 54, 15, 120, kALscr1817_2w, 12, 108, Common::KEYCODE_LEFT}, // phonebox to snakepit
+ {18, 0, 122, 15, 181, kALscr1819l_2w, 13, 136, Common::KEYCODE_LEFT}, // phonebox to street (left)
+ {18, 0, 175, 319, 199, kALscr1819c_2w, 155, 177, Common::KEYCODE_DOWN}, // phonebox to street (center)
+ {18, 304, 95, 319, 199, kALscr1819r_2w, 307, 136, Common::KEYCODE_RIGHT}, // phonebox to street (right)
+ {18, 15, 122, 56, 130, kALphonebox_2w, -1, -1, -1}, // in the phonebox
+ {19, 0, 122, 20, 183, kALscr1918l_2w, 19, 131, Common::KEYCODE_LEFT}, // street to phonebox (left)
+ {19, 0, 175, 319, 199, kALscr1918c_2w, 153, 175, Common::KEYCODE_DOWN}, // street to phonebox (center)
+ {19, 301, 122, 319, 199, kALscr1918r_2w, 304, 131, Common::KEYCODE_RIGHT}, // street to phonebox (right)
+ {20, 5, 103, 22, 186, kALscr2017_2w, 16, 145, Common::KEYCODE_LEFT}, // kennel to snakepit
+ {22, 280, 41, 312, 102, kALscr2223_2w, 289, 92, Common::KEYCODE_RIGHT}, // rockgone to threeway
+ {23, 59, 179, 245, 193, kALscr2322_2w, 146, 179, Common::KEYCODE_DOWN}, // threeway to rockgone
+ {23, 11, 42, 33, 103, kALscr2324_2w, 18, 90, Common::KEYCODE_LEFT}, // threeway to lampcave
+ {23, 141, 28, 178, 65, kALscr2325_2w, 150, 58, Common::KEYCODE_UP}, // threeway to chasm
+ {23, 273, 40, 296, 100, kALscr2326_2w, 291, 87, Common::KEYCODE_RIGHT}, // threeway to passage
+ {24, 300, 83, 319, 183, kALscr2423_2w, 304, 120, Common::KEYCODE_RIGHT}, // lampcave to threeway
+ {25, 0, 98, 15, 171, kALscr2523_2w, 14, 167, Common::KEYCODE_LEFT}, // chasm to threeway
+ {25, 172, 95, 221, 172, kALchasm_2w, -1, -1, -1}, // chasm
+ {26, 0, 94, 19, 179, kALscr2623_2w, 17, 157, Common::KEYCODE_LEFT}, // passage to threeway
+ {26, 300, 87, 319, 179, kALscr2627_2w, 302, 157, Common::KEYCODE_RIGHT}, // passage to ladder
+ {27, 0, 100, 15, 180, kALscr2726_2w, 14, 152, Common::KEYCODE_LEFT}, // ladder to passage
+ {27, 200, 23, 243, 55, kALtrap_2w, 210, 100, Common::KEYCODE_UP}, // trapdoor at top of ladder
+ {28, 218, 143, 242, 149, kALscr2827_2w, 225, 147, Common::KEYCODE_UP}, // traproom to ladder
+ {28, 35, 96, 74, 153, kALscr2829_2w, 71, 150, Common::KEYCODE_LEFT}, // traproom to hall2
+ {29, 274, 55, 319, 142, kALscr2928_2w, 283, 134, Common::KEYCODE_RIGHT}, // hall2 to traproom
+ {29, 235, 41, 275, 106, kALscr2930_2w, 242, 100, Common::KEYCODE_RIGHT}, // hall2 to lounge
+ {29, 81, 28, 108, 74, kALscr2931_2w, 90, 71, Common::KEYCODE_UP}, // hall2 to parlor
+ {29, 15, 71, 54, 95, kALscr2934_2w, 48, 84, Common::KEYCODE_LEFT}, // hall2 to hall3
+ {29, 0, 57, 20, 144, kALscr2938_2w, 19, 135, Common::KEYCODE_LEFT}, // hall2 to hall1
+ {30, 222, 183, 258, 199, kALscr3029_2w, 232, 183, Common::KEYCODE_DOWN}, // lounge to hall2
+ {31, 263, 90, 287, 146, kALscr3132_2w, 266, 143, Common::KEYCODE_RIGHT}, // parlor to catroom
+ {31, 172, 164, 211, 178, kALscr3129_2w, 185, 165, Common::KEYCODE_DOWN}, // parlor to hall2
+ {31, 0, 97, 46, 158, kALscr3106_2w, 35, 154, Common::KEYCODE_LEFT}, // parlor to kitchen
+ {32, 60, 73, 90, 123, kALscr3231_2w, 83, 120, Common::KEYCODE_LEFT}, // catroom to parlor
+ {34, 6, 100, 39, 179, kALscr3438_2w, 38, 172, Common::KEYCODE_LEFT}, // hall3 to hall1
+ {34, 7, 180, 311, 199, kALscr3429_2w, 168, 186, Common::KEYCODE_DOWN}, // hall3 to hall2
+ {35, 65, 176, 101, 188, kALscr3534_2w, 74, 178, Common::KEYCODE_DOWN}, // organ to hall3
+ {36, 238, 164, 272, 177, kALscr3634_2w, 250, 166, Common::KEYCODE_DOWN}, // hestroom to hall3
+ {36, 62, 140, 158, 158, kALhtable_2w, -1, -1, -1}, // hestroom table
+ {37, 253, 82, 286, 84, kALscr3718_2w, 254, 83, Common::KEYCODE_RIGHT}, // retupmoc to phonebox
+ {38, 275, 116, 307, 166, kALscr3829_2w, 279, 164, Common::KEYCODE_RIGHT}, // hall1 to hall2
+ {38, 142, 108, 172, 150, kALscr3834_2w, 152, 150, Common::KEYCODE_UP}, // hall1 to hall3
+ {MAZE_SCREEN + 59, 100, 140, 180, 160, kALexitmaze_2w, 133, 143, Common::KEYCODE_DOWN}, // Exit maze
+ {-1, -1, -1, -1, -1, 0, -1, -1, -1} // End of list marker
+};
+
+hotspot_t hotspots_3w[] = {
+ {CRASH_3w, 0, 163, 30, 190, kALcrash_web_3w, 11, 176, Common::KEYCODE_LEFT},
+ {CRASH_3w, 164, 102, 205, 144, kALplane_3w, 178, 153, Common::KEYCODE_UP},
+ {PLANE_3w, 120, 126, 220, 170, kALexit_3w, 0, 0, Common::KEYCODE_DOWN}, // Hero invisible so exit is instant
+ {WEB_3w, 296, 73, 319, 190, kALweb_crash_3w, 307, 149, Common::KEYCODE_RIGHT},
+ {WEB_3w, 0, 156, 30, 190, kALweb_path_3w, 15, 182, Common::KEYCODE_LEFT},
+ {PATH_UL_3w, 293, 161, 319, 190, kALpath_web_3w, 305, 181, Common::KEYCODE_RIGHT},
+ {PATH_UL_3w, 0, 127, 24, 138, kALpath_brg_3w, 12, 137, Common::KEYCODE_LEFT},
+ {BRIDGE_3w, 296, 125, 319, 138, kALbrg_path_3w, 309, 135, Common::KEYCODE_RIGHT},
+ {BRIDGE_3w, 0, 125, 21, 138, kALbrg_clftop_3w, 10, 135, Common::KEYCODE_LEFT},
+ {BRIDGE_3w, 225, 132, 240, 135, kALblk_3w, -1, -1, -1},
+ {BRIDGE2_3w, 296, 125, 319, 138, kALbrg_path_3w, 309, 135, Common::KEYCODE_RIGHT},
+ {BRIDGE2_3w, 0, 125, 21, 138, kALbrg_clftop_3w, 10, 135, Common::KEYCODE_LEFT},
+ {CLIFFTOP_3w, 293, 69, 319, 79, kALclftop_brg_3w, 303, 77, Common::KEYCODE_RIGHT},
+ {CLIFFTOP_3w, 294, 131, 319, 149, kALclftop_slope_3w, 304, 136, Common::KEYCODE_RIGHT},
+ {CLIFFTOP_3w, 290, 171, 319, 186, kALclftop_clf_3w, 303, 176, Common::KEYCODE_RIGHT},
+ {SLOPE_3w, 0, 147, 25, 165, kALslope_clftop_3w, 13, 164, Common::KEYCODE_LEFT},
+ {SLOPE_3w, 291, 127, 319, 143, kALslope_stream_3w, 303, 141, Common::KEYCODE_RIGHT},
+ {CLIFF_3w, 0, 152, 26, 190, kALclf_clftop_3w, 15, 183, Common::KEYCODE_LEFT},
+ {CLIFF_3w, 293, 152, 319, 190, kALclf_wfall_3w, 303, 183, Common::KEYCODE_RIGHT},
+ {STREAM_3w, 0, 160, 26, 190, kALstream_slope_3w, 13, 177, Common::KEYCODE_LEFT},
+ {STREAM_3w, 293, 163, 319, 190, kALstream_path_3w, 307, 177, Common::KEYCODE_RIGHT},
+ {STREAM_3w, 198, 140, 245, 160, kALfindbook_3w, -1, -1, -1},
+ {STREAM2_3w, 0, 160, 26, 190, kALstream_slope_3w, 13, 177, Common::KEYCODE_LEFT},
+ {STREAM2_3w, 293, 163, 319, 190, kALstream_path_3w, 307, 177, Common::KEYCODE_RIGHT},
+ {STREAM2_3w, 198, 140, 245, 160, kALfindbook_3w, -1, -1, -1},
+ {PATH_3w, 292, 161, 319, 190, kALpath_village_3w, 304, 184, Common::KEYCODE_RIGHT},
+ {PATH_3w, 0, 161, 24, 190, kALpath_stream_3w, 13, 184, Common::KEYCODE_LEFT},
+ {VILLAGE_3w, 14, 137, 41, 156, kALvillage_thing_3w, -1, -1, -1},
+ {VILLAGE_3w, 0, 148, 24, 190, kALvillage_path_3w, 14, 175, Common::KEYCODE_LEFT},
+ {VILLAGE_3w, 292, 161, 319, 190, kALvillage_turn_3w, 307, 175, Common::KEYCODE_RIGHT},
+ {VILLAGE_3w, 14, 126, 111, 155, kALvillage_camp_l_3w, 90, 153, Common::KEYCODE_UP},
+ {VILLAGE_3w, 112, 126, 252, 155, kALvillage_camp_r_3w, 162, 153, Common::KEYCODE_UP},
+ {HUT_OUT_3w, 0, 147, 30, 190, kALhut_camp_3w, 14, 177, Common::KEYCODE_LEFT},
+ {HUT_OUT_3w, 290, 147, 319, 190, kALhut_village_r_3w, 304, 177, Common::KEYCODE_RIGHT}, // Exit right
+ {HUT_OUT_3w, 14, 178, 319, 190, kALhut_village_c_3w, 150, 189, Common::KEYCODE_DOWN}, // Exit center
+ {HUT_OUT_3w, 132, 126, 177, 145, kALhut_enter_3w, 150, 136, Common::KEYCODE_UP},
+ {HUT_IN_3w, 138, 183, 189, 199, kALhut_out_3w, 153, 189, Common::KEYCODE_DOWN},
+ {CAMP_3w, 290, 136, 319, 190, kALcamp_hut_3w, 303, 165, Common::KEYCODE_RIGHT},
+ {CAMP_3w, 0, 109, 27, 190, kALcamp_village_l_3w, 13, 155, Common::KEYCODE_LEFT}, // exit left
+ {CAMP_3w, 13, 180, 303, 199, kALcamp_village_c_3w, 130, 190, Common::KEYCODE_DOWN}, // exit center
+ {TURN_3w, 0, 114, 28, 133, kALturn_village_3w, 14, 131, Common::KEYCODE_LEFT},
+ {TURN_3w, 0, 165, 28, 190, kALturn_cave_3w, 13, 180, Common::KEYCODE_LEFT},
+ {CAVE_3w, 291, 140, 319, 190, kALcave_turn_3w, 307, 184, Common::KEYCODE_RIGHT},
+ {CAVE_3w, 0, 146, 27, 190, kALcave_wfall_3w, 14, 184, Common::KEYCODE_LEFT},
+ {CAVE_3w, 86, 128, 162, 141, kALcave_oldman_3w, 114, 134, Common::KEYCODE_UP},
+ {WFALL_3w, 0, 166, 28, 190, kALwfall_clf_3w, 14, 184, Common::KEYCODE_LEFT},
+ {WFALL_3w, 294, 159, 319, 190, kALwfall_cave_3w, 306, 184, Common::KEYCODE_RIGHT},
+ {WFALL_3w, 238, 147, 284, 158, kALwfall_wbase_3w, 255, 154, Common::KEYCODE_UP},
+ {WFALL_B_3w, 0, 166, 28, 190, kALwfallb_clf_3w, 14, 184, Common::KEYCODE_LEFT},
+ {WFALL_B_3w, 294, 159, 319, 190, kALwfallb_cave_3w, 306, 184, Common::KEYCODE_RIGHT},
+ {WFALL_B_3w, 238, 147, 284, 158, kALwfallb_wbase_3w, 255, 154, Common::KEYCODE_UP},
+ {WBASE_3w, 295, 146, 319, 190, kALwbase_wfall_3w, 306, 154, Common::KEYCODE_RIGHT},
+ {WBASE_3w, 0, 149, 26, 190, kALwbase_garden_3w, 14, 154, Common::KEYCODE_LEFT},
+ {GARDEN_3w, 294, 165, 319, 190, kALgarden_wbase_3w, 306, 177, Common::KEYCODE_RIGHT},
+ {-1, -1, -1, -1, -1, 0, -1, -1, -1} // End of list marker
+};
+
+hotspot_t hotspots_1d[] = {
+ {0, 30, 159, 50, 165, kALscr1_1d, -1, -1, -1}, // Front of house to hall
+ {1, 99, 180, 136, 184, kALscr10_1d, -1, -1, -1}, // Hall to front of house
+ {1, 280, 160, 315, 175, kALscr13_1d, -1, -1, -1}, // Hall to dining room
+ {1, 199, 151, 243, 158, kALscr15_1d, -1, -1, -1}, // Hall to kitchen
+ {1, 264, 97, 302, 101, kALscr115_1d, -1, -1, -1}, // Hall to lab
+ {2, 158, 132, 193, 140, kALscr21_1d, -1, -1, -1}, // Bed1 to hall
+ {3, 0, 152, 17, 168, kALscr31_1d, -1, -1, -1}, // Dining room to hall
+ {3, 51, 117, 63, 129, kALscr35_1d, -1, -1, -1}, // Dining room to kitchen
+ {4, 126, 165, 160, 173, kALscr41_1d, -1, -1, -1}, // Bathroom to hall
+ {5, 215, 169, 272, 177, kALscr51_1d, -1, -1, -1}, // Kitchen to hall
+ {5, 248, 135, 291, 152, kALscr53_1d, -1, -1, -1}, // Kitchen to dining room
+ {5, 212, 128, 245, 134, kALscr56_1d, -1, -1, -1}, // Kitchen to garden
+ {5, 20, 140, 45, 156, kALscr57_1d, -1, -1, -1}, // Kitchen to store room
+ {6, 232, 186, 312, 192, kALscr65_1d, -1, -1, -1}, // Garden to kitchen
+ {7, 257, 142, 279, 157, kALscr75_1d, -1, -1, -1}, // Store room to kitchen
+ {8, 156, 141, 186, 143, kALscr89_1d, -1, -1, -1}, // Basement to batcave
+ {8, 108, 50, 141, 56, kALscr87_1d, -1, -1, -1}, // Basement to storeroom
+ {9, 95, 104, 147, 109, kALscr910_1d, -1, -1, -1}, // Batcave to mummy room
+ {9, 250, 177, 319, 185, kALscr98_1d, -1, -1, -1}, // Batcave to basement
+ {10, 30, 178, 223, 188, kALscr109_1d, -1, -1, -1}, // Mummy room to batcave
+ {10, 258, 117, 282, 125, kALscr1011_1d, -1, -1, -1}, // Mummy room to lake room
+ {11, 43, 183, 88, 191, kALscr1110_1d, -1, -1, -1}, // Lake room to mummy room
+ {11, 300, 50, 319, 86, kALscr1112_1d, -1, -1, -1}, // Lake room to dead-end
+ {12, 52, 175, 295, 187, kALscr1211_1d, -1, -1, -1}, // Dead-end to lake room
+ {12, 137, 67, 178, 76, kALscr1213_1d, -1, -1, -1}, // Dead-end to jail
+ {15, 19, 171, 34, 182, kALscr151_1d, -1, -1, -1}, // Laboratory to hall
+ {15, 109, 150, 144, 156, kALbox_1d, -1, -1, -1}, // Professor's box
+ {-1, -1, -1, -1, -1, 0, -1, -1, -1} // End of list marker
+};
+
+hotspot_t hotspots_2d[] = {
+ {2, 81, 177, 124, 190, kALscr0201_2d, -1, -1, -1}, // bed1 to hall
+ {3, 1, 155, 32, 168, kALscr0305_2d, -1, -1, -1}, // bed2 to bed3
+ {3, 230, 182, 277, 194, kALscr0301_2d, -1, -1, -1}, // bed2 to hall
+ {5, 207, 136, 240, 150, kALscr0503_2d, -1, -1, -1}, // bed3 to bed2
+ {5, 167, 155, 214, 165, kALscr0301_2d, -1, -1, -1}, // bed3 to hall (same as bed2 to hall)
+ {6, 201, 125, 238, 132, kALscr0607_2d, -1, -1, -1}, // kitchen to backdoor
+ {6, 279, 154, 313, 162, kALscr0631_2d, -1, -1, -1}, // kitchen to parlor
+ {7, 122, 154, 171, 159, kALscr0706_2d, -1, -1, -1}, // backdoor to kitchen
+ {7, 4, 179, 302, 199, kALscr0708_2d, -1, -1, -1}, // backdoor to shed
+ {7, 0, 174, 14, 190, kALscr0708_2d, -1, -1, -1}, // backdoor to shed (again)
+ {7, 294, 150, 319, 199, kALscr0710_2d, -1, -1, -1}, // backdoor to venus fly traps
+ {8, 0, 121, 20, 171, kALscr0807_2d, -1, -1, -1}, // shed to backdoor
+ {8, 305, 121, 319, 171, kALscrgate1_2d, -1, -1, -1}, // shed to gates
+ {8, 160, 127, 191, 134, kALscr0809_2d, -1, -1, -1}, // shed to inside shed
+ {9, 34, 129, 66, 137, kALscr0908_2d, -1, -1, -1}, // inside shed to shed
+ {10, 0, 96, 12, 160, kALscr1007_2d, -1, -1, -1}, // venus to backdoor
+ {10, 299, 96, 319, 160, kALscrgate1_2d, -1, -1, -1}, // venus to gates
+ {10, 32, 97, 298, 158, kALvenus_2d, -1, -1, -1}, // venus fly traps
+ {11, 0, 155, 12, 185, kALscr1108_2d, -1, -1, -1}, // gates (open) to shed
+ {12, 0, 155, 12, 185, kALscr1108_2d, -1, -1, -1}, // gates (close) to shed
+ {11, 300, 157, 319, 185, kALscr1113_2d, -1, -1, -1}, // gates (open) to stream
+ {12, 300, 157, 319, 185, kALscr1113_2d, -1, -1, -1}, // gates (close) to stream
+ {11, 145, 133, 195, 145, kAL11maze_2d, -1, -1, -1}, // gatesopn to maze
+ {13, 0, 133, 14, 163, kALscrgate2_2d, -1, -1, -1}, // stream to gates
+ {13, 303, 146, 319, 173, kALscr1314_2d, -1, -1, -1}, // stream to zapper
+ {13, 158, 115, 226, 147, kALbridge_2d, -1, -1, -1}, // bridge over stream
+ {14, 0, 96, 14, 160, kALscr1413_2d, -1, -1, -1}, // zapper to stream
+ {14, 301, 96, 319, 160, kALscr1415_2d, -1, -1, -1}, // zapper to mushroom
+ {15, 0, 96, 16, 130, kALscr1514_2d, -1, -1, -1}, // mushroom to zapper
+ {15, 296, 96, 312, 130, kALscr1517_2d, -1, -1, -1}, // mushroom to snakepit
+ {15, 60, 182, 256, 196, kALscr1516_2d, -1, -1, -1}, // mushroom to well
+ {16, 83, 59, 144, 69, kALscr1615_2d, -1, -1, -1}, // well to mushroom
+ {17, 0, 128, 20, 152, kALscr1715_2d, -1, -1, -1}, // snakepit to mushroom
+ {17, 303, 144, 319, 172, kALscr1718_2d, -1, -1, -1}, // snakepit to phonebox
+ {17, 301, 98, 319, 115, kALscr1720_2d, -1, -1, -1}, // snakepit to kennel
+ {18, 0, 54, 15, 120, kALscr1817_2d, -1, -1, -1}, // phonebox to snakepit
+ {18, 0, 122, 15, 181, kALscr1819l_2d, -1, -1, -1}, // phonebox to street (left)
+ {18, 0, 175, 319, 199, kALscr1819c_2d, -1, -1, -1}, // phonebox to street (center)
+ {18, 304, 95, 319, 199, kALscr1819r_2d, -1, -1, -1}, // phonebox to street (right)
+ {18, 15, 122, 56, 130, kALphonebox_2d, -1, -1, -1}, // in the phonebox
+ {19, 0, 122, 20, 183, kALscr1918l_2d, -1, -1, -1}, // street to phonebox (left)
+ {19, 0, 175, 319, 199, kALscr1918c_2d, -1, -1, -1}, // street to phonebox (center)
+ {19, 301, 122, 319, 199, kALscr1918r_2d, -1, -1, -1}, // street to phonebox (right)
+ {20, 5, 103, 22, 186, kALscr2017_2d, -1, -1, -1}, // kennel to snakepit
+ {22, 287, 75, 312, 102, kALscr2223_2d, -1, -1, -1}, // rockgone to threeway
+ {23, 59, 179, 245, 193, kALscr2322_2d, -1, -1, -1}, // threeway to rockgone
+ {23, 11, 82, 33, 103, kALscr2324_2d, -1, -1, -1}, // threeway to lampcave
+ {23, 141, 52, 178, 65, kALscr2325_2d, -1, -1, -1}, // threeway to chasm
+ {23, 273, 79, 296, 100, kALscr2326_2d, -1, -1, -1}, // threeway to passage
+ {24, 300, 83, 319, 183, kALscr2423_2d, -1, -1, -1}, // lampcave to threeway
+ {25, 0, 98, 15, 171, kALscr2523_2d, -1, -1, -1}, // chasm to threeway
+ {25, 172, 95, 221, 172, kALchasm_2d, -1, -1, -1}, // chasm
+ {26, 0, 94, 19, 179, kALscr2623_2d, -1, -1, -1}, // passage to threeway
+ {26, 300, 87, 319, 179, kALscr2627_2d, -1, -1, -1}, // passage to ladder
+ {27, 0, 100, 15, 180, kALscr2726_2d, -1, -1, -1}, // ladder to passage
+ {27, 200, 43, 243, 55, kALtrap_2d, -1, -1, -1}, // trapdoor at top of ladder
+ {28, 218, 143, 242, 149, kALscr2827_2d, -1, -1, -1}, // traproom to ladder
+ {28, 35, 146, 74, 153, kALscr2829_2d, -1, -1, -1}, // traproom to hall2
+ {29, 274, 126, 319, 142, kALscr2928_2d, -1, -1, -1}, // hall2 to traproom
+ {29, 235, 91, 275, 106, kALscr2930_2d, -1, -1, -1}, // hall2 to lounge
+ {29, 81, 58, 108, 74, kALscr2931_2d, -1, -1, -1}, // hall2 to parlor
+ {29, 15, 71, 54, 95, kALscr2934_2d, -1, -1, -1}, // hall2 to hall3
+ {29, 0, 130, 20, 144, kALscr2938_2d, -1, -1, -1}, // hall2 to hall1
+ {30, 222, 183, 258, 199, kALscr3029_2d, -1, -1, -1}, // lounge to hall2
+ {31, 263, 141, 287, 146, kALscr3132_2d, -1, -1, -1}, // parlor to catroom
+ {31, 172, 164, 211, 178, kALscr3129_2d, -1, -1, -1}, // parlor to hall2
+ {31, 0, 148, 46, 158, kALscr3106_2d, -1, -1, -1}, // parlor to kitchen
+ {32, 60, 118, 90, 123, kALscr3231_2d, -1, -1, -1}, // catroom to parlor
+ {34, 6, 167, 39, 179, kALscr3438_2d, -1, -1, -1}, // hall3 to hall1
+ {34, 7, 185, 311, 199, kALscr3429_2d, -1, -1, -1}, // hall3 to hall2
+ {35, 65, 176, 101, 188, kALscr3534_2d, -1, -1, -1}, // organ to hall3
+ {36, 238, 164, 272, 177, kALscr3634_2d, -1, -1, -1}, // hestroom to hall3
+ {36, 62, 140, 158, 158, kALhtable_2d, -1, -1, -1}, // hestroom table
+ {37, 253, 82, 286, 84, kALscr3718_2d, -1, -1, -1}, // retupmoc to phonebox
+ {38, 275, 156, 307, 166, kALscr3829_2d, -1, -1, -1}, // hall1 to hall2
+ {38, 142, 138, 172, 150, kALscr3834_2d, -1, -1, -1}, // hall1 to hall3
+ {MAZE_SCREEN+59, 100, 140, 180, 160, kALexitmaze_2d, -1, -1, -1}, // Exit maze
+ {-1, -1, -1, -1, -1, 0, -1, -1, -1} // End of list marker
+};
+
+hotspot_t hotspots_3d[] = {
+ {CRASH_3d, 65, 148, 309, 158, kALhorizon_3d, -1, -1, -1},
+ {CRASH_3d, 0, 163, 30, 190, kALcrash_web_3d, -1, -1, -1},
+ {WEB_3d, 296, 73, 319, 190, kALweb_crash_3d, -1, -1, -1},
+ {WEB_3d, 0, 156, 30, 190, kALweb_path_3d, -1, -1, -1},
+ {PATH_UL_3d, 293, 161, 319, 190, kALpath_web_3d, -1, -1, -1},
+ {PATH_UL_3d, 0, 127, 24, 138, kALpath_brg_3d, -1, -1, -1},
+ {BRIDGE_3d, 296, 131, 319, 135, kALbrg_path_3d, -1, -1, -1},
+ {BRIDGE_3d, 0, 130, 21, 135, kALbrg_clftop_3d, -1, -1, -1},
+ {BRIDGE_3d, 225, 132, 235, 135, kALblk_3d, -1, -1, -1},
+ {BRIDGE2_3d, 296, 131, 319, 135, kALbrg_path_3d, -1, -1, -1},
+ {BRIDGE2_3d, 0, 130, 21, 135, kALbrg_clftop_3d, -1, -1, -1},
+ {CLIFFTOP_3d, 293, 69, 319, 79, kALclftop_brg_3d, -1, -1, -1},
+ {CLIFFTOP_3d, 294, 131, 319, 149, kALclftop_slope_3d, -1, -1, -1},
+ {CLIFFTOP_3d, 290, 171, 319, 186, kALclftop_clf_3d, -1, -1, -1},
+ {SLOPE_3d, 0, 147, 25, 165, kALslope_clftop_3d, -1, -1, -1},
+ {SLOPE_3d, 291, 127, 319, 143, kALslope_stream_3d, -1, -1, -1},
+ {CLIFF_3d, 0, 152, 26, 190, kALclf_clftop_3d, -1, -1, -1},
+ {CLIFF_3d, 293, 152, 319, 190, kALclf_wfall_3d, -1, -1, -1},
+ {STREAM_3d, 0, 160, 26, 190, kALstream_slope_3d, -1, -1, -1},
+ {STREAM_3d, 293, 163, 319, 190, kALstream_path_3d, -1, -1, -1},
+ {STREAM_3d, 198, 140, 245, 160, kALfindbook_3d, -1, -1, -1},
+ {STREAM2_3d, 0, 160, 26, 190, kALstream_slope_3d, -1, -1, -1},
+ {STREAM2_3d, 293, 163, 319, 190, kALstream_path_3d, -1, -1, -1},
+ {STREAM2_3d, 198, 140, 245, 160, kALfindbook_3d, -1, -1, -1},
+ {PATH_3d, 292, 161, 319, 190, kALpath_village_3d, -1, -1, -1},
+ {PATH_3d, 0, 161, 24, 190, kALpath_stream_3d, -1, -1, -1},
+ {VILLAGE_3d, 14, 137, 41, 156, kALvillage_thing_3d, -1, -1, -1},
+ {VILLAGE_3d, 0, 148, 24, 190, kALvillage_path_3d, -1, -1, -1},
+ {VILLAGE_3d, 292, 161, 319, 190, kALvillage_turn_3d, -1, -1, -1},
+ {VILLAGE_3d, 14, 139, 111, 155, kALvillage_camp_l_3d, -1, -1, -1},
+ {VILLAGE_3d, 112, 139, 252, 155, kALvillage_camp_r_3d, -1, -1, -1},
+ {HUT_OUT_3d, 0, 147, 30, 190, kALhut_camp_3d, -1, -1, -1},
+ {HUT_OUT_3d, 290, 147, 319, 190, kALhut_village_r_3d, -1, -1, -1},
+ {HUT_OUT_3d, 14, 178, 319, 190, kALhut_village_c_3d, -1, -1, -1},
+ {HUT_OUT_3d, 132, 126, 177, 145, kALhut_enter_3d, -1, -1, -1},
+ {HUT_IN_3d, 138, 183, 189, 199, kALhut_out_3d, -1, -1, -1},
+ {CAMP_3d, 290, 136, 319, 190, kALcamp_hut_3d, -1, -1, -1},
+ {CAMP_3d, 0, 109, 27, 190, kALcamp_village_l_3d, -1, -1, -1},
+ {CAMP_3d, 13, 180, 303, 199, kALcamp_village_c_3d, -1, -1, -1},
+ {TURN_3d, 0, 114, 28, 133, kALturn_village_3d, -1, -1, -1},
+ {TURN_3d, 0, 165, 28, 190, kALturn_cave_3d, -1, -1, -1},
+ {CAVE_3d, 291, 140, 319, 190, kALcave_turn_3d, -1, -1, -1},
+ {CAVE_3d, 0, 146, 27, 190, kALcave_wfall_3d, -1, -1, -1},
+ {CAVE_3d, 86, 128, 162, 141, kALcave_oldman_3d, -1, -1, -1},
+ {WFALL_3d, 0, 166, 28, 190, kALwfall_clf_3d, -1, -1, -1},
+ {WFALL_3d, 294, 159, 319, 190, kALwfall_cave_3d, -1, -1, -1},
+ {WFALL_3d, 238, 147, 284, 158, kALwfall_wbase_3d, -1, -1, -1},
+ {WFALL_B_3d, 0, 166, 28, 190, kALwfallb_clf_3d, -1, -1, -1},
+ {WFALL_B_3d, 294, 159, 319, 190, kALwfallb_cave_3d, -1, -1, -1},
+ {WFALL_B_3d, 238, 147, 284, 158, kALwfallb_wbase_3d, -1, -1, -1},
+ {WBASE_3d, 295, 146, 319, 190, kALwbase_wfall_3d, -1, -1, -1},
+ {WBASE_3d, 0, 149, 26, 190, kALwbase_garden_3d, -1, -1, -1},
+ {GARDEN_3d, 294, 165, 319, 190, kALgarden_wbase_3d, -1, -1, -1},
+ {-1, -1, -1, -1, -1, 0, -1, -1, -1} // End of list marker
+};
+
+// List all objects that can appear in inventory list
+int16 invent_1w[] = {
+ PKIN_1w, KEY_1w, CANDLE_1w, KNIFE_1w, WHISTLE_1w,
+ MASK_1w, CHOP_1w, OILCAN_1w, GOLD_1w, BUNG_1w,
+ -1
+};
+
+int16 invent_2w[] = {
+ MATCHES_2w, GARLIC_2w, MAGNIFY_2w, CATNIP_2w, STICK_2w,
+ DYNAMITE_2w, OILLAMP_2w, BANANA_2w, WILL_2w, ALBUM_2w,
+ PAPER_2w, PENCIL_2w, SCREW_2w, BELL_2w, GUN_2w,
+ BOTTLE_2w, -1
+};
+
+int16 invent_3w[] = {
+ CLAY_3w, NEEDLES_3w, FLASK_3w, BOUILLON_3w, CHEESE_3w,
+ CAGE_3w, BLOWPIPE_3w, SCROLL_3w, CRYSTAL_3w, BELL_3w,
+ BOOK_3w, CANDLE_3w, -1
+};
+
+// TODO: This inventory list is only used in the Win versions. Should we add them in the DOS versions?
+int16 invent_1d[] = {-1};
+int16 invent_2d[] = {-1};
+int16 invent_3d[] = {-1};
+
+uses_t uses_1w[] = {
+ {PKIN_1w, kDTupkin_1w, {{kNHero_1w, kVOpen_1w}, {0, 0}}},
+ {KEY_1w, kDTukey_1w, {{kNDoor_1w, kVUnlock_1w}, {0, 0}}},
+ {CANDLE_1w, kDTucandle_1w, {{0, 0}}},
+ {MASK_1w, kDTumasked_1w, {{kNHero_1w, kVMakeUseOf_1w}, {0, 0}}},
+ {BUNG_1w, kDTubung_1w, {{kNBoat_1w, kVPlug_1w}, {0, 0}}},
+ {CHOP_1w, kDTuchop_1w, {{kNHero_1w, kVEat_1w}, {kNDog_1w, kVThrowit_1w},{kNButler_1w, kVGive_1w},{kNFrank_1w, kVGive_1w}, {kNDracula_1w, kVGive_1w}, {kNGwen_1w, kVGive_1w}, {kNHood_1w, kVGive_1w}, {kNSlime_1w, kVGive_1w}, {kNPeahead_1w, kVGive_1w}, {kNProf_1w, kVGive_1w}, {kNIgor_1w, kVGive_1w}, {0, 0}}},
+ {KNIFE_1w, kDTuknife_1w, {{kNHero_1w, kVCut_1w}, {kNRope_1w, kVCut_1w}, {0, 0}}},
+ {OILCAN_1w, kDTuoil_1w, {{kNHero_1w, kVOil_1w}, {kNTrap_1w, kVBolt_1w}, {kNBolt_1w, kVOil_1w}, {kNDoor_1w, kVOil_1w}, {0, 0}}},
+ {GOLD_1w, kDTugold_1w, {{kNHero_1w, kVMakeUseOf_1w}, {kNGuard_1w, kVGive_1w}, {0, 0}}},
+ {LASTOBJ_1w, 0, {{0, 0}}}
+};
+
+uses_t uses_2w[] = {
+ {MATCHES_2w, kDTumatches_2w, {{kNHero_2w, kVStrike_2w}, {kNDynamite_2w, kVMakeUseOf_2w},{0, 0}}},
+ {GARLIC_2w, kDTugarlic_2w, {{kNHero_2w, kVEat_2w}, {kNGardner_2w, kVGive_2w}, {kNDog_2w, kVGive_2w}, {kNCupb_2w, kVDrop_2w}, {0, 0}}},
+ {MAGNIFY_2w, kDTumagnify_2w, {{kNWill_2w, kVRead_2w}, {0, 0}}},
+ {STICK_2w, kDTustick_2w, {{kNHero_2w, kVThrowit_2w}, {kNDog_2w, kVGive_2w}, {kNSnake_2w, kVAttack_2w}, {0, 0}}},
+ {BOTTLE_2w, kDTubottle_2w, {{kNHero_2w, kVDrink_2w}, {kNDog_2w, kVGive_2w}, {kNSnake_2w, kVGive_2w}, {0, 0}}},
+ {DYNAMITE_2w, kDTudynamite_2w, {{kNHero_2w, kVStrike_2w}, {kNRock_2w, kVDrop_2w}, {kNMatches_2w, kVMakeUseOf_2w}, {kNSnake_2w, kVAttack_2w}, {0, 0}}},
+ {GUN_2w, kDTugun_2w, {{kNHero_2w, kVFire_2w}, {kNSnake_2w, kVAttack_2w}, {kNRobot_2w, kVFire_2w}, {0, 0}}},
+ {BANANA_2w, kDTubanana_2w, {{kNHero_2w, kVEat_2w}, {kNGenie_2w, kVGive_2w}, {0, 0}}},
+ {OILLAMP_2w, kDTulamp_2w, {{kNHero_2w, kVRub_2w}, {kNGenie_2w, kVGive_2w}, {0, 0}}},
+ {SCREW_2w, kDTuscrew_2w, {{kNHero_2w, kVMakeUseOf_2w}, {kNSafe_2w, kVOpen_2w}, {0, 0}}},
+ {BELL_2w, kDTubell_2w, {{kNHero_2w, kVRing_2w}, {kNMaid_2w, kVGive_2w}, {kNCat_2w, kVGive_2w}, {kNHarry_2w, kVGive_2w}, {kNHester_2w, kVGive_2w}, {kNCook_2w, kVGive_2w}, {0, 0}}},
+ {CATNIP_2w, kDTucatnip_2w, {{kNHero_2w, kVEat_2w}, {kNBell_2w, kVRub_2w}, {kNMaid_2w, kVGive_2w}, {kNCat_2w, kVGive_2w}, {kNHarry_2w, kVGive_2w}, {kNHester_2w, kVGive_2w}, {kNCook_2w, kVGive_2w}, {0, 0}}},
+ {PAPER_2w, kDTupaper_2w, {{kNHero_2w, kVRead_2w}, {kNDoor_2w, kVPush_2w}, {0, 0}}},
+ {PENCIL_2w, kDTupencil_2w, {{kNHero_2w, kVMakeUseOf_2w}, {kNPaper_2w, kVScribble_2w}, {kNDoor_2w, kVMakeUseOf_2w}, {0, 0}}},
+ {LASTOBJ_2w, 0, {{0, 0}}}
+};
+
+uses_t uses_3w[] = {
+ {CLAY_3w, kDTuclay_3w, {{kNHero_3w, kVMake_3w}, {0, 0}}},
+ {FLASK_3w, kDTuflask_3w, {{kNHero_3w, kVDrink_3w}, {kNPennylie_3w, kVGive_3w}, {kNWater_3w, kVFill_3w}, {kNPool_3w, kVFill_3w}, {0, 0}}},
+ {BOUILLON_3w, kDTubouillon_3w, {{kNNat1_3w, kVGive_3w}, {kNNat2_3w, kVGive_3w}, {kNNat3_3w, kVGive_3w}, {kNNatb_3w, kVGive_3w}, {kNNatg_3w, kVGive_3w}, {kNPennylie_3w, kVGive_3w}, {kNDoctor_3w, kVGive_3w}, {0, 0}}},
+ {CRYSTAL_3w, kDTucrystal_3w, {{kNHero_3w, kVRub_3w}, {0, 0}}},
+ {CHEESE_3w, kDTucheese_3w, {{kNHero_3w, kVEat_3w}, {kNCage_3w, kVPut_3w}, {0, 0}}},
+ {SCROLL_3w, kDTuread_3w, {{kNHero_3w, kVRead_3w}, {0, 0}}},
+ {BOOK_3w, kDTuread_3w, {{kNHero_3w, kVRead_3w}, {kNGhost_3w, kVExorcise_3w}, {0, 0}}},
+ {CANDLE_3w, kDTucandle_3w, {{kNHero_3w, kVStrike_3w}, {0, 0}}},
+ {BELL_3w, kDTubell_3w, {{kNHero_3w, kVRing_3w}, {0, 0}}},
+ {BLOWPIPE_3w, kDTupipe_3w, {{kNHero_3w, kVShoot_3w}, {kNDoctor_3w, kVShoot_3w}, {kNElephant_3w, kVShoot_3w}, {kNGhost_3w, kVShoot_3w}, {0, 0}}},
+ {LASTOBJ_3w, 0, {{0, 0}}}
+};
+
+// TODO: This use lists are only used in Win versions. Should we add them in the DOS versions?
+uses_t uses_1d[] = {
+ {LASTOBJ_1d, 0, {{0, 0}}}
+};
+
+uses_t uses_2d[] = {
+ {LASTOBJ_2d, 0, {{0, 0}}}
+};
+
+uses_t uses_3d[] = {
+ {LASTOBJ_3d, 0, {{0, 0}}}
+};
+
+background_t catchall_1w[] = { // Generally applicable phrases
+ {kVJump_1w, 0, kSTnojump_1w, false, 0, 0},
+ {kVGo_1w, 0, kSTtrywalk_1w, false, 0, 0},
+ {kVEnter_1w, 0, kSTtrywalk_1w, false, 0, 0},
+ {kVClimb_1w, 0, kSTnoclimb_1w, false, 0, 0},
+ {kVShout_1w, 0, kSTnothing_1w, false, 0, 0},
+ {kVTalk_1w, 0, kSTnotalk_1w, false, 0, 0},
+ {kVSwitch_1w, 0, kSTenopurps_1w, false, 0, 0},
+ {kVThrowit_1w, 0, kSTenopurps_1w, false, 0, 0},
+ {kVAttack_1w, 0, kSTnoattack_1w, false, 0, 0},
+ {kVBreak_1w, 0, kSTnobreak_1w, false, 0, 0},
+ {kVListen_1w, 0, kSTnonoise_1w, false, 0, 0},
+ {kVSmell_1w, 0, kSTnosmell_1w, false, 0, 0},
+ {kVQuery_1w, 0, kSTnoidea_1w, false, 0, 0},
+ {kVLook_1w, kNSky_1w, kSTlooksky_1w, false, 0, 0},
+ {kVLook_1w, kNWall_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNGround_1w, kSTedull_1w, false, 0, 0},
+ {kVHelp_1w, 0, kSTaskhelp_1w, false, 0, 0},
+ {kVMagic_1w, 0, kSTabracadabra_1w, false, 0, 0},
+ {kVDig_1w, 0, kSTnodig_1w, false, 0, 0},
+ {kVRude_1w, 0, kSTnorude_1w, false, 0, 0},
+ {kVKnock_1w, 0, kSTnoanswer_1w, false, 0, 0},
+ {kVTake_1w, kNPicture_1w, kSTenopurps_1w, false, 0, 0},
+ {kVHero, kNCut_1w, kSTCutHero_1w, false, 0, 0},
+ {kVHero, kNOil_1w, kSTOilHero_1w, false, 0, 0},
+ {kVMakeUseOf_1w, kNGold_1w, kSTGoldHero_1w, false, 0, 0},
+ {kVLook_1w, kNMonkey_1w, kSTLookMonkey_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen0_desc_1w[] = { // Outside house
+ {kVLook_1w, kNTree_1w, kSTlooktree_1w, false, 0, 0},
+ {kVLook_1w, kNFence_1w, kSTlookfence_1w, false, 0, 0},
+ {kVLook_1w, kNHouse_1w, kSTlookhouse_1w, false, 0, 0},
+ {kVLook_1w, kNWindow_1w, kSTlookwindow_1w, false, 0, 0},
+ {kVLook_1w, kNRoof_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNLight_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNMoon_1w, kSTlookmoon_1w, false, 0, 0},
+ {kVClimb_1w, kNTree_1w, kSTclimbtree1_1w, false, 0, 0},
+ {kVClimb_1w, kNFence_1w, kSTclimbfence_1w, false, 0, 0},
+ {kVEat_1w, kNPkin_1w, kSTeatpumpkin_1w, false, 0, 0},
+ {kVUnder_1w, kNCarpet_1w, kSTundermat_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen0_1w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen1_desc_1w[] = { // Hall
+ {kVLook_1w, kNBat_1w, kSTlookbat_1w, false, 0, 0},
+ {kVLook_1w, kNPicture_1w, kSTlookpicture_1w, false, 0, 0},
+ {kVLook_1w, kNTable_1w, kSTlooktable_1w, false, 0, 0},
+ {kVLook_1w, kNCarpet_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNStairs_1w, kSTlookupstairs_1w, false, 0, 0},
+ {kVLook_1w, kNLight_1w, kSTlooklight_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen1_1w, true, 0, 0},
+ {kVListen_1w, 0, kSTlistenhall_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen2_desc_1w[] = { // Bedroom 1
+ {kVLook_1w, kNBed_1w, kSTlookbed_1w, false, 0, 0},
+ {kVUnder_1w, kNBed_1w, kSTlookbed_1w, false, 0, 0},
+ {kVRide_1w, kNBed_1w, kSTnosnooze_1w, false, 0, 0},
+ {kVInto_1w, kNBed_1w, kSTnosnooze_1w, false, 0, 0},
+ {kVLook_1w, kNWard_1w, kSTlookward_1w, false, 0, 0},
+ {kVLook_1w, kNCupb_1w, kSTlookcupbd_1w, false, 0, 0},
+ {kVLook_1w, kNWindow_1w, kSTlookbed1win_1w, false, 0, 0},
+ {kVLook_1w, kNLight_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNFace_1w, kSTlookface_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen2_1w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen3_desc_1w[] = { // Dining room
+ {kVLook_1w, kNTable_1w, kSTlookspread_1w, false, 0, 0},
+ {kVLook_1w, kNButler_1w, kSTlookbutler_1w, false, 0, 0},
+ {kVLook_1w, kNPlant_1w, kSTlookplant_1w, false, 0, 0},
+ {kVLook_1w, kNPicture_1w, kSTlookzelda_1w, false, 0, 0},
+ {kVLook_1w, kNWitch_1w, kSTlookzelda_1w, false, 0, 0},
+ {kVLook_1w, kNWindow_1w, kSTlookdiningwin_1w, false, 0, 0},
+ {kVLook_1w, kNFood_1w, kSTlookfood_1w, false, 0, 0},
+ {kVLook_1w, kNMan_1w, kSTlookdiningman_1w, false, 0, 0},
+ {kVLook_1w, kNCupb_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNWoman_1w, kSTlookwoman_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen3_1w, true, 0, 0},
+ {kVSit_1w, 0, kSTsitdown_1w, false, 0, 0},
+ {kVTake_1w, kNFood_1w, kSTtakefood_1w, false, 0, 0},
+ {kVEat_1w, 0, kSTtakefood_1w, false, 0, 0},
+ {kVTalk_1w, kNMan_1w, kSTtalkdiningman_1w, false, 0, 0},
+ {kVTalk_1w, kNWoman_1w, kSTtalkdiningwoman_1w, false, 0, 0},
+ {kVTalk_1w, kNButler_1w, kSTtalkbutler_1w, false, 0, 0},
+ {kVKiss_1w, 0, kSTskiss_1w, false, 0, 0},
+ {kVListen_1w, 0, kSTlistendining_1w, false, 0, 0},
+ {kVDrink_1w, 0, kSTdrinkdining_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen4_desc_1w[] = { // Bathroom
+ {kVLook_1w, kNWindow_1w, kSTlookbathwin_1w, false, 0, 0},
+ {kVLook_1w, kNLight_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNMirror_1w, kSTlookmirror_1w, false, 0, 0},
+ {kVLook_1w, kNToilet_1w, kSTlooktoilet_1w, false, 0, 0},
+ {kVLook_1w, kNBath_1w, kSTlooktub_1w, false, 0, 0},
+ {kVLook_1w, kNSink_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen4_1w, true, 0, 0},
+ {kVCrap_1w, 0, kSTdopoo_1w, false, 0, 0},
+ {kVSit_1w, kNToilet_1w, kSTdowee_1w, false, 0, 0},
+ {kVRide_1w, kNToilet_1w, kSTdowee_1w, false, 0, 0},
+ {kVInto_1w, kNBath_1w, kSTusetub_1w, false, 0, 0},
+ {kVTake_1w, kNBath_1w, kSTusetub_1w, false, 0, 0},
+ {kVSit_1w, 0, kSTsittoilet_1w, false, 0, 0},
+ {kVWash_1w, kNHands_1w, kSTwashhands_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen5_desc_1w[] = { // Kitchen
+ {kVLook_1w, kNLight_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNUnits_1w, kSTlookunits_1w, false, 0, 0},
+ {kVOpen_1w, kNUnits_1w, kSTeempty_1w, false, 0, 0},
+ {kVLook_1w, kNWindow_1w, kSTlookkitchenwin_1w, false, 0, 0},
+ {kVLook_1w, kNBroom_1w, kSTlookbroom_1w, false, 0, 0},
+ {kVTake_1w, kNBroom_1w, kSTtakebroom_1w, false, 0, 0},
+ {kVRide_1w, kNBroom_1w, kSTridebroom_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen5_1w, true, 0, 0},
+ {kVSweep_1w, 0, kSTsweepbroom_1w, false, 0, 0},
+ {kVListen_1w, 0, kSTlistenkitchen_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen6_desc_1w[] = { // Garden
+ {kVLook_1w, kNShed_1w, kSTlookShed_1w, false, 0, 0},
+ {kVLook_1w, kNMoon_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNTree_1w, kSTlooktree_1w, false, 0, 0},
+ {kVClimb_1w, kNTree_1w, kSTclimbtree_1w, false, 0, 0},
+ {kVLook_1w, kNGardenbits_1w, kSTlookgarden_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen6_1w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen7_desc_1w[] = { // Store room
+ {kVLook_1w, kNCarpet_1w, kSTLookCarpet_1w, false, 0, 0},
+ {kVLook_1w, kNLight_1w, kSTedull_1w, false, 0, 0},
+ {kVUnbolt_1w, kNTrap_1w, kSTsayunbolt_1w, false, 0, 0},
+ {kVLook_1w, kNMousehole_1w, kSTlookmousehole_1w, false, 0, 0},
+ {kVTake_1w, kNMousehole_1w, kSTtakedroppings_1w, false, 0, 0},
+ {kVTake_1w, kNDroppings_1w, kSTtakedroppings_1w, false, 0, 0},
+ {kVStroke_1w, kNDog_1w, kSTStrokeDog_1w, false, 0, 0},
+ {kVGive_1w, kNChop_1w, kSTchop1_1w, false, 0, 0},
+ {kVFeed_1w, kNDog_1w, kSTchop1_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen7_1w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen8_desc_1w[] = { // Basement
+ {kVLook_1w, kNLight_1w, kSTedull_1w, false, 0, 0},
+ {kVLook_1w, kNDoor_1w, kSTlookbasedoor_1w, false, 0, 0},
+ {kVPush_1w, kNDoor_1w, kSTpushbasedoor_1w, false, 0, 0},
+ {kVOil_1w, kNDoor_1w, kSToilbasedoor_1w, false, 0, 0},
+ {kVLook_1w, kNRock_1w, kSTexaminerock_1w, false, 0, 0},
+ {kVPush_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVLift_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVMove_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVUnder_1w, kNRock_1w, kSTnounder_1w, false, 0, 0},
+ {kVAttack_1w, kNDoor_1w, kSTbreakbasedoor_1w, false, 0, 0},
+ {kVBreak_1w, kNDoor_1w, kSTbreakbasedoor_1w, false, 0, 0},
+ {kVOpen_1w, kNDoor_1w, kSTopenbasedoor_1w, false, 0, 0},
+ {kVUnlock_1w, kNDoor_1w, kSTunlockbasedoor_1w, false, 0, 0},
+ {kVKnock_1w, kNDoor_1w, kSTknockbasedoor_1w, false, 0, 0},
+ {kVTalk_1w, kNPenelope_1w, kSTtalkpenelope_1w, false, 0, 0},
+ {kVShout_1w, kNPenelope_1w, kSTtalkpenelope_1w, false, 0, 0},
+ {kVListen_1w, 0, kSTlistenbase_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen8_1w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen9_desc_1w[] = { // Bat cave
+ {kVLook_1w, 0, kSTlookscreen9_1w, true, 0, 0},
+ {kVLook_1w, kNRock_1w, kSTlookrock_1w, false, 0, 0},
+ {kVPush_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVLift_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVMove_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVUnder_1w, kNRock_1w, kSTnounder_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen10_desc_1w[] = { // Mummy room
+ {kVLook_1w, 0, kSTlookscreen10_1w, true, 0, 0},
+ {kVLook_1w, kNRock_1w, kSTlookrock_1w, false, 0, 0},
+ {kVPush_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVLift_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVMove_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVUnder_1w, kNRock_1w, kSTnounder_1w, false, 0, 0},
+ {kVLook_1w, kNTomb_1w, kSTlooktomb_1w, false, 0, 0},
+ {kVLook_1w, kNMummy_1w, kSTLookMummy_1w, false, 0, 0},
+ {kVTalk_1w, kNMummy_1w, kSTTalkMummy_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen11_desc_1w[] = { // Lake room
+ {kVLook_1w, kNRock_1w, kSTlookrock_1w, false, 0, 0},
+ {kVPush_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVLift_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVMove_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVUnder_1w, kNRock_1w, kSTnounder_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen11_1w, true, 0, 0},
+ {kVLakeverbs_1w, 0, kSTsuggestboat_1w, false, 0, 0},
+ {kVDrink_1w, 0, kSTnotthirsty_1w, false, 0, 0},
+ {kVPlug_1w, 0, kSTqueryplug_1w, false, 0, 0},
+ {kVMakeUseOf_1w, kNBoat_1w, kSTsShutup_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen12_desc_1w[] = { // Dead end
+ {kVLook_1w, kNRock_1w, kSTlookrock_1w, false, 0, 0},
+ {kVPush_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVLift_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVMove_1w, kNRock_1w, kSTnowayhose_1w, false, 0, 0},
+ {kVUnder_1w, kNRock_1w, kSTnounder_1w, false, 0, 0},
+ {kVLook_1w, 0, kSTlookscreen12_1w, true, 0, 0},
+ {kVTalk_1w, kNGuard_1w, kSTtalkguard_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen13_desc_1w[] = { // Jail
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen14_desc_1w[] = { // The end
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen15_desc_1w[] = { // Laboratory
+ {kVLook_1w, 0, kSTlookscreen15_1w, true, 0, 0},
+ {kVTalk_1w, kNIgor_1w, kSTtalkigor_1w, false, 0, 0},
+ {kVTalk_1w, kNProf_1w, kSTtalkprof_1w, false, 0, 0},
+ {kVLook_1w, kNMachinebits_1w, kSTlookmachine_1w, false, 0, 0},
+ {kVPush_1w, kNMachinebits_1w, kSTusemachine_1w, false, 0, 0},
+ {kVLook_1w, kNTable_1w, kSTlooklabtable_1w, false, 0, 0},
+ {kVClose_1w, kNDoor_1w, kSTuseboxdoor_1w, false, 0, 0},
+ {kVOpen_1w, kNDoor_1w, kSTuseboxdoor_1w, false, 0, 0},
+ {kVLook_1w, kNLight_1w, kSTlooklights_1w, false, 0, 0},
+ {kVLook_1w, kNBooth_1w, kSTlookbooth_1w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+
+// Array of ptrs to object_list_t
+objectList_t backgroundList_1w[] = {
+ screen0_desc_1w, screen1_desc_1w, screen2_desc_1w, screen3_desc_1w, screen4_desc_1w,
+ screen5_desc_1w, screen6_desc_1w, screen7_desc_1w, screen8_desc_1w, screen9_desc_1w,
+ screen10_desc_1w, screen11_desc_1w, screen12_desc_1w, screen13_desc_1w, screen14_desc_1w,
+ screen15_desc_1w
+};
+
+background_t catchall_2w[] = { // Generally applicable phrases
+// Make sure verbs with nouns come before same verb with 0
+ {kVTake_2w, kNPicture_2w, kSTNopurps_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNPenny_2w, kSTLookpen_2w, false, DONT_CARE, 0},
+ {kVKiss_2w, kNPenny_2w, kSTMmmm_2w, false, DONT_CARE, 0},
+ {kVRude_2w, kNPenny_2w, kSTHeadache_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNStairs_2w, kSTDull_2w, false, DONT_CARE, 0},
+ {kVUnder_2w, kNStairs_2w, kSTDull_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNPlant_2w, kSTSplant_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNWindow_2w, kSTS6garden_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNPicture_2w, kSTSpicture_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNMirror_2w, kSTDull_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNTable_2w, kSTNo_on_2w, false, DONT_CARE, 0},
+ {kVJump_2w, 0, kSTSjump_2w, false, DONT_CARE, 0},
+ {kVGo_2w, 0, kSTTrywalk_2w, false, DONT_CARE, 0},
+ {kVInto_2w, 0, kSTTrywalk_2w, false, DONT_CARE, 0},
+ {kVClimb_2w, 0, kSTSclimb_2w, false, DONT_CARE, 0},
+ {kVShout_2w, 0, kSTNothing_2w, false, DONT_CARE, 0},
+ {kVTalk_2w, 0, kSTStalk_2w, false, DONT_CARE, 0},
+ {kVSwitch_2w, 0, kSTMorespecific_2w, false, DONT_CARE, 0},
+ {kVThrowit_2w, 0, kSTNopurps_2w, false, DONT_CARE, 0},
+ {kVAttack_2w, 0, kSTSattack_2w, false, DONT_CARE, 0},
+ {kVBreak_2w, 0, kSTSbreak_2w, false, DONT_CARE, 0},
+ {kVListen_2w, 0, kSTQuiet_2w, false, DONT_CARE, 0},
+ {kVSmell_2w, 0, kSTAroma_2w, false, DONT_CARE, 0},
+ {kVQuery_2w, 0, kSTNoidea_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNSky_2w, kSTFalling_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNWall_2w, kSTDull_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNGround_2w, kSTDull_2w, false, DONT_CARE, 0},
+ {kVHelp_2w, 0, kSTShelp_2w, false, DONT_CARE, 0},
+ {kVMagic_2w, 0, kSTSmagic_2w, false, DONT_CARE, 0},
+ {kVWish_2w, 0, kSTSmagic_2w, false, DONT_CARE, 0},
+ {kVDig_2w, 0, kSTSdig_2w, false, DONT_CARE, 0},
+ {kVRude_2w, 0, kSTSrude_2w, false, DONT_CARE, 0},
+ {kVKnock_2w, 0, kSTNoanswer_2w, false, DONT_CARE, 0},
+ {kVOpen_2w, kNDoor_2w, kSTWontopen_2w, false, DONT_CARE, 0},
+ {kVUnlock_2w, kNDoor_2w, kSTCantunlock_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNDoor_2w, kSTDull_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNLight_2w, kSTDull_2w, false, DONT_CARE, 0},
+ {kVHello_2w, 0, kSTHi_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNFence_2w, kSTLookover_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNWall_2w, kSTLookover_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNGardenbits_2w, kSTDull_2w, false, DONT_CARE, 0},
+ {kVGive_2w, 0, kSTNothanks_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNTree_2w, kSTDull2_2w, false, DONT_CARE, 0},
+ {kVFire_2w, 0, kSTFire2_2w, false, DONT_CARE, 0},
+ {kVShout_2w, 0, kSTNoanswer_2w, false, DONT_CARE, 0},
+ {kVHerring_2w, 0, kSTSherring_2w, false, DONT_CARE, 0},
+ {kVUndress_2w, 0, kSTSundress_2w, false, DONT_CARE, 0},
+ {kVSit_2w, 0, kSTStired_2w, false, DONT_CARE, 0},
+ {kVFeed_2w, 0, kSTNothanks_2w, false, DONT_CARE, 0},
+ {kVRub_2w, kNCatnip_2w, kSTRubcatnip1_2w, false, DONT_CARE, 0},
+ {kVMakeUseOf_2w, kNScrew_2w, kSTLookScrew_2w, false, DONT_CARE, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen0_desc_2w[] = { // Outside house
+ {kVLook_2w, 0, kSTWelcome_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen1_desc_2w[] = { // Hall
+ {kVLook_2w, 0, kSTLookhall_2w, true, 0, 0},
+ {kVLook_2w, kNMaid_2w, kSTTmaid_2w, false, 0, 0},
+ {kVTalk_2w, kNMaid_2w, kSTChatmaid1_2w, false, 0, 0},
+ {kVTalk_2w, kNPenny_2w, kSTChatmaid2_2w, false, 0, 0},
+ {kVKiss_2w, kNMaid_2w, kSTChatmaid3_2w, false, 0, 0},
+ {kVRude_2w, kNMaid_2w, kSTRudemaid_2w, false, 0, 0},
+ {kVOpen_2w, kNDoor_2w, kSTTmaiddoor_2w, false, 0, 0},
+ {kVUnlock_2w, kNDoor_2w, kSTTmaiddoor_2w, false, 0, 0},
+ {kVLook_2w, kNDoor_2w, kSTSdoor_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen2_desc_2w[] = { // Bed1
+ {kVLook_2w, 0, kSTLookbed1_2w, true, DONT_CARE, 0},
+ {kVLook_2w, kNBed_2w, kSTLookbed_2w, false, DONT_CARE, 0},
+ {kVInto_2w, kNBed_2w, kSTS2bed_2w, false, 0, 0},
+ {kVRide_2w, kNBed_2w, kSTS2bed_2w, false, 0, 0},
+ {kVRest_2w, kNBed_2w, kSTS2bed_2w, false, 0, 0},
+ {kVRide_2w, kNPenny_2w, kSTS2bed_2w, false, 0, 0},
+ {kVTalk_2w, kNPenny_2w, kSTZzzz_2w, false, 0, 0},
+ {kVLook_2w, kNPennylie_2w, kSTZzzz_2w, false, 0, 0},
+ {kVTalk_2w, kNPennylie_2w, kSTS2bed_2w, false, 0, 0},
+ {kVInto_2w, kNBed_2w, kSTNopurps_2w, false, 1, 0},
+ {kVRide_2w, kNBed_2w, kSTNopurps_2w, false, 1, 0},
+ {kVRest_2w, kNBed_2w, kSTNopurps_2w, false, 1, 0},
+ {kVUnder_2w, kNBed_2w, kSTSsearch_2w, false, DONT_CARE, 0},
+ {kVRead_2w, kNBook_2w, kSTNocarry_2w, false, DONT_CARE, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen3_desc_2w[] = { // Bed2
+ {kVLook_2w, 0, kSTLookbed2_2w, true , 0, 0},
+ {kVLook_2w, kNBird_2w, kSTParrot_2w, false, 0, 0},
+ {kVLook_2w, kNPenny_2w, kSTLookpen_2w, false, 0, 0}, // since following cage has synonym "pen"
+ {kVLook_2w, kNCage_2w, kSTDull_2w, false, 0, 0},
+ {kVLook_2w, kNPencil_2w, kSTDull_2w, false, 0, 0},
+ {kVLook_2w, kNPhone_2w, kSTDull_2w, false, 0, 0},
+ {kVLook_2w, kNPaper_2w, kSTBlotter_2w, false, 0, 0},
+ {kVRead_2w, kNPaper_2w, kSTBlotter_2w, false, 0, 0},
+ {kVTake_2w, kNBlotpad_2w, kSTNouse_2w, false, 0, 0},
+ {kVLook_2w, kNChair_2w, kSTDull_2w, false, 0, 0},
+ {kVTake_2w, kNPencil_2w, kSTNouse_2w, false, 0, 0},
+ {kVTake_2w, kNPaper_2w, kSTNouse_2w, false, 0, 0},
+ {kVLook_2w, kNKeyhole_2w, kSTKeyhole2_2w, false, 0, 0},
+ {kVOpen_2w, kNKeyhole_2w, kSTKeyhole3_2w, false, 0, 0},
+ {kVLook_2w, kNWall_2w, kSTDumbwaiter_2w, false, 0, 0},
+ {kVLook_2w, kNButton_2w, kSTSbutton_2w, false, 0, 0},
+ {kVPush_2w, kNButton_2w, kSTS3dumb_2w, false, 0, 0},
+ {kVPush_2w, kNSwitch_2w, kSTS3dumb_2w, false, 0, 0},
+ {kVDial_2w, 0, kSTS3phone_2w, false, 0, 4},
+ {kVTake_2w, kNPhone_2w, kSTS3phone_2w, false, 0, 4},
+ {kVUse_2w, kNPhone_2w, kSTS3phone_2w, false, 0, 4},
+ {kVLift_2w, kNPhone_2w, kSTS3phone_2w, false, 0, 4},
+ {kVTalk_2w, kNBird_2w, kSTS3bird_2w, false, 0, 5},
+ {kVInto_2w, 0, kSTSinto_2w, true, 0, 0},
+ {kVUnder_2w, kNCupb_2w, kSTSsearch_2w, false, 0, 0},
+ {kVFeed_2w, kNBird_2w, kSTBirdfull_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen4_desc_2w[] = { // Keyhole
+ {kVLook_2w, 0, kSTLooklook_2w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen5_desc_2w[] = { // Bed3
+ {kVLook_2w, 0, kSTLookbed3_2w, true, 0, 0},
+ {kVLook_2w, kNBlock_2w, kSTLookblocks_2w, false, 0, 0},
+ {kVPlay_2w, kNBlock_2w, kSTSblock_2w, false, 0, 0},
+ {kVBlock_2w, 0, kSTSblock_2w, false, 0, 0},
+ {kVLook_2w, kNCage_2w, kSTLookplaypen_2w, false, 0, 0},
+ {kVInto_2w, kNCage_2w, kSTStoobigtofit_2w, false, 0, 0},
+ {kVLook_2w, kNWindow_2w, kSTS6garden_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen6_desc_2w[] = { // Kitchen
+ {kVLook_2w, 0, kSTLookkitchen_2w, true, DONT_CARE, 0},
+ {kVLook_2w, kNButton_2w, kSTSbutton_2w, false, DONT_CARE, 0},
+ {kVPush_2w, kNButton_2w, kSTS3dumb_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNWindow_2w, kSTS6garden_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNUnits_2w, kSTS6dull_2w, false, DONT_CARE, 0},
+ {kVOpen_2w, kNUnits_2w, kSTS6dull_2w, false, DONT_CARE, 0},
+ {kVInto_2w, 0, kSTSinto_2w, true, DONT_CARE, 0},
+ {kVOpen_2w, kNDoor_2w, kSTMorespecific_2w, false, DONT_CARE, 0},
+ {kVLook_2w, kNDoor_2w, kSTMorespecific_2w, false, DONT_CARE, 0},
+ {kVTalk_2w, kNCook_2w, kSTTalkcook_2w, false, 1, 0},
+ {kVLook_2w, kNCook_2w, kSTLookcook_2w, false, 1, 0},
+ {kVLook_2w, kNKnife_2w, kSTLookknife_2w, false, 1, 0},
+ {kVTake_2w, kNKnife_2w, kSTTakeknife_2w, false, 1, 0},
+ {kVListen_2w, 0, kSTListenkitchen_2w, false, 1, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen7_desc_2w[] = { // Backdoor
+ {kVLook_2w, 0, kSTLookback_2w, true, 0, 0},
+ {kVLook_2w, kNWindow_2w, kSTLookwin_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen8_desc_2w[] = { // Shed
+ {kVLook_2w, 0, kSTLookshed_2w, true, 0, 0},
+ {kVLook_2w, kNWindow_2w, kSTLookwin_2w, false, 0, 0},
+ {kVLook_2w, kNShed_2w, kSTLookatshed_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen9_desc_2w[] = { // In shed
+ {kVLook_2w, 0, kSTLookinshed_2w, true, 0, 0},
+ {kVLook_2w, kNWall_2w, kSTS9tools1_2w, false, 0, 0},
+ {kVLook_2w, kNTools_2w, kSTS9tools1_2w, false, 0, 0},
+ {kVTake_2w, kNTools_2w, kSTS9tools2_2w, false, 0, 0},
+ {kVLook_2w, kNBroom_2w, kSTDull_2w, false, 0, 0},
+ {kVTake_2w, kNBroom_2w, kSTNouse_2w, false, 0, 0},
+ {kVLook_2w, kNTable_2w, kSTSomebuttons_2w, false, 0, 0},
+ {kVKiss_2w, kNGardner_2w, kSTMore_2w, false, 0, 0},
+ {kVRude_2w, kNGardner_2w, kSTRudeshed_2w, false, 0, 0},
+ {kVTalk_2w, kNGardner_2w, kSTIgnore_2w, false, 0, 0},
+ {kVClose_2w, kNDoor_2w, kSTShedclose_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen10_desc_2w[] = { // Venus fly traps
+ {kVLook_2w, 0, kSTLookvenus_2w, true, 0, 0},
+ {kVTake_2w, kNMirror_2w, kSTNotmirror_2w, false, 0, 0},
+ {kVLook_2w, kNFly_2w, kSTLookFly_2w, false, 0, 0},
+ {kVLook_2w, kNLeaf_2w, kSTLookTrap_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen11_desc_2w[] = { // Gates open
+ {kVLook_2w, 0, kSTS11look_2w, true, 0, 0},
+ {kVClose_2w, kNDoor_2w, kSTNopurps_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen12_desc_2w[] = { // Gates closed
+ {kVLook_2w, 0, kSTS12look_2w, true, 0, 0},
+ {kVLook_2w, kNDoor_2w, kSTGates1_2w, false, 0, 0},
+ {kVOpen_2w, kNDoor_2w, kSTGates1_2w, false, 0, 0},
+ {kVBreak_2w, kNDoor_2w, kSTGates2_2w, false, 0, 0},
+ {kVAttack_2w, kNDoor_2w, kSTGates2_2w, false, 0, 0},
+ {kVUnlock_2w, kNDoor_2w, kSTGates3_2w, false, 0, 0},
+ {kVUnlock_2w, kNGate_2w, kSTGates3_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen13_desc_2w[] = { // Stream
+ {kVLook_2w, 0, kSTS13look_2w, true, 0, 0},
+ {kVLook_2w, kNBridge_2w, kSTNospecial_2w, false, 0, 0},
+ {kVUnder_2w, kNBridge_2w, kSTSsearch_2w, false, 0, 0},
+ {kVLook_2w, kNWater_2w, kSTDull_2w, false, 0, 0},
+ {kVThrowit_2w, kNMatches_2w, kSTThrowmatch_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen14_desc_2w[] = { // Zapper
+ {kVLook_2w, 0, kSTS14look_2w, true, 0, 0},
+ {kVSwitch_2w, kNZapper_2w, kSTNoswitch_2w, false, 0, 0},
+ {kVWind_2w, kNZapper_2w, kSTNoswitch_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen15_desc_2w[] = { // Mushroom
+ {kVLook_2w, 0, kSTS15look_2w, true, 0, 0},
+ {kVUse_2w, kNOldman_2w, kSTS15wand2_2w, false, 0, 0},
+ {kVTalk_2w, kNOldman_2w, kSTNoreply_2w, false, 0, 0},
+ {kVLook_2w, kNWand_2w, kSTS15wand1_2w, false, 0, 0},
+ {kVTake_2w, kNWand_2w, kSTS15wand2_2w, false, 0, 0},
+ {kVSearch_2w, kNOldman_2w, kSTSsearch_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen16_desc_2w[] = { // Well
+ {kVLook_2w, 0, kSTS16look_2w, true, 0, 0},
+ {kVClimb_2w, 0, kSTTryrope_2w, false, 0, 0},
+ {kVGo_2w, kNWell_2w, kSTTryrope_2w, false, 0, 0},
+ {kVWind_2w, kNRope_2w, kSTWindwell_2w, false, 0, 0},
+ {kVTie_2w, kNRope_2w, kSTNopurps_2w, false, 0, 0},
+ {kVTake_2w, kNBucket_2w, kSTNosee_2w, false, 0, 0},
+ {kVLook_2w, kNBucket_2w, kSTNosee_2w, false, 0, 0},
+ {kVWind_2w, kNBucket_2w, kSTWindwell_2w, false, 0, 0},
+ {kVTake_2w, kNWater_2w, kSTNosee_2w, false, 0, 0},
+ {kVWind_2w, kNHandle_2w, kSTWindwell_2w, false, 0, 0},
+ {kVInto_2w, kNBucket_2w, kSTNosee_2w, false, 0, 0},
+ {kVInto_2w, kNWell_2w, kSTIntowell_2w, false, 0, 0},
+ {kVWish_2w, 0, kSTGetonwithit_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen17_desc_2w[] = { // Snakepit
+ {kVLook_2w, 0, kSTS17look_2w, true, 0, 0},
+ {kVAttack_2w, kNSnake_2w, kSTS17kill_2w, false, 0, 0},
+ {kVBreak_2w, kNSnake_2w, kSTS17kill_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen18_desc_2w[] = { // Phonebox
+ {kVLook_2w, 0, kSTS18look_2w, true, 0, 0},
+ {kVLook_2w, kNPhone_2w, kSTS18look_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen19_desc_2w[] = { // Street
+ {kVLook_2w, 0, kSTS19look_2w, true, 0, 0},
+ {kVLook_2w, kNWall_2w, kSTSgraf_2w, false, 0, 0},
+ {kVRead_2w, kNWall_2w, kSTSgraf_2w, false, 0, 0},
+ {kVLook_2w, kNGraf_2w, kSTSgraf_2w, false, 0, 0},
+ {kVRead_2w, kNGraf_2w, kSTSgraf_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen20_desc_2w[] = { // Kennel
+ {kVLook_2w, 0, kSTS20look_2w, true, 0, 0},
+ {kVLook_2w, kNWindow_2w, kSTMorespecific_2w, false, 0, 0},
+ {kVThrowit_2w, kNStick_2w, kSTDonthaveone_2w, false, 0, 0},
+ {kVStroke_2w, kNDog_2w, kSTStrokedog_2w, false, 0, 0},
+ {kVTalk_2w, kNDog_2w, kSTStrokedog_2w, false, 0, 0},
+ {kVInto_2w, 0, kSTStoobigtofit_2w, false, 0, 0},
+ {kVTake_2w, kNStick_2w, kSTThrown_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen21_desc_2w[] = { // Rockroom
+ {kVLook_2w, 0, kSTS21look_2w, true, 0, 0},
+ {kVClimb_2w, kNRope_2w, kSTNotclose_2w, false, 0, 0},
+ {kVMove_2w, kNRock_2w, kSTTooheavy_2w, false, 0, 0},
+ {kVUnder_2w, kNRock_2w, kSTNounder_2w, false, 0, 0},
+ {kVLift_2w, kNRock_2w, kSTNowayhose_2w, false, 0, 0},
+ {kVLook_2w, kNRock_2w, kSTDull_2w, false, 0, 0},
+ {kVTake_2w, kNRock_2w, kSTNowayhose_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen22_desc_2w[] = { // Rockgone
+ {kVLook_2w, 0, kSTS22look_2w, true, 0, 0},
+ {kVClimb_2w, kNRope_2w, kSTNotclose_2w, false, 0, 0},
+ {kVLift_2w, kNRock_2w, kSTNopurps_2w, false, 0, 0},
+ {kVLook_2w, kNRock_2w, kSTDull_2w, false, 0, 0},
+ {kVTake_2w, kNRock_2w, kSTNopurps_2w, false, 0, 0},
+ {kVUnder_2w, kNRock_2w, kSTSsearch_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen23_desc_2w[] = { // Threeway
+ {kVLook_2w, 0, kSTS23look_2w, true, 0, 0},
+ {kVLift_2w, kNRock_2w, kSTNopurps_2w, false, 0, 0},
+ {kVLook_2w, kNRock_2w, kSTDull_2w, false, 0, 0},
+ {kVUnder_2w, kNRock_2w, kSTDull2_2w, false, 0, 0},
+ {kVTake_2w, kNRock_2w, kSTNopurps_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen24_desc_2w[] = { // Lampcave
+ {kVLook_2w, 0, kSTS24look_2w, true, 0, 0},
+ {kVLift_2w, kNRock_2w, kSTSsearch_2w, false, 0, 0},
+ {kVLook_2w, kNRock_2w, kSTNospecial_2w, false, 0, 0},
+ {kVUnder_2w, kNRock_2w, kSTDull2_2w, false, 0, 0},
+ {kVTake_2w, kNRock_2w, kSTNopurps_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen25_desc_2w[] = { // Chasm
+ {kVLook_2w, 0, kSTS25look_2w, true, 0, 0},
+ {kVUnder_2w, kNRock_2w, kSTSsearch_2w, false, 0, 0},
+ {kVLift_2w, kNRock_2w, kSTSsearch_2w, false, 0, 0},
+ {kVLook_2w, kNRock_2w, kSTDull_2w, false, 0, 0},
+ {kVTake_2w, kNRock_2w, kSTNopurps_2w, false, 0, 0},
+ {kVJump_2w, 0, kSTSnojump_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen26_desc_2w[] = { // Passage
+ {kVLook_2w, 0, kSTS26look_2w, true, 0, 0},
+ {kVUnder_2w, kNRock_2w, kSTSsearch_2w, false, 0, 0},
+ {kVLift_2w, kNRock_2w, kSTSsearch_2w, false, 0, 0},
+ {kVLook_2w, kNRock_2w, kSTDull_2w, false, 0, 0},
+ {kVTake_2w, kNRock_2w, kSTNopurps_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen27_desc_2w[] = { // genie
+ {kVLook_2w, 0, kSTS27look_2w, true, 0, 0},
+ {kVUnder_2w, kNRock_2w, kSTSsearch_2w, false, 0, 0},
+ {kVLift_2w, kNRock_2w, kSTSsearch_2w, false, 0, 0},
+ {kVLook_2w, kNRock_2w, kSTDull_2w, false, 0, 0},
+ {kVLook_2w, kNTrap_2w, kSTBudge_2w, false, 0, 0},
+ {kVOpen_2w, kNTrap_2w, kSTBudge_2w, false, 0, 0},
+ {kVUnscrew_2w, kNTrap_2w, kSTBudge_2w, false, 0, 0},
+ {kVUnlock_2w, kNTrap_2w, kSTBudge_2w, false, 0, 0},
+ {kVPush_2w, kNTrap_2w, kSTBudge_2w, false, 0, 0},
+ {kVTalk_2w, kNGenie_2w, kSTTalkgenie_2w, false, 0, 0},
+ {kVRude_2w, kNGenie_2w, kSTRudeshed_2w, false, 0, 0},
+ {kVKiss_2w, kNGenie_2w, kSTRudeshed_2w, false, 0, 0},
+ {kVGive_2w, kNBanana_2w, kSTNobanana_2w, false, 0, 0},
+ {kVClimb_2w, kNStairs_2w, kSTTrywalk_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen28_desc_2w[] = { // traproom
+ {kVLook_2w, 0, kSTS28look_2w, true, 0, 0},
+ {kVBreak_2w, kNSafe_2w, kSTNowayhose_2w, false, 0, 0},
+ {kVLook_2w, kNHole_2w, kSTS28hole_2w, false, 0, 28},
+ {kVTake_2w, kNMouse_2w, kSTS28mouse_2w, false, 0, 0},
+ {kVTake_2w, kNMousehole_2w, kSTS28mouse_2w, false, 0, 0},
+ {kVTake_2w, kNDroppings_2w, kSTSdroppings_2w, false, 0, 0},
+ {kVUnscrew_2w, kNSafe_2w, kSTMorespecific_2w, false, 0, 0},
+ {kVOpen_2w, 0, kSTUnlocksafe_2w, false, 0, 0},
+ {kVUnlock_2w, kNSafe_2w, kSTUnlocksafe_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen29_desc_2w[] = { // Hall 2
+ {kVLook_2w, 0, kSTLookhall_2w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen30_desc_2w[] = { // Lounge
+ {kVLook_2w, 0, kSTS30look_2w, true, 0, 0},
+ {kVLook_2w, kNWindow_2w, kSTS6garden_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen31_desc_2w[] = { // parlor
+ {kVLook_2w, 0, kSTS31look_2w, true, 0, 0},
+ {kVListen_2w, 0, kSTBlah_2w, false, 0, 0},
+ {kVOpen_2w, kNDoor_2w, kSTMorespecific_2w, false, 0, 0},
+ {kVLook_2w, kNDoor_2w, kSTMorespecific_2w, false, 0, 0},
+ {kVLook_2w, kNMaid_2w, kSTLookPMaid_2w, false, 0, 0},
+ {kVTalk_2w, kNMaid_2w, kSTTalkPMaid_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen32_desc_2w[] = { // catroom
+ {kVLook_2w, 0, kSTS32look_2w, true, 0, 0},
+ {kVStroke_2w, kNCat_2w, kSTSstrokecat_2w, false, 0, 0},
+ {kVPlay_2w, kNCat_2w, kSTSplaycat_2w, false, 0, 0},
+ {kVTalk_2w, kNCat_2w, kSTStalkcat_2w, false, 0, 0},
+ {kVLook_2w, kNPost_2w, kSTSlookpost_2w, false, 0, 0},
+ {kVGive_2w, 0, kSTSgivecat_2w, false, 0, 0},
+ {kVLook_2w, kNWindow_2w, kSTS6garden_2w, false, 0, 0},
+ {kVRub_2w, kNCatnip_2w, kSTRubcatnip2_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen33_desc_2w[] = { // Boxroom
+ {kVLook_2w, 0, kSTS33look_2w, true, 0, 0},
+ {kVLook_2w, kNDoor_2w, kSTLookboxdoor_2w, false, 0, 0},
+ {kVOpen_2w, kNDoor_2w, kSTWontopen_2w, false, 0, 0},
+ {kVRead_2w, kNPaper_2w, kSTReadpaper_2w, false, 0, 29},
+ {kVLook_2w, kNPaper_2w, kSTReadpaper_2w, false, 0, 29},
+ {kVLook_2w, kNCrate_2w, kSTSlookbox_2w, false, 0, 0},
+ {kVInto_2w, kNCrate_2w, kSTSgetinbox_2w, false, 0, 0},
+ {kVLook_2w, kNChute_2w, kSTLookchute_2w, false, 0, 0},
+ {kVLook_2w, kNHole_2w, kSTLookchute_2w, false, 0, 0},
+ {kVClimb_2w, kNChute_2w, kSTUpchute_2w, false, 0, 0},
+ {kVLook_2w, kNWall_2w, kSTLookchute_2w, false, 0, 0},
+ {kVInto_2w, kNDoor_2w, kSTMorespecific_2w, false, 0, 0},// Kludge for "put pencil in door"
+ {kVPush_2w, kNKey_2w, kSTMorespecific_2w, false, 0, 0},
+ {kVMakeUseOf_2w, kNPencil_2w, kSTUsePencil_2w, false, 0, 0},
+ {kVScribble_2w, kNPencil_2w, kSTDoCrossword_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen34_desc_2w[] = { // hall3
+ {kVLook_2w, 0, kSTLookhall_2w, true, 0, 0},
+ {kVLook_2w, kNMirror_2w, kSTLookMirror_2w, false, 0, 0},
+ {kVTake_2w, kNMirror_2w, kSTNouse_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen35_desc_2w[] = { // Organ
+ {kVLook_2w, 0, kSTS35look_2w, true, DONT_CARE, 0},
+ {kVLook_2w, kNOrgan_2w, kSTLookOrgan_2w, false, DONT_CARE, 0},
+ {kVPlay_2w, kNOrgan_2w, kSTPlayorgan_2w, false, DONT_CARE, 0},
+ {kVListen_2w, 0, kSTHearorgan_2w, false, 0, 0},
+ {kVListen_2w, 0, kSTHearlaugh_2w, false, 1, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen36_desc_2w[] = { // Hestroom
+ {kVLook_2w, 0, kSTLookhest_2w, true, 0, 0},
+ {kVTake_2w, kNBook_2w, kSTS36book_2w, false, 0, 0},
+ {kVTake_2w, kNBookcase_2w, kSTS36book_2w, false, 0, 0},
+ {kVRead_2w, kNBook_2w, kSTS36book_2w, false, 0, 0},
+ {kVLook_2w, kNBook_2w, kSTS36lookbook_2w, false, 0, 0},
+ {kVLook_2w, kNTable_2w, kSTS36table_2w, false, 0, 0},
+ {kVTalk_2w, kNHester_2w, kSTTalkhester_2w, false, 0, 0},
+ {kVLook_2w, kNWindow_2w, kSTS6garden_2w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen37_desc_2w[] = { // Retupmoc
+// Screen states: 0: default, 1: Got screwdriver
+ {kVLook_2w, 0, kSTS37look_2w, true, DONT_CARE, 0},
+ {kVLift_2w, kNRock_2w, kSTNopurps_2w, false, 0, 0},
+ {kVLook_2w, kNRock_2w, kSTNospecial_2w, false, 0, 0},
+ {kVUnder_2w, kNRock_2w, kSTDull2_2w, false, 0, 0},
+ {kVTalk_2w, kNDoctor_2w, kSTComeHere_2w, false, 0, 0},
+ {kVTalk_2w, kNDoctor_2w, kSTPleasego_2w, false, 1, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen38_desc_2w[] = { // hall1
+ {kVLook_2w, 0, kSTS38look_2w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+// Array of ptrs to object_list_t
+objectList_t backgroundList_2w[] = {
+ screen0_desc_2w, screen1_desc_2w, screen2_desc_2w, screen3_desc_2w, screen4_desc_2w,
+ screen5_desc_2w, screen6_desc_2w, screen7_desc_2w, screen8_desc_2w, screen9_desc_2w,
+ screen10_desc_2w, screen11_desc_2w, screen12_desc_2w, screen13_desc_2w, screen14_desc_2w,
+ screen15_desc_2w, screen16_desc_2w, screen17_desc_2w, screen18_desc_2w, screen19_desc_2w,
+ screen20_desc_2w, screen21_desc_2w, screen22_desc_2w, screen23_desc_2w, screen24_desc_2w,
+ screen25_desc_2w, screen26_desc_2w, screen27_desc_2w, screen28_desc_2w, screen29_desc_2w,
+ screen30_desc_2w, screen31_desc_2w, screen32_desc_2w, screen33_desc_2w, screen34_desc_2w,
+ screen35_desc_2w, screen36_desc_2w, screen37_desc_2w, screen38_desc_2w
+};
+
+background_t catchall_3w[] = { // Generally applicable phrases
+// Make sure verbs with nouns come before same verb with 0
+ {kVLook_3w, kNPenny_3w, kSTLookpen_3w, false, DONT_CARE, 0},
+ {kVKiss_3w, kNPenny_3w, kSTMmmm_3w, false, DONT_CARE, 0},
+ {kVRude_3w, kNPenny_3w, kSTHeadache_3w, false, DONT_CARE, 0},
+ {kVNaughty_3w, kNPenny_3w, kSTHeadache_3w, false, DONT_CARE, 0},
+ {kVInto_3w, kNWindow_3w, kSTThruwindow_3w, false, DONT_CARE, 0},
+ {kVOutof_3w, kNWindow_3w, kSTThruwindow_3w, false, DONT_CARE, 0},
+ {kVJump_3w, 0, kSTSjump_3w, false, DONT_CARE, 0},
+ {kVGo_3w, 0, kSTTrywalk_3w, false, DONT_CARE, 0},
+ {kVInto_3w, 0, kSTTrywalk_3w, false, DONT_CARE, 0},
+ {kVClimb_3w, 0, kSTSclimb_3w, false, DONT_CARE, 0},
+ {kVShout_3w, 0, kSTNothing_3w, false, DONT_CARE, 0},
+ {kVTalk_3w, 0, kSTStalk_3w, false, DONT_CARE, 0},
+ {kVSwitch_3w, 0, kSTMorespecific_3w, false, DONT_CARE, 0},
+ {kVUse_3w, 0, kSTMorespecific_3w, false, DONT_CARE, 0},
+ {kVThrowit_3w, 0, kSTNopurps_3w, false, DONT_CARE, 0},
+ {kVRude_3w, 0, kSTSrude_3w, false, DONT_CARE, 0},
+ {kVAttack_3w, 0, kSTSattack_3w, false, DONT_CARE, 0},
+ {kVBreak_3w, 0, kSTSbreak_3w, false, DONT_CARE, 0},
+ {kVListen_3w, 0, kSTQuiet_3w, false, DONT_CARE, 0},
+ {kVSmell_3w, 0, kSTAroma_3w, false, DONT_CARE, 0},
+ {kVQuery_3w, 0, kSTNoidea_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNSky_3w, kSTFalling_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNWall_3w, kSTDull_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNGround_3w, kSTDull_3w, false, DONT_CARE, 0},
+ {kVHelp_3w, 0, kSTShelp_3w, false, DONT_CARE, 0},
+ {kVMagic_3w, 0, kSTSmagic_3w, false, DONT_CARE, 0},
+ {kVWish_3w, 0, kSTSmagic_3w, false, DONT_CARE, 0},
+ {kVDig_3w, 0, kSTSdig_3w, false, DONT_CARE, 0},
+ {kVNaughty_3w, 0, kSTSnaughty_3w, false, DONT_CARE, 0},
+ {kVKnock_3w, 0, kSTNoanswer_3w, false, DONT_CARE, 0},
+ {kVOpen_3w, kNDoor_3w, kSTWontopen_3w, false, DONT_CARE, 0},
+ {kVUnlock_3w, kNDoor_3w, kSTCantunlock_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNDoor_3w, kSTDull_3w, false, DONT_CARE, 0},
+ {kVHello_3w, 0, kSTHi_3w, false, DONT_CARE, 0},
+ {kVGive_3w, 0, kSTNothanks_3w, false, DONT_CARE, 0},
+ {kVShout_3w, 0, kSTNoanswer_3w, false, DONT_CARE, 0},
+ {kVUndress_3w, 0, kSTSundress_3w, false, DONT_CARE, 0},
+ {kVSit_3w, 0, kSTStired_3w, false, DONT_CARE, 0},
+ {kVFeed_3w, 0, kSTNothanks_3w, false, DONT_CARE, 0},
+ {kVTake_3w, kNVine_3w, kSTNopurps_3w, false, DONT_CARE, 0},
+ {kVClimb_3w, kNJungle_3w, kSTNopurps_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNJungle_3w, kSTLookjungle_3w, false, DONT_CARE, 0},
+ {kVPut_3w, kNFire_3w, kSTNopurps_3w, false, DONT_CARE, 0},
+ {kVSwim_3w, 0, kSTCantswim_3w, false, DONT_CARE, 0},
+ {kVTake_3w, kNMouse_3w, kSTCantcatch_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNMouse_3w, kSTNospecial_3w, false, DONT_CARE, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t crash_desc_3w[] = { // At the crash site
+ {kVLook_3w, 0, kSTLookcrash_3w, false, 0, 0},
+ {kVRepair_3w, kNPlane_3w, kSTNopurps_3w, false, 0, 0},
+ {kVFly_3w, kNPlane_3w, kSTNopurps_3w, false, 0, 0},
+ {kVInto_3w, 0, kSTMorespecific_3w, true , 0, 0},
+ {kVOpen_3w, kNDoor_3w, kSTOpenplanedoor_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t plane_desc_3w[] = { // Inside the plane
+ {kVLook_3w, 0, kSTLookplane_3w, true , 0, 0},
+ {kVSearch_3w, 0, kSTSaylook_3w, false, 0, 0},
+ {kVInto_3w, 0, kSTYouarein_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t web_desc_3w[] = { // At the spider's web
+ {kVLook_3w, 0, kSTLookweb_3w, true, 0, 0},
+ {kVTake_3w, kNNative_3w, kSTTakegirl_3w, false, 0, 0},
+ {kVLook_3w, kNWeb_3w, kSTLookatweb_3w, false, 0, 0},
+ {kVTake_3w, kNPenny_3w, kSTTakepenny_3w, false, 0, 0},
+ {kVTalk_3w, kNPenny_3w, kSTTalkpenny_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t wfall_desc_3w[] = { // Waterfall and stream
+ {kVLook_3w, 0, kSTLookwfall_3w, true, 0, 0},
+ {kVLook_3w, kNWater_3w, kSTLookwfall_3w, false, 0, 0},
+ {kVCross_3w, kNWater_3w, kSTCantcross_3w, false, 0, 0},
+ {kVListen_3w, 0, kSTListenfall_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t wfall_b_desc_3w[] = { // Same as above but no water
+ {kVLook_3w, 0, kSTLookwfall_b_3w, true, 0, 0},
+ {kVLook_3w, kNWater_3w, kSTLookwfall_b_3w, false, 0, 0},
+ {kVCross_3w, kNWater_3w, kSTToomuddy_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t wbase_desc_3w[] = { // Base of waterfall
+ {kVLook_3w, 0, kSTLookwbase_3w, true , 0, 0},
+ {kVLook_3w, kNWater_3w, kSTLookwbase_3w, false, 0, 0},
+ {kVCross_3w, kNWater_3w, kSTToomuddy_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t path_ul_desc_3w[] = { // Path at left of spider's web
+ {kVLook_3w, 0, kSTLookpath_ul_3w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t bridge_desc_3w[] = { // At the bridge
+ {kVLook_3w, 0, kSTLookbridge1_3w, true, 0, 0},
+ {kVSwing_3w, 0, kSTSwingbridge_3w, false, 0, 0},
+ {kVTake_3w, kNVine_3w, kSTGetbridgevines_3w, false, 0, 0},
+ {kVTie_3w, kNThem_3w, kSTMorespecific_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t bridge2_desc_3w[] = { // At the bridge
+ {kVLook_3w, 0, kSTLookbridge2_3w, true, 0, 0},
+ {kVSwing_3w, 0, kSTSwingbridge_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t stream_desc_3w[] = { // stream with vines crossing
+ {kVLook_3w, 0, kSTLookstream1_3w, true, 0, 0},
+ {kVSwing_3w, 0, kSTMorespecific_3w, false, 0, 0},
+ {kVCross_3w, 0, kSTStep1_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t stream2_desc_3w[] = { // Stream with elephant sitting in it
+ {kVLook_3w, 0, kSTLookstream2_3w, true, 0, 0},
+ {kVSwing_3w, 0, kSTCantswing_3w, false, 0, 0},
+ {kVLook_3w, kNElephant_3w, kSTLookele2_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t village_desc_3w[] = { // Long shot of village
+ {kVLook_3w, 0, kSTLookvillage_3w, true, 0, 0},
+ {kVTake_3w, kNFood_3w, kSTTakething_3w, false, 0, 0},
+ {kVLook_3w, kNFood_3w, kSTTakething_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t hut_out_desc_3w[] = { // Outside witch doctor's hut
+ {kVLook_3w, 0, kSTLookhut_out_3w, false, 0, 0},
+ {kVLook_3w, kNDocbits_3w, kSTLookdocbits_3w, false, 0, 0},
+ {kVTake_3w, kNDocbits_3w, kSTTakedocbits_3w, false, 0, 0},
+ {kVLook_3w, kNFire_3w, kSTLookdocbits_3w, false, 0, 0},
+ {kVTake_3w, kNFire_3w, kSTTakedocbits_3w, false, 0, 0},
+ {kVLook_3w, kNSpider_3w, kSTLookspider_3w, false, 0, 0},
+ {kVTake_3w, kNSpider_3w, kSTTakespider_3w, false, 0, 0},
+ {kVLook_3w, kNSnake_3w, kSTLooksnake_3w, false, 0, 0},
+ {kVTake_3w, kNSnake_3w, kSTTakesnake_3w, false, 0, 0},
+ {kVSearch_3w, kNWindow_3w, kSTLookinhut_3w, false, 0, 0},
+ {kVLook_3w, kNWindow_3w, kSTLookinhut_3w, false, 0, 0},
+ {kVSearch_3w, kNHut_3w, kSTLookinhut_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t hut_in_desc_3w[] = { // Inside hut
+// States: 0 imprisoned, 1 doctor incapacitated
+ {kVLook_3w, 0, kSTLookhut_in_3w, true, 0, 0},
+ {kVLook_3w, 0, kSTLookhut_in2_3w, true, 1, 0},
+ {kVLook_3w, kNDoctor_3w, kSTLookhut_in2_3w, false, 1, 0},
+ {kVTake_3w, 0, kSTTakeincage_3w, false, 0, 0},
+ {kVTake_3w, kNDoctor_3w, kSTTakedoctor0_3w, false, 0, 0},
+ {kVTake_3w, kNDoctor_3w, kSTTakedoctor1_3w, false, 1, 0},
+ {kVLook_3w, kNDocbits_3w, kSTLookdocbits_3w, false, DONT_CARE, 0},
+ {kVTake_3w, kNDocbits_3w, kSTTakedocbits_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNSpider_3w, kSTLookspider_3w, false, DONT_CARE, 0},
+ {kVTake_3w, kNSpider_3w, kSTTakespider_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNSnake_3w, kSTLooksnake_3w, false, DONT_CARE, 0},
+ {kVTake_3w, kNSnake_3w, kSTTakesnake_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNWindow_3w, kSTLookouthut_3w, false, DONT_CARE, 0},
+ {kVLook_3w, kNShelfbits_3w, kSTLookshelfbits_3w, false, 0, 0},
+ {kVLook_3w, kNShelfbits_3w, kSTLookshelfbits2_3w, false, 1, 0},
+ {kVTake_3w, kNShelfbits_3w, kSTTakeshelfbits_3w, false, 1, 0},
+ {kVDrink_3w, kNShelfbits_3w, kSTTakeshelfbits_3w, false, 1, 0},
+ {kVLook_3w, kNBottles_3w, kSTLookshelfbits_3w, false, 0, 0},
+ {kVLook_3w, kNBottles_3w, kSTLookshelfbits2_3w, false, 1, 0},
+ {kVTake_3w, kNBottles_3w, kSTTakeshelfbits_3w, false, 1, 0},
+ {kVDrink_3w, kNBottles_3w, kSTTakeshelfbits_3w, false, 1, 0},
+ {kVSearch_3w, 0, kSTCantlookin_3w, false, 0, 0},
+ {kVInto_3w, kNFire_3w, kSTGetinpot_3w, false, 1, 0},
+ {kVSearch_3w, kNFire_3w, kSTLookinfire_3w, false, 1, 0},
+ {kVLook_3w, kNFire_3w, kSTLookfire_3w, false, DONT_CARE, 0},
+ {kVTalk_3w, kNDoctor_3w, kSTTalkdoc_3w, false, 0, 0},
+ {kVTalk_3w, kNDoctor_3w, kSTTalkdoc2_3w, false, 1, 0},
+ {kVSearch_3w, kNMouse_3w, kSTLookinhole_3w, false, DONT_CARE, 0},
+ {kVTalk_3w, kNMouse_3w, kSTTalkmouse_3w, false, DONT_CARE, 0},
+ {kVUnlock_3w, kNCdoor_3w, kSTPicklock_3w, false, 0, 0},
+ {kVTake_3w, kNDoorlock_3w, kSTPicklock_3w, false, 0, 0},
+ {kVGive_3w, kNMouse_3w, kSTGivemouse_3w, false, DONT_CARE, 0},
+ {kVThrowit_3w, kNCheese_3w, kSTGivemouse_3w, false, DONT_CARE, 0},
+ {kVTake_3w, kNNative_3w, kSTTakenative_3w, false, 0, 0},
+ {kVShoot_3w, kNDoctor_3w, kSTMissed_3w, false, DONT_CARE, 0},
+ {kVBlow_3w, kNDoctor_3w, kSTMissed_3w, false, DONT_CARE, 0},
+ {kVUse_3w, kNPipe_3w, kSTMissed_3w, false, DONT_CARE, 0},
+ {kVClose_3w, kNCdoor_3w, kSTNotclose_3w, false, DONT_CARE, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t garden_desc_3w[] = { // The secret garden
+ {kVLook_3w, 0, kSTLookgarden_3w, true, 0, 0},
+ {kVLook_3w, kNOrchid_3w, kSTLookorchid_3w, false, 0, 0},
+ {kVTake_3w, kNOrchid_3w, kSTTakeorchid_3w, false, 0, 0},
+ {kVCross_3w, 0, kSTCrossgarden_3w, false, 0, 0},
+ {kVLook_3w, kNWater_3w, kSTLookgarden_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t clifftop_desc_3w[] = { // Top of cliff path
+ {kVLook_3w, 0, kSTLookclifftop_3w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t oldman_desc_3w[] = { // Old man inside cave
+ {kVLook_3w, 0, kSTLookoldman_3w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t cliff_desc_3w[] = { // Lower cliff path
+ {kVLook_3w, 0, kSTLookcliff_3w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t camp_desc_3w[] = { // Camp scene in village
+ {kVLook_3w, 0, kSTLookcamp_3w, true, 0, 0},
+ {kVLook_3w, kNFire_3w, kSTLookhyena_3w, false, 0, 0},
+ {kVLook_3w, kNPole_3w, kSTLookpole_3w, false, 0, 0},
+ {kVBehind_3w, kNHut_3w, kSTBehindhut_3w, false, 0, 0},// Must come before look hut
+ {kVSearch_3w, kNWindow_3w, kSTLookintohut_3w, false, 0, 0},
+ {kVSearch_3w, kNHut_3w, kSTLookintohut_3w, false, 0, 0},
+ {kVLook_3w, kNHut_3w, kSTLookhut_3w, false, 0, 0},
+ {kVLook_3w, kNWindow_3w, kSTLookintohut_3w, false, 0, 0},
+ {kVEat_3w, 0, kSTEatroast_3w, false, 0, 0},
+ {kVTake_3w, kNFood_3w, kSTEatroast_3w, false, 0, 0},
+ {kVInto_3w, kNFire_3w, kSTIntofire_3w, false, 0, 0},
+ {kVTake_3w, kNFire_3w, kSTIntofire_3w, false, 0, 0},
+ {kVTake_3w, kNNative_3w, kSTTakenative_3w, false, 0, 0},
+ {kVTake_3w, kNPipe_3w, kSTMakeoffer_3w, false, 0, 0},
+ {kVGive_3w, kNBouillon_3w, kSTNonecarried_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t turn_desc_3w[] = { // Turnaround path
+ {kVLook_3w, 0, kSTLookturn_3w, true, DONT_CARE, 0},
+ {kVUnder_3w, kNRock_3w, kSTUnderrock_3w, false, 0, 0},
+ {kVLook_3w, kNRock_3w, kSTLookrock_3w, false, 0, 0},
+ {kVRide_3w, kNRock_3w, kSTOntorock_3w, false, 0, 0},
+ {kVClimb_3w, kNRock_3w, kSTOntorock_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t slope_desc_3w[] = { // Slope between cliff and stream
+ {kVLook_3w, 0, kSTLookslope_3w, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t path_desc_3w[] = { // Path containing elephant
+// States: 0 Elephant present, 1 - Elephant not present
+ {kVLook_3w, 0, kSTLookpath2_1_3w, true, 0, 0},
+ {kVLook_3w, 0, kSTLookpath2_2_3w, true, 1, 0},
+ {kVRide_3w, kNElephant_3w, kSTRideelephant_3w, false, 0, 0},
+ {kVTake_3w, kNElephant_3w, kSTGetelephant_3w, false, 0, 0},
+ {kVShow_3w, kNMouse_3w, kSTShowmouse_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t cave_desc_3w[] = { // Cave mouth
+ {kVLook_3w, 0, kSTLookcave1_3w, true, 0, 0},
+ {kVLook_3w, 0, kSTLookcave2_3w, true, 1, 0},
+ {kVAttack_3w, kNGhost_3w, kSTAttackghost_3w, false, 0, 0},
+ {kVBreak_3w, kNGhost_3w, kSTAttackghost_3w, false, 0, 0},
+ {kVShoot_3w, kNGhost_3w, kSTAttackghost_3w, false, 0, 0},
+ {kVTake_3w, kNGhost_3w, kSTTakeghost_3w, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t bgDummy[] = {
+ {0, 0, 0, false, 0, 0}
+};
+
+// Array of ptrs to background_t
+// Strangerke : replaced 0 by bgDummy. TODO: Suppress this comment if OK
+objectList_t backgroundList_3w[] = {
+ crash_desc_3w, web_desc_3w, bridge_desc_3w, bridge2_desc_3w, clifftop_desc_3w,
+ wfall_desc_3w, wfall_b_desc_3w, wbase_desc_3w, stream_desc_3w, stream2_desc_3w,
+ path_ul_desc_3w, village_desc_3w, hut_out_desc_3w, hut_in_desc_3w, garden_desc_3w,
+ oldman_desc_3w, cliff_desc_3w, slope_desc_3w, camp_desc_3w, bgDummy,
+ turn_desc_3w, plane_desc_3w, bgDummy, path_desc_3w, cave_desc_3w
+};
+
+background_t catchall_1d[] = { // Generally applicable phrases
+ {kVJump_1d, 0, kSTnojump_1d, false, 0, 0},
+ {kVGo_1d, 0, kSTtrywalk_1d, false, 0, 0},
+ {kVEnter_1d, 0, kSTtrywalk_1d, false, 0, 0},
+ {kVClimb_1d, 0, kSTnoclimb_1d, false, 0, 0},
+ {kVShout_1d, 0, kSTnothing_1d, false, 0, 0},
+ {kVTalk_1d, 0, kSTnotalk_1d, false, 0, 0},
+ {kVSwitch_1d, 0, kSTnopurps_1d, false, 0, 0},
+ {kVThrow_1d, 0, kSTnopurps_1d, false, 0, 0},
+ {kVAttack_1d, 0, kSTnoattack_1d, false, 0, 0},
+ {kVBreak_1d, 0, kSTnobreak_1d, false, 0, 0},
+ {kVListen_1d, 0, kSTnolisten_1d, false, 0, 0},
+ {kVSmell_1d, 0, kSTnosmell_1d, false, 0, 0},
+ {kVQuery_1d, 0, kSTnoidea_1d, false, 0, 0},
+ {kVLook_1d, kNSky_1d, kSTnolook_1d, false, 0, 0},
+ {kVLook_1d, kNWall_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNGround_1d, kSTdull_1d, false, 0, 0},
+ {kVHelp_1d, 0, kSTnohelp_1d, false, 0, 0},
+ {kVMagic_1d, 0, kSTnomagic_1d, false, 0, 0},
+ {kVDig_1d, 0, kSTnodig_1d, false, 0, 0},
+ {kVRude_1d, 0, kSTnorude_1d, false, 0, 0},
+ {kVKnock_1d, 0, kSTnoknock_1d, false, 0, 0},
+ {kVTake_1d, kNPicture_1d, kSTnopurps_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen0_desc_1d[] = { // Outside house
+ {kVLook_1d, kNTree_1d, kSTlooks0tree_1d, false, 0, 0},
+ {kVLook_1d, kNFence_1d, kSTlooks0fence_1d, false, 0, 0},
+ {kVLook_1d, kNHouse_1d, kSTlooks0house_1d, false, 0, 0},
+ {kVLook_1d, kNWindow_1d, kSTlooks0window_1d, false, 0, 0},
+ {kVLook_1d, kNRoof_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNLight_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNMoon_1d, kSTlooks0moon_1d, false, 0, 0},
+ {kVEat_1d, kNPkin_1d, kSTeats0pkin_1d, false, 0, 0},
+ {kVUnder_1d, kNCarpet_1d, kSTunders0carpet_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks0_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen1_desc_1d[] = { // Hall
+ {kVLook_1d, kNBat_1d, kSTlooks1bat_1d, false, 0, 0},
+ {kVLook_1d, kNPicture_1d, kSTlooks1picture_1d, false, 0, 0},
+ {kVLook_1d, kNTable_1d, kSTlooks1table_1d, false, 0, 0},
+ {kVLook_1d, kNCarpet_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNStairs_1d, kSTlooks1stairs_1d, false, 0, 0},
+ {kVLook_1d, kNLight_1d, kSTlooks1light_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks1_1d, false, 0, 0},
+ {kVListen_1d, 0, kSTlistens1_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen2_desc_1d[] = { // Bedroom 1
+ {kVLook_1d, kNBed_1d, kSTlooks2bed_1d, false, 0, 0},
+ {kVUnder_1d, kNBed_1d, kSTlooks2bed_1d, false, 0, 0},
+ {kVRide_1d, kNBed_1d, kSTrides2bed_1d, false, 0, 0},
+ {kVInto_1d, kNBed_1d, kSTrides2bed_1d, false, 0, 0},
+ {kVLook_1d, kNWard_1d, kSTlooks2ward_1d, false, 0, 0},
+ {kVLook_1d, kNCupb_1d, kSTlooks2cupb_1d, false, 0, 0},
+ {kVLook_1d, kNWindow_1d, kSTlooks2window_1d, false, 0, 0},
+ {kVLook_1d, kNLight_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNFace_1d, kSTlooks2face_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks2_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen3_desc_1d[] = { // Dining room
+ {kVLook_1d, kNTable_1d, kSTlooks3table_1d, false, 0, 0},
+ {kVLook_1d, kNButler_1d, kSTlooks3butler_1d, false, 0, 0},
+ {kVLook_1d, kNPlant_1d, kSTlooks3plant_1d, false, 0, 0},
+ {kVLook_1d, kNPicture_1d, kSTlooks3witch_1d, false, 0, 0},
+ {kVLook_1d, kNWitch_1d, kSTlooks3witch_1d, false, 0, 0},
+ {kVLook_1d, kNWindow_1d, kSTlooks3window_1d, false, 0, 0},
+ {kVLook_1d, kNFood_1d, kSTlooks3food_1d, false, 0, 0},
+ {kVLook_1d, kNMan_1d, kSTlooks3man_1d, false, 0, 0},
+ {kVLook_1d, kNCupb_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNWoman_1d, kSTlooks3woman_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks3_1d, false, 0, 0},
+ {kVSit_1d, 0, kSTsits3_1d, false, 0, 0},
+ {kVTake_1d, kNFood_1d, kSTtakes3food_1d, false, 0, 0},
+ {kVEat_1d, 0, kSTtakes3food_1d, false, 0, 0},
+ {kVTalk_1d, kNMan_1d, kSTtalks3man_1d, false, 0, 0},
+ {kVTalk_1d, kNWoman_1d, kSTtalks3woman_1d, false, 0, 0},
+ {kVTalk_1d, kNButler_1d, kSTtalkS3butler_1d, false, 0, 0},
+ {kVKiss_1d, 0, kSTkisss3_1d, false, 0, 0},
+ {kVListen_1d, 0, kSTlistens3_1d, false, 0, 0},
+ {kVDrink_1d, 0, kSTdrinks3_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen4_desc_1d[] = { // Bathroom
+ {kVLook_1d, kNWindow_1d, kSTlooks2window_1d, false, 0, 0},
+ {kVLook_1d, kNLight_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNMirror_1d, kSTlooks4mirror_1d, false, 0, 0},
+ {kVLook_1d, kNToilet_1d, kSTlooks4toilet_1d, false, 0, 0},
+ {kVLook_1d, kNBath_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNSink_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks4_1d, false, 0, 0},
+ {kVCrap_1d, 0, kSTcraps4_1d, false, 0, 0},
+ {kVSit_1d, 0, kSTsits4_1d, false, 0, 0},
+ {kVWash_1d, kNHands_1d, kSTwashs4hands_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen5_desc_1d[] = { // Kitchen
+ {kVLook_1d, kNLight_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNUnits_1d, kSTlooks5units_1d, false, 0, 0},
+ {kVOpen_1d, kNUnits_1d, kSTempty_1d, false, 0, 0},
+ {kVLook_1d, kNWindow_1d, kSTlooks5window_1d, false, 0, 0},
+ {kVLook_1d, kNBroom_1d, kSTlooks5broom_1d, false, 0, 0},
+ {kVTake_1d, kNBroom_1d, kSTtakes5broom_1d, false, 0, 0},
+ {kVRide_1d, kNBroom_1d, kSTrides5broom_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks5_1d, false, 0, 0},
+ {kVSweep_1d, 0, kSTsweeps5_1d, false, 0, 0},
+ {kVListen_1d, 0, kSTlistens1_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen6_desc_1d[] = { // Garden
+ {kVLook_1d, kNShed_1d, kSTlooks6sched_1d, false, 0, 0},
+ {kVLook_1d, kNMoon_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNTree_1d, kSTlooks0tree_1d, false, 0, 0},
+ {kVClimb_1d, kNTree_1d, kSTclimbs6tree_1d, false, 0, 0},
+ {kVLook_1d, kNGardenbits_1d, kSTlooks6gardenbits_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks6_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen7_desc_1d[] = { // Store room
+ {kVLook_1d, kNCarpet_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNLight_1d, kSTdull_1d, false, 0, 0},
+ {kVUnbolt_1d, kNTrap_1d, kSTunbolts7trap_1d, false, 0, 0},
+ {kVLook_1d, kNMousehole_1d, kSTlooks7mousehole_1d, false, 0, 0},
+ {kVTake_1d, kNDroppings_1d, kSTtakes7droppings_1d, false, 0, 0},
+ {kVGive_1d, kNChop_1d, kSTchop1_1d, false, 0, 0},
+ {kVFeed_1d, kNDog_1d, kSTchop1_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks7_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen8_desc_1d[] = { // Basement
+ {kVLook_1d, kNLight_1d, kSTdull_1d, false, 0, 0},
+ {kVLook_1d, kNDoor_1d, kSTlooks8door_1d, false, 0, 0},
+ {kVOil_1d, kNDoor_1d, kSToils8door_1d, false, 0, 0},
+ {kVPush_1d, kNDoor_1d, kSTpushs8door_1d, false, 0, 0},
+ {kVLook_1d, kNRock_1d, kSTlooks8rock_1d, false, 0, 0},
+ {kVPush_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVLift_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVMove_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVUnder_1d, kNRock_1d, kSTnounder_1d, false, 0, 0},
+ {kVAttack_1d, kNDoor_1d, kSTbreaks8door_1d, false, 0, 0},
+ {kVBreak_1d, kNDoor_1d, kSTbreaks8door_1d, false, 0, 0},
+ {kVOpen_1d, kNDoor_1d, kSTopens8door_1d, false, 0, 0},
+ {kVUnlock_1d, kNDoor_1d, kSTunlocks8door_1d, false, 0, 0},
+ {kVKnock_1d, kNDoor_1d, kSTknocks8door_1d, false, 0, 0},
+ {kVTalk_1d, kNPenelope_1d, kSTtalks8penelope_1d, false, 0, 0},
+ {kVShout_1d, kNPenelope_1d, kSTtalks8penelope_1d, false, 0, 0},
+ {kVListen_1d, 0, kSTlistens8_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks8_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen9_desc_1d[] = { // Bat cave
+ {kVLook_1d, 0, kSTlooks9_1d, false, 0, 0},
+ {kVLook_1d, kNRock_1d, kSTlooks9rock_1d, false, 0, 0},
+ {kVPush_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVLift_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVMove_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVUnder_1d, kNRock_1d, kSTnounder_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen10_desc_1d[] = { // Mummy room
+ {kVLook_1d, 0, kSTlooks10_1d, false, 0, 0},
+ {kVLook_1d, kNRock_1d, kSTlooks9rock_1d, false, 0, 0},
+ {kVPush_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVLift_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVMove_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVUnder_1d, kNRock_1d, kSTnounder_1d, false, 0, 0},
+ {kVLook_1d, kNTomb_1d, kSTlooks10tomb_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen11_desc_1d[] = { // Lake room
+ {kVLook_1d, kNRock_1d, kSTlooks9rock_1d, false, 0, 0},
+ {kVPush_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVLift_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVMove_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVUnder_1d, kNRock_1d, kSTnounder_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks11_1d, false, 0, 0},
+ {kVLakeverbs_1d, 0, kSTlakeverbss11_1d, false, 0, 0},
+ {kVDrink_1d, 0, kSTdrinks3_1d, false, 0, 0},
+ {kVPlug_1d, 0, kSTplugs11_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen12_desc_1d[] = { // Dead end
+ {kVLook_1d, kNRock_1d, kSTlooks9rock_1d, false, 0, 0},
+ {kVPush_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVLift_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVMove_1d, kNRock_1d, kSTnowayhose_1d, false, 0, 0},
+ {kVUnder_1d, kNRock_1d, kSTnounder_1d, false, 0, 0},
+ {kVLook_1d, 0, kSTlooks12_1d, false, 0, 0},
+ {kVTalk_1d, kNGuard_1d, kSTtalks12guard_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen13_desc_1d[] = { // Jail
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen14_desc_1d[] = { // The end
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen15_desc_1d[] = { // Laboratory
+ {kVLook_1d, 0, kSTlooks15_1d, false, 0, 0},
+ {kVTalk_1d, kNIgor_1d, kSTtalks15igor_1d, false, 0, 0},
+ {kVTalk_1d, kNProf_1d, kSTtalks15prof_1d, false, 0, 0},
+ {kVLook_1d, kNMachinebits_1d, kSTlooks15machinebits_1d, false, 0, 0},
+ {kVPush_1d, kNMachinebits_1d, kSTpushs15machinebits_1d, false, 0, 0},
+ {kVLook_1d, kNTable_1d, kSTlooks15table_1d, false, 0, 0},
+ {kVClose_1d, kNDoor_1d, kSTopens15door_1d, false, 0, 0},
+ {kVOpen_1d, kNDoor_1d, kSTopens15door_1d, false, 0, 0},
+ {kVLook_1d, kNLight_1d, kSTlooks15light_1d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+// Array of ptrs to object_list_t
+objectList_t backgroundList_1d[] = {
+ screen0_desc_1d, screen1_desc_1d, screen2_desc_1d, screen3_desc_1d, screen4_desc_1d,
+ screen5_desc_1d, screen6_desc_1d, screen7_desc_1d, screen8_desc_1d, screen9_desc_1d,
+ screen10_desc_1d, screen11_desc_1d, screen12_desc_1d, screen13_desc_1d, screen14_desc_1d,
+ screen15_desc_1d
+};
+
+background_t catchall_2d[] = { // Generally applicable phrases
+ {kVTake_2d, kNPicture_2d, kSTNopurps_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNPenny_2d, kSTLookpen_2d, false, DONT_CARE, 0},
+ {kVKiss_2d, kNPenny_2d, kSTMmmm_2d, false, DONT_CARE, 0},
+ {kVRude_2d, kNPenny_2d, kSTHeadache_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNStairs_2d, kSTDull_2d, false, DONT_CARE, 0},
+ {kVUnder_2d, kNStairs_2d, kSTDull_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNPlant_2d, kSTSplant_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNPicture_2d, kSTSpicture_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNMirror_2d, kSTDull_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNTable_2d, kSTNo_on_2d, false, DONT_CARE, 0},
+ {kVJump_2d, 0, kSTSjump_2d, false, DONT_CARE, 0},
+ {kVGo_2d, 0, kSTTrywalk_2d, false, DONT_CARE, 0},
+ {kVInto_2d, 0, kSTTrywalk_2d, false, DONT_CARE, 0},
+ {kVClimb_2d, 0, kSTSclimb_2d, false, DONT_CARE, 0},
+ {kVShout_2d, 0, kSTNothing_2d, false, DONT_CARE, 0},
+ {kVTalk_2d, 0, kSTStalk_2d, false, DONT_CARE, 0},
+ {kVSwitch_2d, 0, kSTMorespecific_2d, false, DONT_CARE, 0},
+ {kVThrow_2d, 0, kSTNopurps_2d, false, DONT_CARE, 0},
+ {kVAttack_2d, 0, kSTSattack_2d, false, DONT_CARE, 0},
+ {kVBreak_2d, 0, kSTSbreak_2d, false, DONT_CARE, 0},
+ {kVListen_2d, 0, kSTQuiet_2d, false, DONT_CARE, 0},
+ {kVSmell_2d, 0, kSTAroma_2d, false, DONT_CARE, 0},
+ {kVQuery_2d, 0, kSTNoidea_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNSky_2d, kSTFalling_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNWall_2d, kSTDull_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNGround_2d, kSTDull_2d, false, DONT_CARE, 0},
+ {kVHelp_2d, 0, kSTShelp_2d, false, DONT_CARE, 0},
+ {kVMagic_2d, 0, kSTSmagic_2d, false, DONT_CARE, 0},
+ {kVWish_2d, 0, kSTSmagic_2d, false, DONT_CARE, 0},
+ {kVDig_2d, 0, kSTSdig_2d, false, DONT_CARE, 0},
+ {kVRude_2d, 0, kSTSrude_2d, false, DONT_CARE, 0},
+ {kVKnock_2d, 0, kSTNoanswer_2d, false, DONT_CARE, 0},
+ {kVOpen_2d, kNDoor_2d, kSTWontopen_2d, false, DONT_CARE, 0},
+ {kVUnlock_2d, kNDoor_2d, kSTCantunlock_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNDoor_2d, kSTDull_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNLight_2d, kSTDull_2d, false, DONT_CARE, 0},
+ {kVHello_2d, 0, kSTHi_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNFence_2d, kSTLookover_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNWall_2d, kSTLookover_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNGardenbits_2d, kSTDull_2d, false, DONT_CARE, 0},
+ {kVGive_2d, 0, kSTNothanks_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNTree_2d, kSTDull2_2d, false, DONT_CARE, 0},
+ {kVFire_2d, 0, kSTFire2_2d, false, DONT_CARE, 0},
+ {kVShout_2d, 0, kSTNoanswer_2d, false, DONT_CARE, 0},
+ {kVHerring_2d, 0, kSTSherring_2d, false, DONT_CARE, 0},
+ {kVUndress_2d, 0, kSTSundress_2d, false, DONT_CARE, 0},
+ {kVSit_2d, 0, kSTStired_2d, false, DONT_CARE, 0},
+ {kVFeed_2d, 0, kSTNothanks_2d, false, DONT_CARE, 0},
+ {kVRub_2d, kNCatnip_2d, kSTRubcatnip1_2d, false, DONT_CARE, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen0_desc_2d[] = { // Outside house
+ {kVLook_2d, 0, kSTWelcome_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen1_desc_2d[] = { // Hall
+ {kVLook_2d, 0, kSTLookhall_2d, true, 0, 0},
+ {kVLook_2d, kNMaid_2d, kSTTmaid_2d, false, 0, 0},
+ {kVTalk_2d, kNMaid_2d, kSTChatmaid1_2d, false, 0, 0},
+ {kVTalk_2d, kNPenny_2d, kSTChatmaid2_2d, false, 0, 0},
+ {kVKiss_2d, kNMaid_2d, kSTChatmaid3_2d, false, 0, 0},
+ {kVRude_2d, kNMaid_2d, kSTRudemaid_2d, false, 0, 0},
+ {kVOpen_2d, kNDoor_2d, kSTTmaiddoor_2d, false, 0, 0},
+ {kVUnlock_2d, kNDoor_2d, kSTTmaiddoor_2d, false, 0, 0},
+ {kVLook_2d, kNDoor_2d, kSTSdoor_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen2_desc_2d[] = { // Bed1
+ {kVLook_2d, 0, kSTLookbed1_2d, true, DONT_CARE, 0},
+ {kVLook_2d, kNBed_2d, kSTLookbed_2d, false, DONT_CARE, 0},
+ {kVInto_2d, kNBed_2d, kSTS2bed_2d, false, 0, 0},
+ {kVRide_2d, kNBed_2d, kSTS2bed_2d, false, 0, 0},
+ {kVRest_2d, kNBed_2d, kSTS2bed_2d, false, 0, 0},
+ {kVRide_2d, kNPenny_2d, kSTS2bed_2d, false, 0, 0},
+ {kVTalk_2d, kNPenny_2d, kSTZzzz_2d, false, 0, 0},
+ {kVInto_2d, kNBed_2d, kSTNopurps_2d, false, 1, 0},
+ {kVRide_2d, kNBed_2d, kSTNopurps_2d, false, 1, 0},
+ {kVRest_2d, kNBed_2d, kSTNopurps_2d, false, 1, 0},
+ {kVUnder_2d, kNBed_2d, kSTSsearch_2d, false, DONT_CARE, 0},
+ {kVRead_2d, kNBook_2d, kSTNocarry_2d, false, DONT_CARE, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen3_desc_2d[] = { // Bed2
+ {kVLook_2d, 0, kSTLookbed2_2d, true, 0, 0},
+ {kVLook_2d, kNBird_2d, kSTParrot_2d, false, 0, 0},
+ {kVLook_2d, kNCage_2d, kSTDull_2d, false, 0, 0},
+ {kVLook_2d, kNPencil_2d, kSTDull_2d, false, 0, 0},
+ {kVLook_2d, kNPhone_2d, kSTDull_2d, false, 0, 0},
+ {kVLook_2d, kNPaper_2d, kSTBlotter_2d, false, 0, 0},
+ {kVRead_2d, kNPaper_2d, kSTBlotter_2d, false, 0, 0},
+ {kVLook_2d, kNChair_2d, kSTDull_2d, false, 0, 0},
+ {kVTake_2d, kNPencil_2d, kSTNouse_2d, false, 0, 0},
+ {kVTake_2d, kNPaper_2d, kSTNouse_2d, false, 0, 0},
+ {kVLook_2d, kNHole_2d, kSTDull_2d, false, 0, 0},
+ {kVLook_2d, kNWall_2d, kSTDumbwaiter_2d, false, 0, 0},
+ {kVLook_2d, kNButton_2d, kSTSbutton_2d, false, 0, 0},
+ {kVPush_2d, kNButton_2d, kSTS3dumb_2d, false, 0, 0},
+ {kVDial_2d, 0, kSTS3phone_2d, false, 0, 4},
+ {kVTake_2d, kNPhone_2d, kSTS3phone_2d, false, 0, 4},
+ {kVUse_2d, kNPhone_2d, kSTS3phone_2d, false, 0, 4},
+ {kVLift_2d, kNPhone_2d, kSTS3phone_2d, false, 0, 4},
+ {kVTalk_2d, kNBird_2d, kSTS3bird_2d, false, 0, 5},
+ {kVInto_2d, 0, kSTSinto_2d, true, 0, 0},
+ {kVUnder_2d, kNCupb_2d, kSTSsearch_2d, false, 0, 0},
+ {kVFeed_2d, kNBird_2d, kSTBirdfull_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+
+background_t screen4_desc_2d[] = { // Keyhole
+ {kVLook_2d, 0, kSTLooklook_2d, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen5_desc_2d[] = { // Bed3
+ {kVLook_2d, 0, kSTLookbed3_2d, true, 0, 0},
+ {kVBlock_2d, 0, kSTSblock_2d, false, 0, 0},
+ {kVInto_2d, kNCage_2d, kSTStoobigtofit_2d, false, 0, 0},
+ {kVLook_2d, kNWindow_2d, kSTS6garden_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen6_desc_2d[] = { // Kitchen
+ {kVLook_2d, 0, kSTLookkitchen_2d, true, DONT_CARE, 0},
+ {kVLook_2d, kNButton_2d, kSTSbutton_2d, false, DONT_CARE, 0},
+ {kVPush_2d, kNButton_2d, kSTS3dumb_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNWindow_2d, kSTS6garden_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNUnits_2d, kSTS6dull_2d, false, DONT_CARE, 0},
+ {kVOpen_2d, kNUnits_2d, kSTS6dull_2d, false, DONT_CARE, 0},
+ {kVInto_2d, 0, kSTSinto_2d, true, DONT_CARE, 0},
+ {kVOpen_2d, kNDoor_2d, kSTMorespecific_2d, false, DONT_CARE, 0},
+ {kVLook_2d, kNDoor_2d, kSTMorespecific_2d, false, DONT_CARE, 0},
+ {kVTalk_2d, kNCook_2d, kSTTalkcook_2d, false, 1, 0},
+ {kVLook_2d, kNCook_2d, kSTLookcook_2d, false, 1, 0},
+ {kVLook_2d, kNKnife_2d, kSTLookknife_2d, false, 1, 0},
+ {kVTake_2d, kNKnife_2d, kSTTakeknife_2d, false, 1, 0},
+ {kVListen_2d, 0, kSTListenkitchen_2d, false, 1, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen7_desc_2d[] = { // Backdoor
+ {kVLook_2d, 0, kSTLookback_2d, true, 0, 0},
+ {kVLook_2d, kNWindow_2d, kSTLookwin_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen8_desc_2d[] = { // Shed
+ {kVLook_2d, 0, kSTLookshed_2d, true, 0, 0},
+ {kVLook_2d, kNWindow_2d, kSTLookwin_2d, false, 0, 0},
+ {kVLook_2d, kNShed_2d, kSTLookatshed_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen9_desc_2d[] = { // In shed
+ {kVLook_2d, 0, kSTLookinshed_2d, true, 0, 0},
+ {kVLook_2d, kNWall_2d, kSTS9tools1_2d, false, 0, 0},
+ {kVLook_2d, kNTools_2d, kSTS9tools1_2d, false, 0, 0},
+ {kVTake_2d, kNTools_2d, kSTS9tools2_2d, false, 0, 0},
+ {kVLook_2d, kNBroom_2d, kSTDull_2d, false, 0, 0},
+ {kVTake_2d, kNBroom_2d, kSTNouse_2d, false, 0, 0},
+ {kVLook_2d, kNTable_2d, kSTSomebuttons_2d, false, 0, 0},
+ {kVKiss_2d, kNGardner_2d, kSTMore_2d, false, 0, 0},
+ {kVRude_2d, kNGardner_2d, kSTRudeshed_2d, false, 0, 0},
+ {kVTalk_2d, kNGardner_2d, kSTIgnore_2d, false, 0, 0},
+ {kVClose_2d, kNDoor_2d, kSTShedclose_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen10_desc_2d[] = { // Venus fly traps
+ {kVLook_2d, 0, kSTLookvenus_2d, true, 0, 0},
+ {kVTake_2d, kNMirror_2d, kSTNotmirror_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen11_desc_2d[] = { // Gates kVOpen_2d,
+ {kVLook_2d, 0, kSTS11look_2d, true, 0, 0},
+ {kVClose_2d, kNDoor_2d, kSTNopurps_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen12_desc_2d[] = { // Gates closed
+ {kVLook_2d, 0, kSTS12look_2d, true, 0, 0},
+ {kVOpen_2d, kNDoor_2d, kSTGates1_2d, false, 0, 0},
+ {kVBreak_2d, kNDoor_2d, kSTGates2_2d, false, 0, 0},
+ {kVAttack_2d, kNDoor_2d, kSTGates2_2d, false, 0, 0},
+ {kVUnlock_2d, kNDoor_2d, kSTGates3_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen13_desc_2d[] = { // Stream
+ {kVLook_2d, 0, kSTS13look_2d, true, 0, 0},
+ {kVLook_2d, kNBridge_2d, kSTNospecial_2d, false, 0, 0},
+ {kVUnder_2d, kNBridge_2d, kSTSsearch_2d, false, 0, 0},
+ {kVLook_2d, kNWater_2d, kSTDull_2d, false, 0, 0},
+ {kVThrow_2d, kNMatches_2d, kSTThrowmatch_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen14_desc_2d[] = { // Zapper
+ {kVLook_2d, 0, kSTS14look_2d, true, 0, 0},
+ {kVSwitch_2d, kNZapper_2d, kSTNoswitch_2d, false, 0, 0},
+ {kVWind_2d, kNZapper_2d, kSTNoswitch_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen15_desc_2d[] = { // Mushroom
+ {kVLook_2d, 0, kSTS15look_2d, true, 0, 0},
+ {kVTalk_2d, kNMan_2d, kSTNoreply_2d, false, 0, 0},
+ {kVLook_2d, kNWand_2d, kSTS15wand1_2d, false, 0, 0},
+ {kVTake_2d, kNWand_2d, kSTS15wand2_2d, false, 0, 0},
+ {kVSearch_2d, kNMan_2d, kSTSsearch_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen16_desc_2d[] = { // Well
+ {kVLook_2d, 0, kSTS16look_2d, true, 0, 0},
+ {kVClimb_2d, 0, kSTTryrope_2d, false, 0, 0},
+ {kVGo_2d, kNWell_2d, kSTTryrope_2d, false, 0, 0},
+ {kVWind_2d, kNRope_2d, kSTWindwell_2d, false, 0, 0},
+ {kVTie_2d, kNRope_2d, kSTNopurps_2d, false, 0, 0},
+ {kVTake_2d, kNBucket_2d, kSTNosee_2d, false, 0, 0},
+ {kVLook_2d, kNBucket_2d, kSTNosee_2d, false, 0, 0},
+ {kVWind_2d, kNBucket_2d, kSTWindwell_2d, false, 0, 0},
+ {kVTake_2d, kNWater_2d, kSTNosee_2d, false, 0, 0},
+ {kVWind_2d, kNHandle_2d, kSTWindwell_2d, false, 0, 0},
+ {kVInto_2d, kNBucket_2d, kSTNosee_2d, false, 0, 0},
+ {kVInto_2d, kNWell_2d, kSTIntowell_2d, false, 0, 0},
+ {kVWish_2d, 0, kSTGetonwithit_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen17_desc_2d[] = { // Snakepit
+ {kVLook_2d, 0, kSTS17look_2d, true, 0, 0},
+ {kVAttack_2d, kNSnake_2d, kSTS17kill_2d, false, 0, 0},
+ {kVBreak_2d, kNSnake_2d, kSTS17kill_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen18_desc_2d[] = { // Phonebox
+ {kVLook_2d, 0, kSTS18look_2d, true, 0, 0},
+ {kVLook_2d, kNPhone_2d, kSTS18look_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+
+background_t screen19_desc_2d[] = { // Street
+ {kVLook_2d, 0, kSTS19look_2d, true, 0, 0},
+ {kVLook_2d, kNWall_2d, kSTSgraf_2d, false, 0, 0},
+ {kVRead_2d, kNWall_2d, kSTSgraf_2d, false, 0, 0},
+ {kVLook_2d, kNGraf_2d, kSTSgraf_2d, false, 0, 0},
+ {kVRead_2d, kNGraf_2d, kSTSgraf_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen20_desc_2d[] = { // Kennel
+ {kVLook_2d, 0, kSTS20look_2d, true, 0, 0},
+ {kVLook_2d, kNWindow_2d, kSTMorespecific_2d, false, 0, 0},
+ {kVThrow_2d, kNStick_2d, kSTDonthaveone_2d, false, 0, 0},
+ {kVStroke_2d, kNDog_2d, kSTStrokedog_2d, false, 0, 0},
+ {kVTalk_2d, kNDog_2d, kSTStrokedog_2d, false, 0, 0},
+ {kVInto_2d, 0, kSTStoobigtofit_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen21_desc_2d[] = { // Rockroom
+ {kVLook_2d, 0, kSTS21look_2d, true, 0, 0},
+ {kVClimb_2d, kNRope_2d, kSTNotclose_2d, false, 0, 0},
+ {kVUnder_2d, kNRock_2d, kSTNounder_2d, false, 0, 0},
+ {kVMove_2d, kNRock_2d, kSTTooheavy_2d, false, 0, 0},
+ {kVLift_2d, kNRock_2d, kSTNowayhose_2d, false, 0, 0},
+ {kVLook_2d, kNRock_2d, kSTDull_2d, false, 0, 0},
+ {kVTake_2d, kNRock_2d, kSTNowayhose_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen22_desc_2d[] = { // Rockgone
+ {kVLook_2d, 0, kSTS22look_2d, true, 0, 0},
+ {kVClimb_2d, kNRope_2d, kSTNotclose_2d, false, 0, 0},
+ {kVLift_2d, kNRock_2d, kSTNopurps_2d, false, 0, 0},
+ {kVLook_2d, kNRock_2d, kSTDull_2d, false, 0, 0},
+ {kVTake_2d, kNRock_2d, kSTNopurps_2d, false, 0, 0},
+ {kVUnder_2d, kNRock_2d, kSTSsearch_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen23_desc_2d[] = { // Threeway
+ {kVLook_2d, 0, kSTS23look_2d, true, 0, 0},
+ {kVLift_2d, kNRock_2d, kSTNopurps_2d, false, 0, 0},
+ {kVLook_2d, kNRock_2d, kSTDull_2d, false, 0, 0},
+ {kVUnder_2d, kNRock_2d, kSTDull2_2d, false, 0, 0},
+ {kVTake_2d, kNRock_2d, kSTNopurps_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+
+background_t screen24_desc_2d[] = { // Lampcave
+ {kVLook_2d, 0, kSTS24look_2d, true, 0, 0},
+ {kVLift_2d, kNRock_2d, kSTSsearch_2d, false, 0, 0},
+ {kVLook_2d, kNRock_2d, kSTNospecial_2d, false, 0, 0},
+ {kVUnder_2d, kNRock_2d, kSTDull2_2d, false, 0, 0},
+ {kVTake_2d, kNRock_2d, kSTNopurps_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen25_desc_2d[] = { // Chasm
+ {kVLook_2d, 0, kSTS25look_2d, true, 0, 0},
+ {kVUnder_2d, kNRock_2d, kSTSsearch_2d, false, 0, 0},
+ {kVLift_2d, kNRock_2d, kSTSsearch_2d, false, 0, 0},
+ {kVLook_2d, kNRock_2d, kSTDull_2d, false, 0, 0},
+ {kVTake_2d, kNRock_2d, kSTNopurps_2d, false, 0, 0},
+ {kVJump_2d, 0, kSTSnojump_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen26_desc_2d[] = { // Passage
+ {kVLook_2d, 0, kSTS26look_2d, true, 0, 0},
+ {kVUnder_2d, kNRock_2d, kSTSsearch_2d, false, 0, 0},
+ {kVLift_2d, kNRock_2d, kSTSsearch_2d, false, 0, 0},
+ {kVLook_2d, kNRock_2d, kSTDull_2d, false, 0, 0},
+ {kVTake_2d, kNRock_2d, kSTNopurps_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen27_desc_2d[] = { // genie
+ {kVLook_2d, 0, kSTS27look_2d, true, 0, 0},
+ {kVUnder_2d, kNRock_2d, kSTSsearch_2d, false, 0, 0},
+ {kVLift_2d, kNRock_2d, kSTSsearch_2d, false, 0, 0},
+ {kVLook_2d, kNRock_2d, kSTDull_2d, false, 0, 0},
+ {kVLook_2d, kNTrap_2d, kSTBudge_2d, false, 0, 0},
+ {kVOpen_2d, kNTrap_2d, kSTBudge_2d, false, 0, 0},
+ {kVUnscrew_2d, kNTrap_2d, kSTBudge_2d, false, 0, 0},
+ {kVUnlock_2d, kNTrap_2d, kSTBudge_2d, false, 0, 0},
+ {kVPush_2d, kNTrap_2d, kSTBudge_2d, false, 0, 0},
+ {kVTalk_2d, kNGenie_2d, kSTTalkgenie_2d, false, 0, 0},
+ {kVRude_2d, kNGenie_2d, kSTRudeshed_2d, false, 0, 0},
+ {kVKiss_2d, kNGenie_2d, kSTRudeshed_2d, false, 0, 0},
+ {kVGive_2d, kNBanana_2d, kSTNobanana_2d, false, 0, 0},
+ {kVClimb_2d, kNStairs_2d, kSTTrywalk_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen28_desc_2d[] = { // traproom
+ {kVLook_2d, 0, kSTS28look_2d, true, 0, 0},
+ {kVBreak_2d, kNSafe_2d, kSTNowayhose_2d, false, 0, 0},
+ {kVLook_2d, kNHole_2d, kSTS28hole_2d, false, 0, 28},
+ {kVTake_2d, kNMouse_2d, kSTS28mouse_2d, false, 0, 0},
+ {kVTake_2d, kNDroppings_2d, kSTSdroppings_2d, false, 0, 0},
+ {kVUnscrew_2d, kNSafe_2d, kSTMorespecific_2d, false, 0, 0},
+ {kVOpen_2d, 0, kSTUnlocksafe_2d, false, 0, 0},
+ {kVUnlock_2d, kNSafe_2d, kSTUnlocksafe_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen29_desc_2d[] = { // Hall 2
+ {kVLook_2d, 0, kSTLookhall_2d, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen30_desc_2d[] = { // Lounge
+ {kVLook_2d, 0, kSTS30look_2d, true, 0, 0},
+ {kVLook_2d, kNWindow_2d, kSTS6garden_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen31_desc_2d[] = { // parlor
+ {kVLook_2d, 0, kSTS31look_2d, true, 0, 0},
+ {kVListen_2d, 0, kSTBlah_2d, false, 0, 0},
+ {kVOpen_2d, kNDoor_2d, kSTMorespecific_2d, false, 0, 0},
+ {kVLook_2d, kNDoor_2d, kSTMorespecific_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen32_desc_2d[] = { // catroom
+ {kVLook_2d, 0, kSTS32look_2d, true, 0, 0},
+ {kVStroke_2d, kNCat_2d, kSTSstrokecat_2d, false, 0, 0},
+ {kVPlay_2d, kNCat_2d, kSTSplaycat_2d, false, 0, 0},
+ {kVTalk_2d, kNCat_2d, kSTStalkcat_2d, false, 0, 0},
+ {kVLook_2d, kNPost_2d, kSTSlookpost_2d, false, 0, 0},
+ {kVGive_2d, 0, kSTSgivecat_2d, false, 0, 0},
+ {kVLook_2d, kNWindow_2d, kSTS6garden_2d, false, 0, 0},
+ {kVRub_2d, kNCatnip_2d, kSTRubcatnip2_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen33_desc_2d[] = { // Boxroom
+ {kVLook_2d, 0, kSTS33look_2d, true, 0, 0},
+ {kVLook_2d, kNDoor_2d, kSTLookboxdoor_2d, false, 0, 0},
+ {kVRead_2d, kNPaper_2d, kSTReadpaper_2d, false, 0, 29},
+ {kVLook_2d, kNPaper_2d, kSTReadpaper_2d, false, 0, 29},
+ {kVLook_2d, kNCrate_2d, kSTSlookbox_2d, false, 0, 0},
+ {kVInto_2d, kNCrate_2d, kSTSgetinbox_2d, false, 0, 0},
+ {kVLook_2d, kNChute_2d, kSTLookchute_2d, false, 0, 0},
+ {kVLook_2d, kNHole_2d, kSTLookchute_2d, false, 0, 0},
+ {kVClimb_2d, kNChute_2d, kSTUpchute_2d, false, 0, 0},
+ {kVLook_2d, kNWall_2d, kSTLookchute_2d, false, 0, 0},
+ {kVInto_2d, kNDoor_2d, kSTMorespecific_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen34_desc_2d[] = { // hall3
+ {kVLook_2d, 0, kSTLookhall_2d, true, 0, 0},
+ {kVLook_2d, kNMirror_2d, kSTNospecial_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen35_desc_2d[] = { // Organ
+ {kVLook_2d, 0, kSTS35look_2d, true, DONT_CARE, 0},
+ {kVLook_2d, kNOrgan_2d, kSTNospecial_2d, false, DONT_CARE, 0},
+ {kVPlay_2d, kNOrgan_2d, kSTPlayorgan_2d, false, DONT_CARE, 0},
+ {kVListen_2d, 0, kSTHearorgan_2d, false, 0, 0},
+ {kVListen_2d, 0, kSTHearlaugh_2d, false, 1, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen36_desc_2d[] = { // Hestroom
+ {kVLook_2d, 0, kSTLookhest_2d, true, 0, 0},
+ {kVTake_2d, kNBook_2d, kSTS36book_2d, false, 0, 0},
+ {kVRead_2d, kNBook_2d, kSTS36book_2d, false, 0, 0},
+ {kVLook_2d, kNBook_2d, kSTS36book_2d, false, 0, 0},
+ {kVLook_2d, kNTable_2d, kSTS36table_2d, false, 0, 0},
+ {kVTalk_2d, kNHester_2d, kSTTalkhester_2d, false, 0, 0},
+ {kVLook_2d, kNWindow_2d, kSTS6garden_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen37_desc_2d[] = { // Retupmoc
+ {kVLook_2d, 0, kSTS37look_2d, true, 0, 0},
+ {kVLift_2d, kNRock_2d, kSTNopurps_2d, false, 0, 0},
+ {kVLook_2d, kNRock_2d, kSTNospecial_2d, false, 0, 0},
+ {kVUnder_2d, kNRock_2d, kSTDull2_2d, false, 0, 0},
+ {kVTalk_2d, kNDoctor_2d, kSTPleasego_2d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t screen38_desc_2d[] = { // hall1
+ {kVLook_2d, 0, kSTS38look_2d, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+objectList_t backgroundList_2d[] = {
+ screen0_desc_2d, screen1_desc_2d, screen2_desc_2d, screen3_desc_2d, screen4_desc_2d,
+ screen5_desc_2d, screen6_desc_2d, screen7_desc_2d, screen8_desc_2d, screen9_desc_2d,
+ screen10_desc_2d, screen11_desc_2d, screen12_desc_2d, screen13_desc_2d, screen14_desc_2d,
+ screen15_desc_2d, screen16_desc_2d, screen17_desc_2d, screen18_desc_2d, screen19_desc_2d,
+ screen20_desc_2d, screen21_desc_2d, screen22_desc_2d, screen23_desc_2d, screen24_desc_2d,
+ screen25_desc_2d, screen26_desc_2d, screen27_desc_2d, screen28_desc_2d, screen29_desc_2d,
+ screen30_desc_2d, screen31_desc_2d, screen32_desc_2d, screen33_desc_2d, screen34_desc_2d,
+ screen35_desc_2d, screen36_desc_2d, screen37_desc_2d, screen38_desc_2d
+};
+
+background_t catchall_3d[] = { // Generally applicable phrases
+ {kVLook_3d, kNPenny_3d, kSTLookpen_3d, false, DONT_CARE, 0},
+ {kVKiss_3d, kNPenny_3d, kSTMmmm_3d, false, DONT_CARE, 0},
+ {kVRude_3d, kNPenny_3d, kSTHeadache_3d, false, DONT_CARE, 0},
+ {kVNaughty_3d, kNPenny_3d, kSTHeadache_3d, false, DONT_CARE, 0},
+ {kVInto_3d, kNWindow_3d, kSTThruwindow_3d, false, DONT_CARE, 0},
+ {kVOutof_3d, kNWindow_3d, kSTThruwindow_3d, false, DONT_CARE, 0},
+ {kVJump_3d, 0, kSTSjump_3d, false, DONT_CARE, 0},
+ {kVGo_3d, 0, kSTTrywalk_3d, false, DONT_CARE, 0},
+ {kVInto_3d, 0, kSTTrywalk_3d, false, DONT_CARE, 0},
+ {kVClimb_3d, 0, kSTSclimb_3d, false, DONT_CARE, 0},
+ {kVShout_3d, 0, kSTNothing_3d, false, DONT_CARE, 0},
+ {kVTalk_3d, 0, kSTStalk_3d, false, DONT_CARE, 0},
+ {kVSwitch_3d, 0, kSTMorespecific_3d, false, DONT_CARE, 0},
+ {kVUse_3d, 0, kSTMorespecific_3d, false, DONT_CARE, 0},
+ {kVThrow_3d, 0, kSTNopurps_3d, false, DONT_CARE, 0},
+ {kVRude_3d, 0, kSTSrude_3d, false, DONT_CARE, 0},
+ {kVAttack_3d, 0, kSTSattack_3d, false, DONT_CARE, 0},
+ {kVBreak_3d, 0, kSTSbreak_3d, false, DONT_CARE, 0},
+ {kVListen_3d, 0, kSTQuiet_3d, false, DONT_CARE, 0},
+ {kVSmell_3d, 0, kSTAroma_3d, false, DONT_CARE, 0},
+ {kVQuery_3d, 0, kSTNoidea_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNSky_3d, kSTFalling_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNWall_3d, kSTDull_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNGround_3d, kSTDull_3d, false, DONT_CARE, 0},
+ {kVHelp_3d, 0, kSTShelp_3d, false, DONT_CARE, 0},
+ {kVMagic_3d, 0, kSTSmagic_3d, false, DONT_CARE, 0},
+ {kVWish_3d, 0, kSTSmagic_3d, false, DONT_CARE, 0},
+ {kVDig_3d, 0, kSTSdig_3d, false, DONT_CARE, 0},
+ {kVNaughty_3d, 0, kSTSnaughty_3d, false, DONT_CARE, 0},
+ {kVKnock_3d, 0, kSTNoanswer_3d, false, DONT_CARE, 0},
+ {kVOpen_3d, kNDoor_3d, kSTWontopen_3d, false, DONT_CARE, 0},
+ {kVUnlock_3d, kNDoor_3d, kSTCantunlock_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNDoor_3d, kSTDull_3d, false, DONT_CARE, 0},
+ {kVHello_3d, 0, kSTHi_3d, false, DONT_CARE, 0},
+ {kVGive_3d, 0, kSTNothanks_3d, false, DONT_CARE, 0},
+ {kVShout_3d, 0, kSTNoanswer_3d, false, DONT_CARE, 0},
+ {kVUndress_3d, 0, kSTSundress_3d, false, DONT_CARE, 0},
+ {kVSit_3d, 0, kSTStired_3d, false, DONT_CARE, 0},
+ {kVFeed_3d, 0, kSTNothanks_3d, false, DONT_CARE, 0},
+ {kVTake_3d, kNVine_3d, kSTNopurps_3d, false, DONT_CARE, 0},
+ {kVClimb_3d, kNJungle_3d, kSTNopurps_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNJungle_3d, kSTLookjungle_3d, false, DONT_CARE, 0},
+ {kVPut_3d, kNFire_3d, kSTNopurps_3d, false, DONT_CARE, 0},
+ {kVSwim_3d, 0, kSTCantswim_3d, false, DONT_CARE, 0},
+ {kVTake_3d, kNMouse_3d, kSTCantcatch_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNMouse_3d, kSTNospecial_3d, false, DONT_CARE, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t crash_desc_3d[] = { // At the crash site
+ {kVLook_3d, 0, kSTLookcrash_3d, false, 0, 0},
+ {kVRepair_3d, kNPlane_3d, kSTNopurps_3d, false, 0, 0},
+ {kVFly_3d, kNPlane_3d, kSTNopurps_3d, false, 0, 0},
+ {kVInto_3d, 0, kSTMorespecific_3d, true, 0, 0},
+ {kVOpen_3d, kNDoor_3d, kSTOpenplanedoor_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t plane_desc_3d[] = { // Inside the plane
+ {kVLook_3d, 0, kSTLookplane_3d, true, 0, 0},
+ {kVSearch_3d, 0, kSTSaylook_3d, false, 0, 0},
+ {kVInto_3d, 0, kSTYouarein_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t web_desc_3d[] = { // At the spider's web
+ {kVLook_3d, 0, kSTLookweb_3d, true, 0, 0},
+ {kVTake_3d, kNNative_3d, kSTTakegirl_3d, false, 0, 0},
+ {kVLook_3d, kNWeb_3d, kSTLookatweb_3d, false, 0, 0},
+ {kVTake_3d, kNPenny_3d, kSTTakepenny_3d, false, 0, 0},
+ {kVTalk_3d, kNPenny_3d, kSTTalkpenny_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t wfall_desc_3d[] = { // Waterfall and stream
+ {kVLook_3d, 0, kSTLookwfall_3d, true, 0, 0},
+ {kVLook_3d, kNWater_3d, kSTLookwfall_3d, false, 0, 0},
+ {kVCross_3d, kNWater_3d, kSTCantcross_3d, false, 0, 0},
+ {kVListen_3d, 0, kSTListenfall_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t wfall_b_desc_3d[] = { // Same as above but no water
+ {kVLook_3d, 0, kSTLookwfall_b_3d, true, 0, 0},
+ {kVLook_3d, kNWater_3d, kSTLookwfall_b_3d, false, 0, 0},
+ {kVCross_3d, kNWater_3d, kSTToomuddy_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t wbase_desc_3d[] = { // Base of waterfall
+ {kVLook_3d, 0, kSTLookwbase_3d, true, 0, 0},
+ {kVLook_3d, kNWater_3d, kSTLookwbase_3d, false, 0, 0},
+ {kVCross_3d, kNWater_3d, kSTToomuddy_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t path_ul_desc_3d[] = { // Path at left of spider's web
+ {kVLook_3d, 0, kSTLookpath_ul_3d, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t bridge_desc_3d[] = { // At the bridge
+ {kVLook_3d, 0, kSTLookbridge1_3d, true, 0, 0},
+ {kVSwing_3d, 0, kSTSwingbridge_3d, false, 0, 0},
+ {kVTake_3d, kNVine_3d, kSTGetbridgevines_3d, false, 0, 0},
+ {kVTie_3d, kNThem_3d, kSTMorespecific_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t bridge2_desc_3d[] = { // At the bridge
+ {kVLook_3d, 0, kSTLookbridge2_3d, true, 0, 0},
+ {kVSwing_3d, 0, kSTSwingbridge_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t stream_desc_3d[] = { // stream with vines crossing
+ {kVLook_3d, 0, kSTLookstream1_3d, true, 0, 0},
+ {kVSwing_3d, 0, kSTMorespecific_3d, false, 0, 0},
+ {kVCross_3d, 0, kSTStep1_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t stream2_desc_3d[] = { // Stream with elephant sitting in it
+ {kVLook_3d, 0, kSTLookstream2_3d, true, 0, 0},
+ {kVSwing_3d, 0, kSTCantswing_3d, false, 0, 0},
+ {kVLook_3d, kNElephant_3d, kSTLookele2_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t village_desc_3d[] = { // Long shot of village
+ {kVLook_3d, 0, kSTLookvillage_3d, true, 0, 0},
+ {kVTake_3d, kNFood_3d, kSTTakething_3d, false, 0, 0},
+ {kVLook_3d, kNFood_3d, kSTTakething_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t hut_out_desc_3d[] = { // Outside witch doctor's hut
+ {kVLook_3d, 0, kSTLookhut_out_3d, false, 0, 0},
+ {kVLook_3d, kNDocbits_3d, kSTLookdocbits_3d, false, 0, 0},
+ {kVTake_3d, kNDocbits_3d, kSTTakedocbits_3d, false, 0, 0},
+ {kVLook_3d, kNSpider_3d, kSTLookspider_3d, false, 0, 0},
+ {kVTake_3d, kNSpider_3d, kSTTakespider_3d, false, 0, 0},
+ {kVLook_3d, kNSnake_3d, kSTLooksnake_3d, false, 0, 0},
+ {kVTake_3d, kNSnake_3d, kSTTakesnake_3d, false, 0, 0},
+ {kVSearch_3d, kNWindow_3d, kSTLookinhut_3d, false, 0, 0},
+ {kVLook_3d, kNWindow_3d, kSTLookinhut_3d, false, 0, 0},
+ {kVSearch_3d, kNHut_3d, kSTLookinhut_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t hut_in_desc_3d[] = { // Inside hut
+// States: 0 imprisoned_3d, 1 doctor incapacitated
+ {kVLook_3d, 0, kSTLookhut_in_3d, true, 0, 0},
+ {kVLook_3d, 0, kSTLookhut_in2_3d, true, 1, 0},
+ {kVLook_3d, kNDoctor_3d, kSTLookhut_in2_3d, false, 1, 0},
+ {kVTake_3d, 0, kSTTakeincage_3d, false, 0, 0},
+ {kVTake_3d, kNDoctor_3d, kSTTakedoctor0_3d, false, 0, 0},
+ {kVTake_3d, kNDoctor_3d, kSTTakedoctor1_3d, false, 1, 0},
+ {kVLook_3d, kNDocbits_3d, kSTLookdocbits_3d, false, DONT_CARE, 0},
+ {kVTake_3d, kNDocbits_3d, kSTTakedocbits_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNSpider_3d, kSTLookspider_3d, false, DONT_CARE, 0},
+ {kVTake_3d, kNSpider_3d, kSTTakespider_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNSnake_3d, kSTLooksnake_3d, false, DONT_CARE, 0},
+ {kVTake_3d, kNSnake_3d, kSTTakesnake_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNWindow_3d, kSTLookouthut_3d, false, DONT_CARE, 0},
+ {kVLook_3d, kNShelfbits_3d, kSTLookshelfbits_3d, false, 0, 0},
+ {kVLook_3d, kNShelfbits_3d, kSTLookshelfbits2_3d, false, 1, 0},
+ {kVTake_3d, kNShelfbits_3d, kSTTakeshelfbits_3d, false, 1, 0},
+ {kVDrink_3d, kNShelfbits_3d, kSTTakeshelfbits_3d, false, 1, 0},
+ {kVLook_3d, kNBottles_3d, kSTLookshelfbits_3d, false, 0, 0},
+ {kVLook_3d, kNBottles_3d, kSTLookshelfbits2_3d, false, 1, 0},
+ {kVTake_3d, kNBottles_3d, kSTTakeshelfbits_3d, false, 1, 0},
+ {kVDrink_3d, kNBottles_3d, kSTTakeshelfbits_3d, false, 1, 0},
+ {kVSearch_3d, 0, kSTCantlookin_3d, false, 0, 0},
+ {kVSearch_3d, kNFire_3d, kSTLookinfire_3d, false, 1, 0},
+ {kVLook_3d, kNFire_3d, kSTLookfire_3d, false, DONT_CARE, 0},
+ {kVTalk_3d, kNDoctor_3d, kSTTalkdoc_3d, false, 0, 0},
+ {kVTalk_3d, kNDoctor_3d, kSTTalkdoc2_3d, false, 1, 0},
+ {kVSearch_3d, kNMouse_3d, kSTLookinhole_3d, false, DONT_CARE, 0},
+ {kVTalk_3d, kNMouse_3d, kSTTalkmouse_3d, false, DONT_CARE, 0},
+ {kVUnlock_3d, kNCdoor_3d, kSTPicklock_3d, false, 0, 0},
+ {kVTake_3d, kNDoorlock_3d, kSTPicklock_3d, false, 0, 0},
+ {kVGive_3d, kNMouse_3d, kSTGivemouse_3d, false, DONT_CARE, 0},
+ {kVThrow_3d, kNCheese_3d, kSTGivemouse_3d, false, DONT_CARE, 0},
+ {kVInto_3d, kNFire_3d, kSTGetinpot_3d, false, 1, 0},
+ {kVTake_3d, kNNative_3d, kSTTakenative_3d, false, 0, 0},
+ {kVShoot_3d, kNDoctor_3d, kSTMissed_3d, false, DONT_CARE, 0},
+ {kVBlow_3d, kNDoctor_3d, kSTMissed_3d, false, DONT_CARE, 0},
+ {kVUse_3d, kNPipe_3d, kSTMissed_3d, false, DONT_CARE, 0},
+ {kVClose_3d, kNCdoor_3d, kSTNotclose_3d, false, DONT_CARE, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t garden_desc_3d[] = { // The secret garden
+ {kVLook_3d, 0, kSTLookgarden_3d, true, 0, 0},
+ {kVLook_3d, kNOrchid_3d, kSTLookorchid_3d, false, 0, 0},
+ {kVTake_3d, kNOrchid_3d, kSTTakeorchid_3d, false, 0, 0},
+ {kVCross_3d, 0, kSTCrossgarden_3d, false, 0, 0},
+ {kVLook_3d, kNWater_3d, kSTLookgarden_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t clifftop_desc_3d[] = { // Top of cliff path
+ {kVLook_3d, 0, kSTLookclifftop_3d, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t oldman_desc_3d[] = { // Old man inside cave
+ {kVLook_3d, 0, kSTLookoldman_3d, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t cliff_desc_3d[] = { // Lower cliff path
+ {kVLook_3d, 0, kSTLookcliff_3d, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t camp_desc_3d[] = { // Camp scene in village
+ {kVLook_3d, 0, kSTLookcamp_3d, true, 0, 0},
+ {kVLook_3d, kNFire_3d, kSTLookhyena_3d, false, 0, 0},
+ {kVLook_3d, kNPole_3d, kSTLookpole_3d, false, 0, 0},
+ {kVBehind_3d, kNHut_3d, kSTBehindhut_3d, false, 0, 0},
+ {kVSearch_3d, kNWindow_3d, kSTLookintohut_3d, false, 0, 0},
+ {kVSearch_3d, kNHut_3d, kSTLookintohut_3d, false, 0, 0},
+ {kVLook_3d, kNHut_3d, kSTLookhut_3d, false, 0, 0},
+ {kVLook_3d, kNWindow_3d, kSTLookintohut_3d, false, 0, 0},
+ {kVEat_3d, 0, kSTEatroast_3d, false, 0, 0},
+ {kVTake_3d, kNFood_3d, kSTEatroast_3d, false, 0, 0},
+ {kVInto_3d, kNFire_3d, kSTIntofire_3d, false, 0, 0},
+ {kVTake_3d, kNFire_3d, kSTIntofire_3d, false, 0, 0},
+ {kVTake_3d, kNNative_3d, kSTTakenative_3d, false, 0, 0},
+ {kVTake_3d, kNPipe_3d, kSTMakeoffer_3d, false, 0, 0},
+ {kVGive_3d, kNBouillon_3d, kSTNonecarried_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t turn_desc_3d[] = { // Turnaround path
+ {kVLook_3d, 0, kSTLookturn_3d, true, DONT_CARE, 0},
+ {kVUnder_3d, kNRock_3d, kSTUnderrock_3d, false, 0, 0},
+ {kVLook_3d, kNRock_3d, kSTLookrock_3d, false, 0, 0},
+ {kVRide_3d, kNRock_3d, kSTOntorock_3d, false, 0, 0},
+ {kVClimb_3d, kNRock_3d, kSTOntorock_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t slope_desc_3d[] = { // Slope between cliff and stream
+ {kVLook_3d, 0, kSTLookslope_3d, true, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t path_desc_3d[] = { // Path containing elephant
+// States: 0 Elephant present_3d, 1 - Elephant not present
+ {kVLook_3d, 0, kSTLookpath2_1_3d, true, 0, 0},
+ {kVLook_3d, 0, kSTLookpath2_2_3d, true, 1, 0},
+ {kVRide_3d, kNElephant_3d, kSTRideelephant_3d, false, 0, 0},
+ {kVTake_3d, kNElephant_3d, kSTGetelephant_3d, false, 0, 0},
+ {kVShow_3d, kNMouse_3d, kSTShowmouse_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t cave_desc_3d[] = { // Cave mouth
+ {kVLook_3d, 0, kSTLookcave1_3d, true, 0, 0},
+ {kVLook_3d, 0, kSTLookcave2_3d, true, 1, 0},
+ {kVAttack_3d, kNGhost_3d, kSTAttackghost_3d, false, 0, 0},
+ {kVBreak_3d, kNGhost_3d, kSTAttackghost_3d, false, 0, 0},
+ {kVShoot_3d, kNGhost_3d, kSTAttackghost_3d, false, 0, 0},
+ {kVTake_3d, kNGhost_3d, kSTTakeghost_3d, false, 0, 0},
+ {0, 0, 0, false, 0, 0}
+};
+
+background_t *backgroundList_3d[] = {
+ crash_desc_3d, web_desc_3d, bridge_desc_3d, bridge2_desc_3d, clifftop_desc_3d,
+ wfall_desc_3d, wfall_b_desc_3d, wbase_desc_3d, stream_desc_3d, stream2_desc_3d,
+ path_ul_desc_3d, village_desc_3d, hut_out_desc_3d, hut_in_desc_3d, garden_desc_3d,
+ oldman_desc_3d, cliff_desc_3d, slope_desc_3d, camp_desc_3d, bgDummy,
+ turn_desc_3d, plane_desc_3d, bgDummy, path_desc_3d, cave_desc_3d
+};
+
+byte points_1w[] = {
+ 0, 11, 8, 9, 17,
+ 12, 7, 33, 21, 8,
+ 8, 10, 5
+};
+
+byte points_2w[] = {
+ 0, 3, 5, 3, 5,
+ 1, 10, 15, 10, 10,
+ 15, 5, 5, 5, 15,
+ 10, 5, 20, 7, 12,
+ 8, 10, 5, 5, 15,
+ 1, 7, 12, 1, 1,
+ 9
+};
+
+byte points_3w[] = {
+ 0, 2, 3, 4, 7,
+ 3, 5, 9, 2, 4,
+ 8, 10, 1, 0, 3,
+ 12, 2
+};
+
+byte points_1d[] = {
+ 5, 11, 8, 9, 17,
+ 12, 7, 33, 21, 8
+};
+
+byte points_2d[] = {
+ 0, 3, 5, 3, 5,
+ 1, 10, 15, 10, 10,
+ 15, 5, 5, 5, 15,
+ 10, 5, 20, 7, 12,
+ 8, 10, 5, 5, 15,
+ 1, 7, 12, 1, 1,
+ 9
+};
+
+byte points_3d[] = {
+ 0, 2, 3, 4, 7,
+ 3, 5, 9, 2, 4,
+ 8, 10, 1, 0, 3,
+ 12, 2
+};
+
+cmd blowdw_1w = {kVBlow_1w, 0, kDTnull, 0, 0, kDTnull, kDTokblow_1w, kALblowdw_1w};
+cmd breakpkin_1w = {kVBreak_1w, 0, kDTnull, 0, 1, kDTnull, kDTokgen_1w, kALpkin_1w};
+cmd brkrope_1w = {kVBreak_1w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsrbreak_1w, 0};
+cmd closebolt_1w = {kVClose_1w, 0, kDTnull, 2, 1, kDTsclosed_1w, kDTsclosebolt_1w, 0};
+cmd closedoor1_1w = {kVClose_1w, 0, kDTnull, 1, 0, kDTsclosed_1w, kDTnull, kALclosedoor1_1w};
+cmd closedoor2_1w = {kVClose_1w, 0, kDTnull, 1, 0, kDTsclosed_1w, kDTnull, 0};
+cmd closedoor3_1w = {kVClose_1w, 0, kDTnull, 1, 0, kDTsclosed_1w, kDTnull, 0};
+cmd closedoor4_1w = {kVClose_1w, 0, kDTnull, 1, 0, kDTsclosed_1w, kDTnull, kALclosedoor4_1w};
+cmd closetrap_1w = {kVClose_1w, 0, kDTnull, 1, 0, kDTsclosed_1w, kDTnull, kALclosetrap_1w};
+cmd closewdoors_1w = {kVClose_1w, 0, kDTnull, 1, 0, kDTsclosed_1w, kDTnull, kALclosewdoors_1w};
+cmd cutrope_1w = {kVCut_1w, kRknife_1w, kDTrnoknife_1w, 0, 1, kDTsnocut_1w, kDTscut_1w, kALcutrope_1w};
+cmd dropmask_1w = {kVDrop_1w, 0, kDTnull, 0, 0, kDTsworn3_1w, kDTnull, kALdropmask_1w};
+cmd droppkin_1w = {kVDrop_1w, kRpkin_1w, kDTnocgen_1w, 0, 1, kDTnull, kDTnull, kALpkin_1w};
+cmd eatchop_1w = {kVEat_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALeatchop2_1w};
+cmd getchop_1w = {kVTake_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALgetchop_1w};
+cmd getdw_1w = {kVTake_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALcupbdw_1w};
+cmd getinboat_1w = {kVInto_1w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALgetinboat_1w};
+cmd getknife_1w = {kVTake_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALcupbpk_1w};
+cmd getoilcan_1w = {kVTake_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALshedoil_1w};
+cmd getoutboat_1w = {kVOutof_1w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALgetoutboat_1w};
+cmd givegold_1w = {kVGive_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALgold_1w};
+cmd hiderock_1w = {kVHide_1w, 0, kDTnull, 0, 1, kDTsrock_1w, kDTnull, kALrock_1w};
+cmd kickpkin_1w = {kVAttack_1w, 0, kDTnull, 0, 1, kDTnull, kDTokgen_1w, kALpkin_1w};
+cmd knock_1w = {kVKnock_1w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsNobody_1w, 0};
+cmd lockbolt_1w = {kVLock_1w, 0, kDTnull, 2, 1, kDTsclosed_1w, kDTsclosebolt_1w, 0};
+cmd lockdoor_1w = {kVLock_1w, kRkey_1w, kDTnockey_1w, 1, 0, kDTslock_1w, kDTokgen_1w, kALclosedoor1_1w};
+cmd lookcupb_1w = {kVLook_1w, kRcandle_1w, kDTnoccandle_1w, DONT_CARE, 0, kDTnull, kDTnull, kALlookcupb_1w};
+cmd lookshed_1w = {kVLook_1w, kRcandle_1w, kDTnoccandle_1w, 0, 0, kDTsnoseeoil_1w, kDTsseeoil_1w, kALshedoil_1w};
+cmd movecarp1_1w = {kVMove_1w, 0, kDTnull, 0, 0, kDTnull, kDTsrollrug_1w, kALmovecarp_1w};
+cmd movecarp2_1w = {kVLift_1w, 0, kDTnull, 0, 0, kDTnull, kDTsrollrug_1w, kALmovecarp_1w};
+cmd movecarp3_1w = {kVUnder_1w, 0, kDTnull, 0, 0, kDTnull, kDTsrollrug_1w, kALmovecarp_1w};
+cmd offmask_1w = {kVOff_1w, 0, kDTnull, 1, 0, kDTsworn2_1w, kDTokgen_1w, kALswapmask_1w};
+cmd oilbolt_1w = {kVOil_1w, kRoil_1w, kDTrnooil_1w, 0, 1, kDTsoiled_1w, kDTsoilbolt_1w, 0};
+cmd omattack_1w = {kVAttack_1w, 0, kDTnull, 0, 0, kDTnull, kDTsomattack_1w, 0};
+cmd ombreak_1w = {kVBreak_1w, 0, kDTnull, 0, 0, kDTnull, kDTsomattack_1w, 0};
+cmd omtalk_1w = {kVTalk_1w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALoldman_1w};
+cmd openbolt_1w = {kVOpen_1w, 0, kDTnull, 1, 2, kDTsstuck_1w, kDTsopenbolt_1w, 0};
+cmd opendoor1_1w = {kVOpen_1w, kRkey_1w, kDTslocked_1w, 0, 1, kDTsopen_1w, kDTsunlock_1w, kALopendoor1_1w};
+cmd opendoor2_1w = {kVOpen_1w, 0, kDTnull, 0, 1, kDTsopen_1w, kDTnull, kALopendoor2_1w};
+cmd opendoor3_1w = {kVOpen_1w, 0, kDTnull, 0, 1, kDTsopen_1w, kDTnull, kALopendoor3_1w};
+cmd opendoor4_1w = {kVOpen_1w, 0, kDTnull, 0, 0, kDTsopen_1w, kDTnull, kALopendoor4_1w};
+cmd openpkin_1w = {kVOpen_1w, 0, kDTnull, 0, 1, kDTnull, kDTsopenpkin_1w, kALpkin_1w};
+cmd opentrap_1w = {kVOpen_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALopentrap_1w};
+cmd openwdoors_1w = {kVOpen_1w, 0, kDTnull, 0, 1, kDTsopen_1w, kDTnull, kALopenwdoors_1w};
+cmd plugbung_1w = {kVPlug_1w, kRbung_1w, kDTnocgen_1w, 0, 1, kDTnull, kDTsplug_1w, kALplugbung_1w};
+cmd pushboat_1w = {kVPush_1w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALpushboat_1w};
+cmd pushigor_1w = {kVPush_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALigor_1w};
+cmd ruboilcan_1w = {kVRub_1w, 0, kDTnull, 0, 0, kDTnull, kDTsruboil_1w, 0};
+cmd talkdrac_1w = {kVTalk_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALtalkdrac_1w};
+cmd talkfrank_1w = {kVTalk_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALtalkfrank_1w};
+cmd talkgwen_1w = {kVTalk_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALtalkgwen_1w};
+cmd talkhood_1w = {kVTalk_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALtalkhood_1w};
+cmd talkpeahd_1w = {kVTalk_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALtalkpeahd_1w};
+cmd talkslime_1w = {kVTalk_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALtalkslime_1w};
+cmd throwchop_1w = {kVThrowit_1w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALthrowchop_1w};
+cmd unlkdoor_1w = {kVUnlock_1w, kRkey_1w, kDTnockey_1w, 0, 1, kDTsunlocked_1w, kDTsunlock_1w, kALopendoor1_1w};
+cmd unlock_1w = {kVUnlock_1w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsUnlocked_1w, 0};
+cmd unlockbolt_1w = {kVUnlock_1w, 0, kDTnull, 1, 2, kDTsstuck_1w, kDTsopenbolt_1w, 0};
+cmd untierope_1w = {kVUntie_1w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsuntie_1w, 0};
+cmd useboat_1w = {kVMakeUseOf_1w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALuseboat_1w};
+cmd usemask_1w = {kVMakeUseOf_1w, kRmask_1w, kDTnocgen_1w, DONT_CARE, 0, kDTnull, kDTnull, kALusemask_1w};
+cmd wearmask_1w = {kVWear_1w, kRmask_1w, kDTnocgen_1w, 0, 1, kDTsworn1_1w, kDTokgen_1w, kALswapmask_1w};
+
+cmd emptyCmd = {0, 0, kDTnull, 0, 0, kDTnull, kDTnull, 0};
+
+cmd cmdDummy[] = {emptyCmd};
+
+cmd boat_1w[] = {useboat_1w, getinboat_1w, getoutboat_1w, pushboat_1w, emptyCmd};
+cmd bolt_1w[] = {openbolt_1w, oilbolt_1w, unlockbolt_1w, closebolt_1w, lockbolt_1w, emptyCmd};
+cmd bung_1w[] = {plugbung_1w, emptyCmd};
+cmd carpet_1w[] = {movecarp1_1w, movecarp2_1w, movecarp3_1w, emptyCmd};
+cmd chop_1w[] = {eatchop_1w, throwchop_1w, getchop_1w, emptyCmd};
+cmd cupb_1w[] = {lookcupb_1w, emptyCmd};
+cmd door1_1w[] = {opendoor1_1w, closedoor1_1w, unlkdoor_1w, lockdoor_1w, knock_1w, emptyCmd};
+cmd door2_1w[] = {opendoor2_1w, closedoor2_1w, knock_1w, unlock_1w, emptyCmd};
+cmd door3_1w[] = {opendoor3_1w, closedoor3_1w, knock_1w, unlock_1w, emptyCmd};
+cmd door4_1w[] = {opendoor4_1w, closedoor4_1w, knock_1w, emptyCmd};
+cmd drac_1w[] = {talkdrac_1w, emptyCmd};
+cmd frank_1w[] = {talkfrank_1w, emptyCmd};
+cmd gold_1w[] = {givegold_1w, emptyCmd};
+cmd gwen_1w[] = {talkgwen_1w, emptyCmd};
+cmd hood_1w[] = {talkhood_1w, emptyCmd};
+cmd igor_1w[] = {pushigor_1w, emptyCmd};
+cmd knife_1w[] = {getknife_1w, emptyCmd};
+cmd mask_1w[] = {usemask_1w, wearmask_1w, offmask_1w, dropmask_1w, emptyCmd};
+cmd oilcan_1w[] = {getoilcan_1w, ruboilcan_1w, emptyCmd};
+cmd oldman_1w[] = {omtalk_1w, omattack_1w, ombreak_1w, emptyCmd};
+cmd peahd_1w[] = {talkpeahd_1w, emptyCmd};
+cmd pkin_1w[] = {openpkin_1w, kickpkin_1w, breakpkin_1w, droppkin_1w, emptyCmd};
+cmd rock_1w[] = {hiderock_1w, emptyCmd};
+cmd rope_1w[] = {cutrope_1w, untierope_1w, brkrope_1w, emptyCmd};
+cmd shed_1w[] = {lookshed_1w, emptyCmd};
+cmd slime_1w[] = {talkslime_1w, emptyCmd};
+cmd trap_1w[] = {opentrap_1w, closetrap_1w, knock_1w, emptyCmd};
+cmd ward_1w[] = {openwdoors_1w, closewdoors_1w, knock_1w, emptyCmd};
+cmd whistle_1w[] = {blowdw_1w, getdw_1w, emptyCmd};
+
+const cmd *cmdList_1w[] = {
+ cmdDummy, boat_1w, bolt_1w, bung_1w, carpet_1w,
+ chop_1w, cupb_1w, door1_1w, door2_1w, door3_1w,
+ door4_1w, drac_1w, frank_1w, gold_1w, gwen_1w,
+ hood_1w, igor_1w, knife_1w, mask_1w, oilcan_1w,
+ oldman_1w, peahd_1w, pkin_1w, rock_1w, rope_1w,
+ shed_1w, slime_1w, trap_1w, ward_1w, whistle_1w
+};
+
+cmd climbdumb_2w = {kVClimb_2w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALdumb_2w};
+cmd climbrope_2w = {kVClimb_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALclimbrope_2w};
+cmd climbwell_2w = {kVClimb_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALclimbwell_2w};
+cmd closedoor1_2w = {kVClose_2w, 0, kDTnull, 1, 0, kDTsclose_2w, kDTnull, 0};
+cmd closedoor2_2w = {kVClose_2w, 0, kDTnull, 1, 0, kDTsclose_2w, kDTnull, 0};
+cmd closedoor3_2w = {kVClose_2w, 0, kDTnull, 1, 0, kDTsclose_2w, kDTnull, 0};
+cmd closesafe_2w = {kVClose_2w, 0, kDTnull, 1, 0, kDTsclose_2w, kDTokgen_2w, 0};
+cmd dialphone_2w = {kVDial_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALphone_2w};
+cmd doorpencil_2w = {kVMakeUseOf_2w, kRpencil_2w, kDTnocgen_2w, 0, 1, kDTspencil_2w, kDTnull, kALchkpap1_2w};
+cmd dropdynamite_2w = {kVDrop_2w, kRdyn_2w, kDTnocgen_2w, DONT_CARE, 0, kDTnull, kDTnull, kALdropdynamite_2w};
+cmd eatbanana_2w = {kVEat_2w, kRbanana_2w, kDTnocgen_2w, 0, 0, kDTnull, kDTnull, kALeatbanana_2w};
+cmd eatcatnip_2w = {kVEat_2w, kRcatnip_2w, kDTnocgen_2w, 0, 0, kDTnopurps_2w, kDTseatnip_2w, 0};
+cmd eatgarlic_2w = {kVEat_2w, kRgarlic_2w, kDTnocgen_2w, DONT_CARE, 0, kDTnull, kDTnull, kALgarlic_2w};
+cmd firegun_2w = {kVFire_2w, kRgun_2w, kDTnogun_2w, 0, 1, kDTsempty_2w, kDTnull, kALgun_2w};
+cmd gard1_2w = {kVTalk_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALtalkgard_2w};
+cmd gard2_2w = {kVLook_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALlookgard_2w};
+cmd getballoon_2w = {kVTake_2w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALballoon_2w};
+cmd getbook_2w = {kVTake_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALgetbook_2w};
+cmd getdynamite_2w = {kVTake_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALgetdynamite_2w};
+cmd getletter_2w = {kVTake_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsgetlet_2w, 0};
+cmd givebanana_2w = {kVGive_2w, kRbanana_2w, kDTnocgen_2w, 0, 0, kDTnull, kDTnull, kALbanana_2w};
+cmd givebell_2w = {kVGive_2w, kRbell_2w, kDTnocgen_2w, DONT_CARE, 0, kDTnull, kDTnull, kALgivebel_2w};
+cmd givecatnip_2w = {kVGive_2w, kRcatnip_2w, kDTnocgen_2w, 0, 0, kDTnopurps_2w, kDTscatnip_2w, 0};
+cmd intodumb_2w = {kVInto_2w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALdumb_2w};
+cmd knock_2w = {kVKnock_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsNobody_2w, 0};
+cmd lightdynamite_2w = {kVStrike_2w, kRmatch_2w, kDTnomatch_2w, DONT_CARE, 0, kDTnull, kDTnull, kALlightdynamite_2w};
+cmd lookcubp_2w = {kVLook_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALphoto_2w};
+cmd lookgarlic_2w = {kVLook_2w, 0, kDTnull, 0, 1, kDTempty_2w, kDTsFindClove_2w, kALgetgarlic_2w};
+cmd lookhole_2w = {kVLook_2w, 0, kDTnull, 0, 0, kDTsDarkHole_2w, kDTnull, kALkeyhole_2w};
+cmd lookkennel_2w = {kVLook_2w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALlookkennel_2w};
+cmd lookmat_2w = {kVLook_2w, 0, kDTnull, 0, 1, kDTempty_2w, kDTsFindMatch_2w, kALgetmatch_2w};
+cmd opencubp_2w = {kVOpen_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALphoto_2w};
+cmd opendoor1_2w = {kVOpen_2w, 0, kDTnull, 0, 1, kDTsopen1_2w, kDTnull, kALopendoor1_2w};
+cmd opendoor2_2w = {kVOpen_2w, 0, kDTnull, 0, 1, kDTsopen1_2w, kDTnull, kALopendoor2_2w};
+cmd opendoor3_2w = {kVOpen_2w, 0, kDTnull, 0, 1, kDTsopen1_2w, kDTnull, kALopendoor3_2w};
+cmd opendum_2w = {kVOpen_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsopendum_2w, 0};
+cmd opengarlic_2w = {kVOpen_2w, 0, kDTnull, 0, 1, kDTempty_2w, kDTsFindClove_2w, kALgetgarlic_2w};
+cmd openkdoor_2w = {kVOpen_2w, 0, kDTnull, 0, 0, kDTnull, kDTwontopen_2w, 0};
+cmd openlamp_2w = {kVOpen_2w, kRlamp_2w, kDTnocgen_2w, DONT_CARE, 0, kDTnull, kDTempty_2w, 0};
+cmd openmat_2w = {kVOpen_2w, 0, kDTnull, 0, 1, kDTempty_2w, kDTsFindMatch_2w, kALgetmatch_2w};
+cmd openpdoor_2w = {kVOpen_2w, 0, kDTnull, 0, 0, kDTnull, kDTspdoor_2w, 0};
+cmd opensafe_2w = {kVOpen_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALsafe_2w};
+cmd popballoon_2w = {kVBreak_2w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALballoon_2w};
+cmd pushblue_2w = {kVPush_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALworkgates_2w};
+cmd pushbutton_2w = {kVPush_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsWhichColor_2w, 0};
+cmd pushgreen_2w = {kVPush_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALbugzapper_2w};
+cmd pushpaper_2w = {kVPush_2w, kRpaper_2w, kDTnocgen_2w, 0, 1, kDTsnopaper_2w, kDTspaper_2w, kALpushpaper_2w};
+cmd pushpencil_2w = {kVPush_2w, kRpencil_2w, kDTnocgen_2w, 0, 0, kDTspencil_2w, kDTnull, kALpushpencil_2w};
+cmd pushred_2w = {kVPush_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALshedlight_2w};
+cmd pushyellow_2w = {kVPush_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALgatelight_2w};
+cmd readalbum_2w = {kVRead_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTtalbum_2w, 0};
+cmd readletter_2w = {kVRead_2w, 0, kDTnull, 3, 3, kDTsnoread_2w, kDTsread_2w, kALreadlet_2w};
+cmd readwill_2w = {kVRead_2w, kRwill_2w, kDTnocgen_2w, 1, 1, kDTnull, kDTnull, kALwill_2w};
+cmd ringbell_2w = {kVRing_2w, kRbell_2w, kDTnocgen_2w, DONT_CARE, 0, kDTnull, kDTnull, kALbell_2w};
+cmd rubcatnip_2w = {kVRub_2w, kRcatnip_2w, kDTnocgen_2w, 0, 0, kDTnopurps_2w, kDTnull, kALcatnip_2w};
+cmd rublamp_2w = {kVRub_2w, kRlamp_2w, kDTnocgen_2w, 0, 0, kDTnopurps_2w, kDTnull, kALlamp_2w};
+cmd serum_2w = {kVDrink_2w, kRserum_2w, kDTnocgen_2w, 0, 1, kDTsnoserum_2w, kDTnull, kALbottle_2w};
+cmd strikematch_2w = {kVStrike_2w, kRmatch_2w, kDTnocgen_2w, DONT_CARE, 0, kDTnull, kDTnull, kALstrikematch_2w};
+cmd takepaper_2w = {kVTake_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALtakepaper_2w};
+cmd takephone_2w = {kVTake_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALphone_2w};
+cmd talkharry_2w = {kVTalk_2w, 0, kDTnull, 0, 1, kDTsharry_2w, kDTnull, kALharry_2w};
+cmd throwstick_2w = {kVThrowit_2w, kRstick_2w, kDTnocgen_2w, 0, 1, kDTnull, kDTnull, kALthrowstick_2w};
+cmd unlock_2w = {kVUnlock_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsUnlocked_2w, 0};
+cmd unlockdum_2w = {kVUnlock_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsunlockdum_2w, 0};
+cmd usedynamite_2w = {kVMakeUseOf_2w, kRmatch_2w, kDTnomatch_2w, DONT_CARE, 0, kDTnull, kDTnull, kALlightdynamite_2w};
+cmd userobot_2w = {kVMakeUseOf_2w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, 0};
+
+cmd album_2w[] = {readalbum_2w, emptyCmd};
+cmd balloon_2w[] = {popballoon_2w, getballoon_2w, emptyCmd};
+cmd banana_2w[] = {givebanana_2w, eatbanana_2w, emptyCmd};
+cmd bell_2w[] = {ringbell_2w, givebell_2w, emptyCmd};
+cmd blue_2w[] = {pushblue_2w, emptyCmd};
+cmd book_2w[] = {getbook_2w, emptyCmd};
+cmd bottle_2w[] = {serum_2w, emptyCmd};
+cmd button_2w[] = {pushbutton_2w, emptyCmd};
+cmd catnip_2w[] = {rubcatnip_2w, givecatnip_2w, eatcatnip_2w, emptyCmd};
+cmd cupbp_2w[] = {opencubp_2w, lookcubp_2w, emptyCmd};
+cmd door1_2w[] = {opendoor1_2w, closedoor1_2w, knock_2w, unlock_2w, emptyCmd};
+cmd door2_2w[] = {opendoor2_2w, closedoor2_2w, knock_2w, unlock_2w, emptyCmd};
+cmd door3_2w[] = {opendoor3_2w, closedoor3_2w, knock_2w, unlock_2w, emptyCmd};
+cmd doordum_2w[] = {opendum_2w, unlockdum_2w, knock_2w, emptyCmd};
+cmd dumb_2w[] = {intodumb_2w, climbdumb_2w, emptyCmd};
+cmd dynamite_2w[] = {getdynamite_2w, dropdynamite_2w, lightdynamite_2w, emptyCmd};
+cmd garlic_2w[] = {eatgarlic_2w, emptyCmd};
+cmd green_2w[] = {pushgreen_2w, emptyCmd};
+cmd gun_2w[] = {firegun_2w, emptyCmd};
+cmd harry_2w[] = {talkharry_2w, emptyCmd};
+cmd kdoor_2w[] = {openkdoor_2w, emptyCmd};
+cmd kennel_2w[] = {lookkennel_2w, emptyCmd};
+cmd keyhole_2w[] = {lookhole_2w, emptyCmd};
+cmd lamp_2w[] = {rublamp_2w, openlamp_2w, emptyCmd};
+cmd letter_2w[] = {readletter_2w, getletter_2w, emptyCmd};
+cmd lookcupb_2w[] = {opengarlic_2w, lookgarlic_2w, emptyCmd};
+cmd lookdesk_2w[] = {openmat_2w, lookmat_2w, emptyCmd};
+cmd lookgard_2w[] = {gard1_2w, gard2_2w, emptyCmd};
+cmd matches_2w[] = {strikematch_2w, usedynamite_2w, emptyCmd};
+cmd paper_2w[] = {pushpaper_2w, takepaper_2w, emptyCmd};
+cmd pdoor_2w[] = {openpdoor_2w, emptyCmd};
+cmd pencil_2w[] = {doorpencil_2w, pushpencil_2w, emptyCmd};
+cmd red_2w[] = {pushred_2w, emptyCmd};
+cmd robot_2w[] = {userobot_2w, firegun_2w, emptyCmd};
+cmd rope_2w[] = {climbrope_2w, emptyCmd};
+cmd safe_2w[] = {opensafe_2w, closesafe_2w, emptyCmd};
+cmd stick_2w[] = {throwstick_2w, emptyCmd};
+cmd tardis_2w[] = {dialphone_2w, takephone_2w, emptyCmd};
+cmd well_2w[] = {climbwell_2w, emptyCmd};
+cmd will_2w[] = {readwill_2w, emptyCmd};
+cmd yellow_2w[] = {pushyellow_2w, emptyCmd};
+
+const cmd *cmdList_2w[] = {
+ cmdDummy, album_2w, balloon_2w, banana_2w, bell_2w,
+ blue_2w, book_2w, bottle_2w, button_2w, catnip_2w,
+ cupbp_2w, door1_2w, door2_2w, door3_2w, doordum_2w,
+ dumb_2w, dynamite_2w, garlic_2w, green_2w, gun_2w,
+ harry_2w, kdoor_2w, kennel_2w, keyhole_2w, lamp_2w,
+ letter_2w, lookcupb_2w, lookdesk_2w, lookgard_2w, matches_2w,
+ paper_2w, pdoor_2w, pencil_2w, red_2w, robot_2w,
+ rope_2w, safe_2w, stick_2w, tardis_2w, well_2w,
+ will_2w, yellow_2w
+};
+
+cmd bell_3w = {kVRing_3w, kRbell_3w, kDTnocgen_3w, DONT_CARE, 0, kDTnull, kDTokbell_3w, 0};
+cmd blow_3w = {kVBlow_3w, kRpipe_3w, kDTnogun_3w, DONT_CARE, 0, kDTnull, kDTnull, kALdart_3w};
+cmd blowdoc_3w = {kVShoot_3w, kRpipe_3w, kDTnogun_3w, DONT_CARE, 0, kDTnull, kDTsblowdoc_3w, 0};
+cmd book_3w = {kVRead_3w, kRbook_3w, kDTnocgen_3w, DONT_CARE, 0, kDTnull, kDTnull, kALreadbook_3w};
+cmd cage1_3w = {kVOpen_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALopencage_3w};
+cmd cage2_3w = {kVClose_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTokgen_3w, 0};
+cmd cage3_3w = {kVTake_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALtakecage_3w};
+cmd cageuse_3w = {kVMakeUseOf_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALusecage_3w};
+cmd candle1_3w = {kVStrike_3w, 0, kDTnull, 0, 1, kDTslit_3w, kDTokgen_3w, 0};
+cmd candle2_3w = {kVDouse_3w, 0, kDTnull, 1, 0, kDTsunlit_3w, kDTokgen_3w, 0};
+cmd cdoor1_3w = {kVOpen_3w, 0, kDTnull, 0, 0, kDTsopen1_3w, kDTnull, kALopendoor_3w};
+cmd cdoor2_3w = {kVClose_3w, 0, kDTnull, 1, 0, kDTsclose_3w, kDTokgen_3w, kALclosedoor_3w};
+cmd cdrinkpool_3w = {kVMakeUseOf_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTspool_3w, 0};
+cmd cdrinkstream_3w = {kVMakeUseOf_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsstream_3w, 0};
+cmd cexit1_3w = {kVOutof_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTokgen_3w, kALexit_3w};
+cmd cexit2_3w = {kVClimb_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTokgen_3w, kALexit_3w};
+cmd cflask1_3w = {kVFill_3w, 0, kDTnull, 0, 1, kDTsfull_3w, kDTnull, kALfill_3w};
+cmd cflask2_3w = {kVPut_3w, 0, kDTnull, 0, 1, kDTsfull_3w, kDTnull, kALfill_3w};
+cmd cflask3_3w = {kVEmpty_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALempty2_3w};
+cmd cflask4_3w = {kVDrink_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALdrink_3w};
+cmd cflask5_3w = {kVGive_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALflask_3w};
+cmd cheese1_3w = {kVEat_3w, kRcheese_3w, kDTnocgen_3w, 0, 0, kDTnull, kDTnull, kALeatcheese_3w};
+cmd cheese2_3w = {kVDrop_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALdropcheese_3w};
+cmd cheese3_3w = {kVPut_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALdropcheese_3w};
+cmd cheese4_3w = {kVTake_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALtakecheese_3w};
+cmd cmake1_3w = {kVMake_3w, 0, kDTnull, 0, 0, kDTsmade_3w, kDTnull, kALmakeclay_3w};
+cmd cmake2_3w = {kVStick_3w, kRpins_3w, kDTnopins_3w, DONT_CARE, 0, kDTnull, kDTnull, kALstick_3w};
+cmd cplane1_3w = {kVClimb_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTokgen_3w, kALplane_3w};
+cmd cplane2_3w = {kVInto_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTokgen_3w, kALplane_3w};
+cmd cplane3_3w = {kVSearch_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTokgen_3w, kALplane_3w};
+cmd crystal_3w = {kVRub_3w, kRcrystal_3w, kDTnocgen_3w, DONT_CARE, 0, kDTnull, kDTnull, kALcrystal_3w};
+cmd csteps1_3w = {kVMakeUseOf_3w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALsteps_3w};
+cmd cstick1_3w = {kVStick_3w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALstick_3w};
+cmd cswing1_3w = {kVSwing_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTswinger_3w, kALswing_3w};
+cmd ctalknat_3w = {kVTalk_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALtalknat_3w};
+cmd cube1_3w = {kVGive_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALgiveb_3w};
+cmd cvine1_3w = {kVMakeUseOf_3w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALvine_3w};
+cmd cvine2_3w = {kVUntie_3w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALuntie_vine_3w};
+cmd cvine3_3w = {kVTie_3w, 0, kDTnull, 0, 0, kDTnull, kDTnull, kALvine_3w};
+cmd cwaterfall_3w = {kVLook_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALlookwfall_3w};
+cmd cwaterpool_3w = {kVLook_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTswater_3w, 0};
+cmd cwaterstream_3w = {kVLook_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTswater_3w, 0};
+cmd dart_3w = {kVShoot_3w, kRpipe_3w, kDTnogun_3w, DONT_CARE, 0, kDTnull, kDTnull, kALdart_3w};
+cmd elephant_3w = {kVMakeUseOf_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTuelephant_3w, 0};
+cmd ghost1_3w = {kVMakeUseOf_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTughost_3w, 0};
+cmd ghost2_3w = {kVExorcise_3w, kRexor_3w, kDTnocex_3w, DONT_CARE, 0, kDTnull, kDTnull, kALexorcise_3w};
+cmd knock_3w = {kVKnock_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsNobody_3w, 0};
+cmd lookrush_3w = {kVBehind_3w, 0, kDTnull, 0, 1, kDTsfoundb_3w, kDTnull, kALfindbook_3w};
+cmd readit_3w = {kVRead_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsread_3w, 0};
+cmd rock1_3w = {kVBehind_3w, 0, kDTnull, 0, 1, kDTsfoundc_3w, kDTsfindc_3w, kALfindcrystal_3w};
+cmd swingc_3w = {kVSwing_3w, 0, kDTnull, 0, 1, kDTsnoswing_3w, kDTswingcave_3w, 0};
+cmd unlock_3w = {kVUnlock_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTsUnlocked_3w, 0};
+cmd usedoc_3w = {kVMakeUseOf_3w, 0, kDTnull, DONT_CARE, 0, kDTnull, kDTnull, kALtalkdoc_3w};
+
+cmd cbell_3w[] = {bell_3w, emptyCmd};
+cmd cbook_3w[] = {book_3w, emptyCmd};
+cmd cbouillon_3w[] = {cube1_3w, emptyCmd};
+cmd ccage_3w[] = {cageuse_3w, cage1_3w, cage2_3w, cage3_3w, emptyCmd};
+cmd ccandle_3w[] = {candle1_3w, candle2_3w, emptyCmd};
+cmd ccheese_3w[] = {cheese1_3w, cheese2_3w, cheese3_3w, cheese4_3w, emptyCmd};
+cmd cclay_3w[] = {cmake1_3w, cmake2_3w, emptyCmd};
+cmd ccrystal_3w[] = {crystal_3w, emptyCmd};
+cmd cdart_3w[] = {dart_3w, blow_3w, emptyCmd};
+cmd cdoctor_3w[] = {usedoc_3w, blowdoc_3w, emptyCmd};
+cmd cdoor_3w[] = {cdoor1_3w, cdoor2_3w, emptyCmd};
+cmd celephant_3w[] = {elephant_3w, dart_3w, blow_3w, emptyCmd};
+cmd cexit_3w[] = {cexit1_3w, cexit2_3w, emptyCmd};
+cmd cflask_3w[] = {cflask1_3w, cflask2_3w, cflask3_3w, cflask4_3w, cflask5_3w, emptyCmd};
+cmd cghost_3w[] = {ghost1_3w, ghost2_3w, emptyCmd};
+cmd cnative_3w[] = {ctalknat_3w, emptyCmd};
+cmd cpins_3w[] = {cstick1_3w, emptyCmd};
+cmd cplane_3w[] = {cplane1_3w, cplane2_3w, cplane3_3w, emptyCmd};
+cmd crock_3w[] = {rock1_3w, emptyCmd};
+cmd crush_3w[] = {lookrush_3w, emptyCmd};
+cmd cscroll_3w[] = {readit_3w, emptyCmd};
+cmd csteps_3w[] = {csteps1_3w, emptyCmd};
+cmd cswing_3w[] = {cswing1_3w, emptyCmd};
+cmd cswingc_3w[] = {swingc_3w, emptyCmd};
+cmd cvine_3w[] = {cvine1_3w, cvine2_3w, cvine3_3w, emptyCmd};
+cmd cwfall_3w[] = {cwaterfall_3w, emptyCmd};
+cmd cwpool_3w[] = {cdrinkpool_3w, cwaterpool_3w, emptyCmd};
+cmd cwstream_3w[] = {cdrinkstream_3w, cwaterstream_3w, emptyCmd};
+
+const cmd *cmdList_3w[] = {
+ cmdDummy, cbell_3w, cbook_3w, cbouillon_3w, ccage_3w,
+ ccandle_3w, ccheese_3w, cclay_3w, ccrystal_3w, cdart_3w,
+ cdoctor_3w, cdoor_3w, celephant_3w, cexit_3w, cflask_3w,
+ cghost_3w, cnative_3w, cpins_3w, cplane_3w, crock_3w,
+ crush_3w, cscroll_3w, csteps_3w, cswing_3w, cswingc_3w,
+ cvine_3w, cwfall_3w, cwpool_3w, cwstream_3w
+};
+
+cmd blowdw_1d = {kVBlow_1d, 0, 0, 0, 0, 0, kDTokgen_1d, kALblowdw_1d};
+cmd breakpkin_1d = {kVBreak_1d, 0, 0, 0, 1, 0, kDTokgen_1d, kALpkin_1d};
+cmd brkrope_1d = {kVBreak_1d, 0, 0, DONT_CARE, 0, 0, kDTsrbreak_1d, 0};
+cmd closebolt_1d = {kVClose_1d, 0, 0, 2, 1, kDTsclose_1d, kDTokgen_1d, 0};
+cmd closedoor1_1d = {kVClose_1d, 0, 0, 2, 0, kDTsclose_1d, 0, kALclosedoor1_1d};
+cmd closedoor2_1d = {kVClose_1d, 0, 0, 1, 0, kDTsclose_1d, 0, 0};
+cmd closedoor3_1d = {kVClose_1d, 0, 0, 1, 0, kDTsclose_1d, 0, 0};
+cmd closedoor4_1d = {kVClose_1d, 0, 0, 1, 0, kDTsclose_1d, 0, kALclosedoor4_1d};
+cmd closetrap_1d = {kVClose_1d, 0, 0, 1, 0, kDTsclose_1d, kDTokgen_1d, kALclosetrap_1d};
+cmd closewdoors_1d = {kVClose_1d, 0, 0, 1, 0, kDTsclose_1d, 0, kALclosewdoors_1d};
+cmd cutrope_1d = {kVCut_1d, kRknife_1d, kDTrnoknife_1d, 0, 1, kDTsnocut_1d, kDTscut_1d, kALcutrope_1d};
+cmd dropmask_1d = {kVDrop_1d, 0, 0, 0, 0, kDTsworn3_1d, 0, kALdropmask_1d};
+cmd droppkin_1d = {kVDrop_1d, kRpkin_1d, kDTnocgen_1d, 0, 1, 0, 0, kALpkin_1d};
+cmd eatchop_1d = {kVEat_1d, 0, 0, 0, 0, 0, 0, kALeatchop_1d};
+cmd getdw_1d = {kVTake_1d, 0, 0, 0, 0, 0, 0, kALcupbdw_1d};
+cmd getinboat_1d = {kVInto_1d, 0, 0, DONT_CARE, 0, 0, 0, kALgetinboat_1d};
+cmd getknife_1d = {kVTake_1d, 0, 0, 0, 0, 0, 0, kALcupbpk_1d};
+cmd getoilcan_1d = {kVTake_1d, 0, 0, 0, 0, 0, 0, kALshedoil_1d};
+cmd getoutboat_1d = {kVOutof_1d, 0, 0, DONT_CARE, 0, 0, 0, kALgetoutboat_1d};
+cmd givegold_1d = {kVGive_1d, 0, 0, 0, 0, 0, 0, kALgold_1d};
+cmd kickpkin_1d = {kVAttack_1d, 0, 0, 0, 1, 0, kDTokgen_1d, kALpkin_1d};
+cmd knock_1d = {kVKnock_1d, 0, 0, DONT_CARE, 0, 0, kDTsknock_1d, 0};
+cmd lockbolt_1d = {kVLock_1d, 0, 0, 2, 1, kDTsclose_1d, kDTokgen_1d, 0};
+cmd lockdoor_1d = {kVLock_1d, kRkey_1d, kDTnockey_1d, 2, 0, kDTslock_1d, kDTokgen_1d, 0};
+cmd lookcupb_1d = {kVLook_1d, kRcandle_1d, kDTnoccandle_1d, DONT_CARE, 0, 0, 0, kALlookcupb_1d};
+cmd lookshed_1d = {kVLook_1d, kRcandle_1d, kDTnoccandle_1d, 0, 0, kDTsnosee_1d, kDTsseeoil_1d, 0};
+cmd movecarp1_1d = {kVMove_1d, 0, 0, 0, 0, 0, kDTokgen_1d, kALmovecarp_1d};
+cmd movecarp2_1d = {kVLift_1d, 0, 0, 0, 0, 0, kDTokgen_1d, kALmovecarp_1d};
+cmd movecarp3_1d = {kVUnder_1d, 0, 0, 0, 0, 0, kDTokgen_1d, kALmovecarp_1d};
+cmd offmask_1d = {kVOff_1d, 0, 0, 1, 0, kDTsworn2_1d, kDTokgen_1d, kALswapmask_1d};
+cmd oilbolt_1d = {kVOil_1d, kRoil_1d, kDTrnooil_1d, 0, 1, kDTsoiled_1d, kDTokgen_1d, 0};
+cmd omattack_1d = {kVAttack_1d, 0, 0, 0, 0, 0, kDTsomattack_1d, 0};
+cmd ombreak_1d = {kVBreak_1d, 0, 0, 0, 0, 0, kDTsomattack_1d, 0};
+cmd omtalk_1d = {kVTalk_1d, 0, 0, DONT_CARE, 0, 0, 0, kALoldman_1d};
+cmd openbolt_1d = {kVOpen_1d, 0, 0, 1, 2, kDTsstuck_1d, kDTokgen_1d, 0};
+cmd opendoor1_1d = {kVOpen_1d, 0, 0, 1, 2, kDTsopen_1d, 0, kALopendoor1_1d};
+cmd opendoor2_1d = {kVOpen_1d, 0, 0, 0, 1, kDTsopen2_1d, 0, kALopendoor2_1d};
+cmd opendoor3_1d = {kVOpen_1d, 0, 0, 0, 1, kDTsopen2_1d, 0, kALopendoor3_1d};
+cmd opendoor4_1d = {kVOpen_1d, 0, 0, 0, 0, kDTsopen2_1d, 0, kALopendoor4_1d};
+cmd openpkin_1d = {kVOpen_1d, 0, 0, 0, 1, 0, kDTokgen_1d, kALpkin_1d};
+cmd opentrap_1d = {kVOpen_1d, 0, 0, 0, 0, 0, 0, kALopentrap_1d};
+cmd openwdoors_1d = {kVOpen_1d, 0, 0, 0, 1, kDTsopen2_1d, 0, kALopenwdoors_1d};
+cmd plugbung_1d = {kVPlug_1d, kRbung_1d, kDTnocgen_1d, 0, 1, 0, kDTokgen_1d, kALplugbung_1d};
+cmd pushboat_1d = {kVPush_1d, 0, 0, DONT_CARE, 0, 0, 0, kALpushboat_1d};
+cmd pushigor_1d = {kVPush_1d, 0, 0, 0, 0, 0, 0, kALigor_1d};
+cmd ruboilcan_1d = {kVRub_1d, 0, 0, 0, 0, 0, kDTsruboil_1d, 0};
+cmd throwchop_1d = {kVThrow_1d, 0, 0, 0, 0, 0, 0, kALthrowchop_1d};
+cmd unlkdoor_1d = {kVUnlock_1d, kRkey_1d, kDTnockey_1d, 0, 1, kDTsunlock_1d, kDTokgen_1d, 0};
+cmd unlock_1d = {kVUnlock_1d, 0, 0, DONT_CARE, 0, 0, kDTsunlock_1d, 0};
+cmd unlockbolt_1d = {kVUnlock_1d, 0, 0, 1, 2, kDTsstuck_1d, kDTokgen_1d, 0};
+cmd untierope_1d = {kVUntie_1d, 0, 0, DONT_CARE, 0, 0, kDTsuntie_1d, 0};
+cmd wearmask_1d = {kVWear_1d, kRmask_1d, kDTnocgen_1d, 0, 1, kDTsworn1_1d, kDTokgen_1d, kALswapmask_1d};
+
+cmd boat_1d[] = {getinboat_1d, getoutboat_1d, pushboat_1d, emptyCmd};
+cmd bolt_1d[] = {oilbolt_1d, openbolt_1d, unlockbolt_1d, closebolt_1d, lockbolt_1d, emptyCmd};
+cmd bung_1d[] = {plugbung_1d, emptyCmd};
+cmd carpet_1d[] = {movecarp1_1d, movecarp2_1d, movecarp3_1d, emptyCmd};
+cmd chop_1d[] = {eatchop_1d, throwchop_1d, emptyCmd};
+cmd cupb_1d[] = {lookcupb_1d, emptyCmd};
+cmd door1_1d[] = {lockdoor_1d, unlkdoor_1d, opendoor1_1d, closedoor1_1d, knock_1d, emptyCmd};
+cmd door2_1d[] = {opendoor2_1d, closedoor2_1d, knock_1d, unlock_1d, emptyCmd};
+cmd door3_1d[] = {opendoor3_1d, closedoor3_1d, knock_1d, unlock_1d, emptyCmd};
+cmd door4_1d[] = {opendoor4_1d, closedoor4_1d, knock_1d, emptyCmd};
+cmd gold_1d[] = {givegold_1d, emptyCmd};
+cmd igor_1d[] = {pushigor_1d, emptyCmd};
+cmd knife_1d[] = {getknife_1d, emptyCmd};
+cmd mask_1d[] = {wearmask_1d, offmask_1d, dropmask_1d, emptyCmd};
+cmd oilcan_1d[] = {getoilcan_1d, ruboilcan_1d, emptyCmd};
+cmd oldman_1d[] = {omattack_1d, ombreak_1d, omtalk_1d, emptyCmd};
+cmd pkin_1d[] = {kickpkin_1d, breakpkin_1d, openpkin_1d, droppkin_1d, emptyCmd};
+cmd rope_1d[] = {cutrope_1d, untierope_1d, brkrope_1d, emptyCmd};
+cmd shed_1d[] = {lookshed_1d, emptyCmd};
+cmd trap_1d[] = {opentrap_1d, closetrap_1d, knock_1d, emptyCmd};
+cmd ward_1d[] = {openwdoors_1d, closewdoors_1d, knock_1d, emptyCmd};
+cmd whistle_1d[] = {getdw_1d, blowdw_1d, emptyCmd};
+
+const cmd *cmdList_1d[] = {
+ cmdDummy,
+ boat_1d, bolt_1d, bung_1d, carpet_1d, chop_1d,
+ cupb_1d, door1_1d, door2_1d, door3_1d, door4_1d,
+ gold_1d, igor_1d, knife_1d, mask_1d, oilcan_1d,
+ oldman_1d, pkin_1d, rope_1d, shed_1d, trap_1d,
+ ward_1d, whistle_1d
+};
+
+cmd climbdumb_2d = {kVClimb_2d, 0, 0, 0, 0, 0, 0, kALdumb_2d};
+cmd climbrope_2d = {kVClimb_2d, 0, 0, DONT_CARE, 0, 0, 0, kALclimbrope_2d};
+cmd climbwell_2d = {kVClimb_2d, 0, 0, DONT_CARE, 0, 0, 0, kALclimbwell_2d};
+cmd closedoor1_2d = {kVClose_2d, 0, 0, 1, 0, kDTsclose_2d, 0, 0};
+cmd closedoor2_2d = {kVClose_2d, 0, 0, 1, 0, kDTsclose_2d, 0, 0};
+cmd closedoor3_2d = {kVClose_2d, 0, 0, 1, 0, kDTsclose_2d, 0, 0};
+cmd closesafe_2d = {kVClose_2d, 0, 0, 1, 0, kDTsclose_2d, kDTokgen_2d, 0};
+cmd dialphone_2d = {kVDial_2d, 0, 0, 1, 1, kDTsdialed_2d, 0, kALphone_2d};
+cmd dropdynamite_2d = {kVDrop_2d, kRdyn_2d, kDTnocgen_2d, DONT_CARE, 0, 0, 0, kALdropdynamite_2d};
+cmd eatbanana_2d = {kVEat_2d, kRbanana_2d, kDTnocgen_2d, 0, 0, 0, 0, kALeatbanana_2d};
+cmd eatgarlic_2d = {kVEat_2d, kRgarlic_2d, kDTnocgen_2d, DONT_CARE, 0, 0, 0, kALgarlic_2d};
+cmd firegun_2d = {kVFire_2d, kRgun_2d, kDTnogun_2d, 0, 1, kDTsempty_2d, 0, kALgun_2d};
+cmd getballoon_2d = {kVTake_2d, 0, 0, 0, 0, 0, 0, kALballoon_2d};
+cmd getbook_2d = {kVTake_2d, 0, 0, DONT_CARE, 0, 0, 0, kALgetbook_2d};
+cmd getdynamite_2d = {kVTake_2d, 0, 0, DONT_CARE, 0, 0, 0, kALgetdynamite_2d};
+cmd getletter_2d = {kVTake_2d, 0, 0, DONT_CARE, 0, kDTsgetlet_2d, 0, 0};
+cmd givebanana_2d = {kVGive_2d, kRbanana_2d, kDTnocgen_2d, 0, 0, 0, 0, kALbanana_2d};
+cmd givebell_2d = {kVGive_2d, kRbell_2d, kDTnocgen_2d, DONT_CARE, 0, 0, 0, kALgivebel_2d};
+cmd givecatnip_2d = {kVGive_2d, kRcatnip_2d, kDTnocgen_2d, 0, 0, kDTnopurps_2d, kDTscatnip_2d, 0};
+cmd intodumb_2d = {kVInto_2d, 0, 0, 0, 0, 0, 0, kALdumb_2d};
+cmd knock_2d = {kVKnock_2d, 0, 0, DONT_CARE, 0, 0, kDTtnoknock_2d, 0};
+cmd lightdynamite_2d = {kVStrike_2d, kRmatch_2d, kDTnomatch_2d, DONT_CARE, 0, 0, 0, kALlightdynamite_2d};
+cmd lookcubp_2d = {kVLook_2d, 0, 0, DONT_CARE, 0, 0, 0, kALphoto_2d};
+cmd lookgarlic_2d = {kVLook_2d, 0, 0, 0, 1, kDTempty_2d, kDTfindclove_2d, kALgetgarlic_2d};
+cmd lookhole_2d = {kVLook_2d, 0, 0, 0, 0, kDTdarkhole_2d, 0, kALkeyhole_2d};
+cmd lookkennel_2d = {kVLook_2d, 0, 0, 0, 0, 0, 0, kALlookkennel_2d};
+cmd lookmat_2d = {kVLook_2d, 0, 0, 0, 1, kDTempty_2d, kDTfindmatch_2d, kALgetmatch_2d};
+cmd lookmatch_2d = {kVLook_2d, 0, 0, DONT_CARE, 0, 0, 0, kALlookmatch_2d};
+cmd opencubp_2d = {kVOpen_2d, 0, 0, DONT_CARE, 0, 0, 0, kALphoto_2d};
+cmd opendoor1_2d = {kVOpen_2d, 0, 0, 0, 1, kDTsopen1_2d, 0, kALopendoor1_2d};
+cmd opendoor2_2d = {kVOpen_2d, 0, 0, 0, 1, kDTsopen1_2d, 0, kALopendoor2_2d};
+cmd opendoor3_2d = {kVOpen_2d, 0, 0, 0, 1, kDTsopen1_2d, 0, kALopendoor3_2d};
+cmd opengarlic_2d = {kVOpen_2d, 0, 0, 0, 1, kDTempty_2d, kDTfindclove_2d, kALgetgarlic_2d};
+cmd openkdoor_2d = {kVOpen_2d, 0, 0, 0, 0, 0, kDTwontopen_2d, 0};
+cmd openlamp_2d = {kVOpen_2d, kRlamp_2d, kDTnocgen_2d, DONT_CARE, 0, 0, kDTempty_2d, 0};
+cmd openmat_2d = {kVOpen_2d, 0, 0, 0, 1, kDTempty_2d, kDTfindmatch_2d, kALgetmatch_2d};
+cmd openpdoor_2d = {kVOpen_2d, 0, 0, 0, 0, 0, kDTspdoor_2d, 0};
+cmd opensafe_2d = {kVOpen_2d, 0, 0, DONT_CARE, 0, 0, 0, kALsafe_2d};
+cmd popballoon_2d = {kVBreak_2d, 0, 0, 0, 0, 0, 0, kALballoon_2d};
+cmd pushblue_2d = {kVPush_2d, 0, 0, DONT_CARE, 0, 0, 0, kALworkgates_2d};
+cmd pushbutton_2d = {kVPush_2d, 0, 0, DONT_CARE, 0, 0, kDTtnopushbutton_2d, 0};
+cmd pushgreen_2d = {kVPush_2d, 0, 0, DONT_CARE, 0, 0, 0, kALbugzapper_2d};
+cmd pushpaper_2d = {kVPush_2d, kRpaper_2d, kDTnocgen_2d, 0, 1, 0, kDTokgen_2d, kALpushpaper_2d};
+cmd pushpencil_2d = {kVPush_2d, kRpencil_2d, kDTnocgen_2d, 0, 0, 0, 0, kALpushpencil_2d};
+cmd pushred_2d = {kVPush_2d, 0, 0, DONT_CARE, 0, 0, 0, kALshedlight_2d};
+cmd pushyellow_2d = {kVPush_2d, 0, 0, DONT_CARE, 0, 0, 0, kALgatelight_2d};
+cmd readletter_2d = {kVRead_2d, 0, 0, 3, 3, kDTsnoread_2d, kDTsread_2d, kALreadlet_2d};
+cmd readwill_2d = {kVRead_2d, kRwill_2d, kDTnocgen_2d, 1, 1, 0, 0, kALwill_2d};
+cmd ringbell_2d = {kVRing_2d, kRbell_2d, kDTnocgen_2d, DONT_CARE, 0, 0, 0, kALbell_2d};
+cmd rubcatnip_2d = {kVRub_2d, kRcatnip_2d, kDTnocgen_2d, 0, 0, kDTnopurps_2d, 0, kALcatnip_2d};
+cmd rublamp_2d = {kVRub_2d, kRlamp_2d, kDTnocgen_2d, 0, 0, kDTnopurps_2d, 0, kALlamp_2d};
+cmd serum_2d = {kVDrink_2d, kRserum_2d, kDTnocgen_2d, 0, 1, kDTsnosee_2d, 0, kALbottle_2d};
+cmd strikematch_2d = {kVStrike_2d, kRmatch_2d, kDTnocgen_2d, DONT_CARE, 0, 0, 0, kALstrikematch_2d};
+cmd talkharry_2d = {kVTalk_2d, 0, 0, 0, 1, kDTsharry_2d, 0, kALharry_2d};
+cmd throwstick_2d = {kVThrow_2d, kRstick_2d, kDTnocgen_2d, 0, 1, 0, 0, kALthrowstick_2d};
+cmd unlock_2d = {kVUnlock_2d, 0, 0, DONT_CARE, 0, 0, kDTtnounlock_2d, 0};
+
+cmd balloon_2d[] = {popballoon_2d, getballoon_2d, emptyCmd};
+cmd banana_2d[] = {givebanana_2d, eatbanana_2d, emptyCmd};
+cmd bell_2d[] = {ringbell_2d, givebell_2d, emptyCmd};
+cmd blue_2d[] = {pushblue_2d, emptyCmd};
+cmd book_2d[] = {getbook_2d, emptyCmd};
+cmd bottle_2d[] = {serum_2d, emptyCmd};
+cmd button_2d[] = {pushbutton_2d, emptyCmd};
+cmd catnip_2d[] = {rubcatnip_2d, givecatnip_2d, emptyCmd};
+cmd cupbp_2d[] = {opencubp_2d, lookcubp_2d, emptyCmd};
+cmd door1_2d[] = {opendoor1_2d, closedoor1_2d, knock_2d, unlock_2d, emptyCmd};
+cmd door2_2d[] = {opendoor2_2d, closedoor2_2d, knock_2d, unlock_2d, emptyCmd};
+cmd door3_2d[] = {opendoor3_2d, closedoor3_2d, knock_2d, unlock_2d, emptyCmd};
+cmd dumb_2d[] = {intodumb_2d, climbdumb_2d, emptyCmd};
+cmd dynamite_2d[] = {getdynamite_2d, dropdynamite_2d, lightdynamite_2d, emptyCmd};
+cmd garlic_2d[] = {eatgarlic_2d, emptyCmd};
+cmd green_2d[] = {pushgreen_2d, emptyCmd};
+cmd gun_2d[] = {firegun_2d, emptyCmd};
+cmd harry_2d[] = {talkharry_2d, emptyCmd};
+cmd kdoor_2d[] = {openkdoor_2d, emptyCmd};
+cmd kennel_2d[] = {lookkennel_2d, emptyCmd};
+cmd keyhole_2d[] = {lookhole_2d, emptyCmd};
+cmd lamp_2d[] = {rublamp_2d, openlamp_2d, emptyCmd};
+cmd letter_2d[] = {getletter_2d, readletter_2d, emptyCmd};
+cmd lookcupb_2d[] = {opengarlic_2d, lookgarlic_2d, emptyCmd};
+cmd lookdesk_2d[] = {openmat_2d, lookmat_2d, emptyCmd};
+cmd matches_2d[] = {lookmatch_2d, strikematch_2d, emptyCmd};
+cmd paper_2d[] = {pushpaper_2d, emptyCmd};
+cmd pdoor_2d[] = {openpdoor_2d, emptyCmd};
+cmd pencil_2d[] = {pushpencil_2d, emptyCmd};
+cmd red_2d[] = {pushred_2d, emptyCmd};
+cmd rope_2d[] = {climbrope_2d, emptyCmd};
+cmd safe_2d[] = {opensafe_2d, closesafe_2d, emptyCmd};
+cmd stick_2d[] = {throwstick_2d, emptyCmd};
+cmd tardis_2d[] = {dialphone_2d, emptyCmd};
+cmd well_2d[] = {climbwell_2d, emptyCmd};
+cmd will_2d[] = {readwill_2d, emptyCmd};
+cmd yellow_2d[] = {pushyellow_2d, emptyCmd};
+
+const cmd *cmdList_2d[] = {
+ cmdDummy, balloon_2d, banana_2d, bell_2d, blue_2d,
+ book_2d, bottle_2d, button_2d, catnip_2d, cupbp_2d,
+ door1_2d, door2_2d, door3_2d, dumb_2d, dynamite_2d,
+ garlic_2d, green_2d, gun_2d, harry_2d, kdoor_2d,
+ kennel_2d, keyhole_2d, lamp_2d, letter_2d, lookcupb_2d,
+ lookdesk_2d, matches_2d, paper_2d, pdoor_2d, pencil_2d,
+ red_2d, rope_2d, safe_2d, stick_2d, tardis_2d,
+ well_2d, will_2d, yellow_2d
+};
+
+cmd bell_3d = {kVRing_3d, kRbell_3d, kDTnocgen_3d, DONT_CARE, 0, 0, kDTokbell_3d, 0};
+cmd blow_3d = {kVBlow_3d, 0, 0, DONT_CARE, 0, 0, 0, kALdart_3d};
+cmd book_3d = {kVRead_3d, kRbook_3d, kDTnocgen_3d, DONT_CARE, 0, 0, 0, kALreadbook_3d};
+cmd cage1_3d = {kVOpen_3d, 0, 0, DONT_CARE, 0, 0, 0, kALopencage_3d};
+cmd cage2_3d = {kVClose_3d, 0, 0, DONT_CARE, 0, 0, kDTokgen_3d, 0};
+cmd cage3_3d = {kVTake_3d, 0, 0, DONT_CARE, 0, 0, 0, kALtakecage_3d};
+cmd candle1_3d = {kVDouse_3d, 0, 0, 1, 0, kDTsunlit_3d, kDTokgen_3d, 0};
+cmd candle2_3d = {kVStrike_3d, 0, 0, 0, 1, kDTslit_3d, kDTokgen_3d, 0};
+cmd cdoor1_3d = {kVOpen_3d, 0, 0, 0, 0, kDTsopen1_3d, 0, kALopendoor_3d};
+cmd cdoor2_3d = {kVClose_3d, 0, 0, 1, 0, kDTsclose_3d, kDTokgen_3d, kALclosedoor_3d};
+cmd cexit1_3d = {kVOutof_3d, 0, 0, DONT_CARE, 0, 0, kDTokgen_3d, kALexit_3d};
+cmd cexit2_3d = {kVClimb_3d, 0, 0, DONT_CARE, 0, 0, kDTokgen_3d, kALexit_3d};
+cmd cflask1_3d = {kVFill_3d, 0, 0, 0, 1, kDTsfull_3d, 0, kALfill_3d};
+cmd cflask2_3d = {kVPut_3d, 0, 0, 0, 1, kDTsfull_3d, 0, kALfill_3d};
+cmd cflask3_3d = {kVEmpty_3d, 0, 0, DONT_CARE, 0, 0, 0, kALempty_3d};
+cmd cflask4_3d = {kVDrink_3d, 0, 0, DONT_CARE, 0, 0, 0, kALdrink_3d};
+cmd cflask5_3d = {kVGive_3d, 0, 0, DONT_CARE, 0, 0, 0, kALflask_3d};
+cmd cheese1_3d = {kVEat_3d, kRcheese_3d, kDTnocgen_3d, 0, 0, 0, 0, kALeatcheese_3d};
+cmd cheese2_3d = {kVDrop_3d, 0, 0, DONT_CARE, 0, 0, 0, kALdropcheese_3d};
+cmd cheese3_3d = {kVPut_3d, 0, 0, DONT_CARE, 0, 0, 0, kALdropcheese_3d};
+cmd cheese4_3d = {kVTake_3d, 0, 0, DONT_CARE, 0, 0, 0, kALtakecheese_3d};
+cmd cmake1_3d = {kVMake_3d, 0, 0, 0, 0, kDTsmade_3d, 0, kALmakeclay_3d};
+cmd cmake2_3d = {kVStick_3d, kRpins_3d, kDTnopins_3d, DONT_CARE, 0, 0, 0, kALstick_3d};
+cmd cplane1_3d = {kVClimb_3d, 0, 0, DONT_CARE, 0, 0, kDTokgen_3d, kALplane_3d};
+cmd cplane2_3d = {kVInto_3d, 0, 0, DONT_CARE, 0, 0, kDTokgen_3d, kALplane_3d};
+cmd cplane3_3d = {kVSearch_3d, 0, 0, DONT_CARE, 0, 0, kDTokgen_3d, kALplane_3d};
+cmd crystal_3d = {kVRub_3d, kRcrystal_3d, kDTnocgen_3d, DONT_CARE, 0, 0, 0, kALcrystal_3d};
+cmd cstick1_3d = {kVStick_3d, 0, 0, 0, 0, 0, 0, kALstick_3d};
+cmd cswing1_3d = {kVSwing_3d, 0, 0, DONT_CARE, 0, 0, kDTokgen_3d, kALswing_3d};
+cmd ctalknat_3d = {kVTalk_3d, 0, 0, DONT_CARE, 0, 0, 0, kALtalknat_3d};
+cmd cube1_3d = {kVGive_3d, 0, 0, DONT_CARE, 0, 0, 0, kALgiveb_3d};
+cmd cvine1_3d = {kVUntie_3d, 0, 0, 0, 0, 0, 0, kALuntie_vine_3d};
+cmd cvine2_3d = {kVTie_3d, 0, 0, 0, 0, 0, 0, kALvine_3d};
+cmd cwaterfall_3d = {kVLook_3d, 0, 0, DONT_CARE, 0, 0, 0, kALlookwfall_3d};
+cmd cwaterpool_3d = {kVLook_3d, 0, 0, DONT_CARE, 0, 0, kDTdull_3d, 0};
+cmd cwaterstream_3d = {kVLook_3d, 0, 0, DONT_CARE, 0, 0, kDTdull_3d, 0};
+cmd dart_3d = {kVShoot_3d, 0, 0, DONT_CARE, 0, 0, 0, kALdart_3d};
+cmd ghost_3d = {kVExorcise_3d, kRexor_3d, kDTnocex_3d, DONT_CARE, 0, 0, 0, kALexorcise_3d};
+cmd knock_3d = {kVKnock_3d, 0, 0, DONT_CARE, 0, 0, kDTsNobody_3d, 0};
+cmd readit_3d = {kVRead_3d, 0, 0, DONT_CARE, 0, 0, kDTsread_3d, 0};
+cmd rock1_3d = {kVBehind_3d, 0, 0, 0, 1, kDTsfoundc_3d, kDTsfindc_3d, kALfindcrystal_3d};
+cmd swingc_3d = {kVSwing_3d, 0, 0, DONT_CARE, 0, 0, kDTswingcave_3d, 0};
+cmd unlock_3d = {kVUnlock_3d, 0, 0, DONT_CARE, 0, 0, kDTsUnlocked_3d, 0};
+
+cmd cbell_3d[] = {bell_3d, emptyCmd};
+cmd cbook_3d[] = {book_3d, emptyCmd};
+cmd cbouillon_3d[] = {cube1_3d, emptyCmd};
+cmd ccage_3d[] = {cage1_3d, cage2_3d, cage3_3d, emptyCmd};
+cmd ccandle_3d[] = {candle1_3d, candle2_3d, emptyCmd};
+cmd ccheese_3d[] = {cheese1_3d, cheese2_3d, cheese3_3d, cheese4_3d, emptyCmd};
+cmd cclay_3d[] = {cmake1_3d, cmake2_3d, emptyCmd};
+cmd ccrystal_3d[] = {crystal_3d, emptyCmd};
+cmd cdart_3d[] = {dart_3d, blow_3d, emptyCmd};
+cmd cdoor_3d[] = {cdoor1_3d, cdoor2_3d, emptyCmd};
+cmd cexit_3d[] = {cexit1_3d, cexit2_3d, emptyCmd};
+cmd cflask_3d[] = {cflask1_3d, cflask2_3d, cflask3_3d, cflask4_3d, cflask5_3d, emptyCmd};
+cmd cghost_3d[] = {ghost_3d, emptyCmd};
+cmd cnative_3d[] = {ctalknat_3d, emptyCmd};
+cmd cpins_3d[] = {cstick1_3d, emptyCmd};
+cmd cplane_3d[] = {cplane1_3d, cplane2_3d, cplane3_3d, emptyCmd};
+cmd crock_3d[] = {rock1_3d, emptyCmd};
+cmd cscroll_3d[] = {readit_3d, emptyCmd};
+cmd cswing_3d[] = {cswing1_3d, emptyCmd};
+cmd cswingc_3d[] = {swingc_3d, emptyCmd};
+cmd cvine_3d[] = {cvine1_3d, cvine2_3d, emptyCmd};
+cmd cwfall_3d[] = {cwaterfall_3d, emptyCmd};
+cmd cwpool_3d[] = {cwaterpool_3d, emptyCmd};
+cmd cwstream_3d[] = {cwaterstream_3d, emptyCmd};
+
+const cmd *cmdList_3d[] = {
+ cmdDummy, cbell_3d, cbook_3d, cbouillon_3d, ccage_3d,
+ ccandle_3d, ccheese_3d, cclay_3d, ccrystal_3d, cdart_3d,
+ cdoor_3d, cexit_3d, cflask_3d, cghost_3d, cnative_3d,
+ cpins_3d, cplane_3d, crock_3d, cscroll_3d, cswing_3d,
+ cswingc_3d, cvine_3d, cwfall_3d, cwpool_3d, cwstream_3d
+};
+
+// The following are lists of actions invoked when entering a screen
+// They consist of actions which occur no matter which door is entered
+// See the list of 'hotspots' and 'Open' cmds for door specific actions
+uint16 s0acts_1w[] = {kALclosedoor1_1w, kALblinkeyes1_1w, kALightning_1w, kALbat_1w, 0}; // House
+uint16 s1acts_1w[] = {kALblinkeyes2_1w, kALridprof_1w, 0}; // Hall
+uint16 s2acts_1w[] = {0}; // Bed1
+uint16 s3acts_1w[] = {kALbut_1w, kALrepredeye_1w, kALreplips_1w, kALreparm_1w, 0}; // dining room
+uint16 s4acts_1w[] = {0}; // Bathroom
+uint16 s5acts_1w[] = {0}; // Kitchen
+uint16 s6acts_1w[] = {0}; // Garden
+uint16 s7acts_1w[] = {kALdog_1w, 0}; // Store room
+uint16 s8acts_1w[] = {kALhelp_1w, 0}; // Basement
+uint16 s9acts_1w[] = {kALbatattack_1w, 0}; // Batcave
+uint16 s10acts_1w[] = {kALmum_1w, 0}; // Mummy room
+uint16 s11acts_1w[] = {0}; // Lake room
+uint16 s12acts_1w[] = {0}; // Dead end
+uint16 s13acts_1w[] = {kALjail_1w, 0}; // Jail
+uint16 s14acts_1w[] = {kALgoodbye_1w, 0}; // The end
+uint16 s15acts_1w[] = {kALlab_1w, kALbox_1w, 0}; // Laboratory
+
+const uint16 *screenActs_1w[] = {
+ s0acts_1w, s1acts_1w, s2acts_1w, s3acts_1w, s4acts_1w,
+ s5acts_1w, s6acts_1w, s7acts_1w, s8acts_1w, s9acts_1w,
+ s10acts_1w, s11acts_1w, s12acts_1w, s13acts_1w, s14acts_1w,
+ s15acts_1w
+};
+
+uint16 s0acts_2w[] = {kALscr01Story_2w, 0}; // House
+uint16 s1acts_2w[] = {kALpenny1_2w, kALmaid_2w, kALheroxy01_2w, 0};// Hall
+uint16 s2acts_2w[] = {kALscr02_2w, 0}; // Bed1
+uint16 s3acts_2w[] = {kALscr03_2w, 0}; // Bed2
+uint16 s4acts_2w[] = {kALscr04_2w, 0}; // Murder
+uint16 s6acts_2w[] = {kALscr06_2w, 0}; // Kitchen
+uint16 s9acts_2w[] = {kALscr09_2w, 0}; // In shed
+uint16 s10acts_2w[] = {kALscr10_2w, 0}; // Venus
+uint16 s14acts_2w[] = {kALscr14_2w, 0}; // Bug attack
+uint16 s15acts_2w[] = {kALscr15_2w, 0}; // Old man
+uint16 s17acts_2w[] = {kALmap0_2w, 0}; // Snakepit
+uint16 s18acts_2w[] = {kALmap1_2w, 0}; // Phonebox
+uint16 s25acts_2w[] = {kALscr25_2w, 0}; // Chasm
+uint16 s29acts_2w[] = {kALscr29_2w, 0}; // Hall2
+uint16 s30acts_2w[] = {kALscr30_2w, 0}; // Lounge
+uint16 s31acts_2w[] = {kALmaidp_2w, 0}; // Parlor
+uint16 s33acts_2w[] = {kALscr33_2w, 0}; // Boxroom
+uint16 s34acts_2w[] = {kALscr34_2w, 0}; // Hall3
+uint16 s35acts_2w[] = {kALscr35_2w, 0}; // Organ
+uint16 s36acts_2w[] = {kALscr36_2w, 0}; // Hestroom
+uint16 s37acts_2w[] = {kALsong3_2w, 0}; // Retupmoc
+const uint16 *screenActs_2w[] = {
+ /* 0 */ s0acts_2w, s1acts_2w, s2acts_2w, s3acts_2w, s4acts_2w,
+ 0, s6acts_2w, 0, 0, s9acts_2w,
+ /* 10 */ s10acts_2w, 0, 0, 0, s14acts_2w,
+ s15acts_2w, 0, s17acts_2w, s18acts_2w, 0,
+ /* 20 */ 0, 0, 0, 0, 0,
+ s25acts_2w, 0, 0, 0, s29acts_2w,
+ /* 30 */ s30acts_2w, s31acts_2w, 0, s33acts_2w, s34acts_2w,
+ s35acts_2w, s36acts_2w, s37acts_2w, 0, 0,
+ /* 40 */ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ /* 50 */ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ /* 60 */ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ /* 70 */ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ /* 80 */ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ /* 90 */ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ /*100 */ 0, 0, 0
+};
+
+uint16 s0acts_3w[] = {kALcrashStory_3w, kALhorizon_3w, 0}; // Crash site
+uint16 s1acts_3w[] = {kALweb_3w, 0}; // Spider's web
+uint16 s2acts_3w[] = {kALbridgetest_3w, kALbridgetip_3w, 0};// Bridge1
+uint16 s13acts_3w[] = {kALhut_in_3w, kALmouse_3w, 0};// In hut
+uint16 s15acts_3w[] = {kALoldman_3w, kALflash_3w, 0};// Oldman
+uint16 s18acts_3w[] = {kALcamp_3w, 0}; // At camp
+uint16 s19acts_3w[] = {kALsunset_3w, 0}; // Bye bye!
+uint16 s23acts_3w[] = {kALpath_3w, 0}; // Elephant
+const uint16 *screenActs_3w[] = {
+ /* 0 */ s0acts_3w, s1acts_3w, s2acts_3w, 0, 0,
+ 0, 0, 0, 0, 0,
+ /* 10 */ 0, 0, 0, s13acts_3w, 0,
+ s15acts_3w, 0, 0, s18acts_3w, s19acts_3w,
+ /* 20 */ 0, 0, 0, s23acts_3w, 0,
+ 0, 0, 0, 0, 0,
+ /* 30 */ 0
+};
+
+uint16 s0acts_1d[] = {kALsong1_1d, kALclosedoor1_1d, kALblinkeyes1_1d, kALightning_1d, kALbat_1d, 0};
+uint16 s1acts_1d[] = {kALblinkeyes2_1d, kALridprof_1d, 0};
+uint16 s2acts_1d[] = {0};
+uint16 s3acts_1d[] = {kALbut_1d, kALrepredeye_1d, kALreplips_1d, kALreparm_1d, 0};
+uint16 s4acts_1d[] = {0};
+uint16 s5acts_1d[] = {0};
+uint16 s6acts_1d[] = {0};
+uint16 s7acts_1d[] = {kALdog_1d, 0};
+uint16 s8acts_1d[] = {kALhelp_1d, 0};
+uint16 s9acts_1d[] = {kALbatattack_1d, 0};
+uint16 s10acts_1d[] = {kALmum_1d, 0};
+uint16 s11acts_1d[] = {0};
+uint16 s12acts_1d[] = {0};
+uint16 s13acts_1d[] = {kALjail_1d, 0};
+uint16 s14acts_1d[] = {kALgoodbye_1d, 0};
+uint16 s15acts_1d[] = {kALlab_1d, 0};
+
+const uint16 *screenActs_1d[] = {
+ s0acts_1d, s1acts_1d, s2acts_1d, s3acts_1d, s4acts_1d,
+ s5acts_1d, s6acts_1d, s7acts_1d, s8acts_1d, s9acts_1d,
+ s10acts_1d, s11acts_1d, s12acts_1d, s13acts_1d, s14acts_1d,
+ s15acts_1d
+};
+
+
+uint16 s0acts_2d[] = {kALscr01_2d, kALsong1_2d, 0}; // House
+uint16 s1acts_2d[] = {kALpenny1_2d, kALmaid_2d, kALheroxy01_2d, 0}; // Hall
+uint16 s2acts_2d[] = {kALscr02_2d, 0}; // Bed1
+uint16 s3acts_2d[] = {kALscr03_2d, 0}; // Bed2
+uint16 s4acts_2d[] = {kALscr04_2d, 0}; // Murder
+uint16 s6acts_2d[] = {kALscr06_2d, 0}; // Kitchen
+uint16 s9acts_2d[] = {kALscr09_2d, 0}; // In shed
+uint16 s10acts_2d[] = {kALscr10_2d, 0}; // Venus
+uint16 s14acts_2d[] = {kALscr14_2d, 0}; // Bug attack
+uint16 s15acts_2d[] = {kALscr15_2d, 0}; // Old man
+uint16 s17acts_2d[] = {kALmap0_2d, 0}; // Snakepit
+uint16 s18acts_2d[] = {kALmap1_2d, 0}; // Phonebox
+uint16 s29acts_2d[] = {kALscr29_2d, 0}; // Hall2
+uint16 s30acts_2d[] = {kALscr30_2d, 0}; // Lounge
+uint16 s31acts_2d[] = {kALmaidp_2d, 0}; // Parlor
+uint16 s33acts_2d[] = {kALscr33_2d, 0}; // Boxroom
+uint16 s34acts_2d[] = {kALscr34_2d, 0}; // Hall3
+uint16 s35acts_2d[] = {kALscr35_2d, 0}; // Organ
+uint16 s36acts_2d[] = {kALscr36_2d, 0}; // Hestroom
+uint16 s37acts_2d[] = {kALsong3_2d, 0}; // Retupmoc
+
+const uint16 *screenActs_2d[] = {
+ s0acts_2d, s1acts_2d, s2acts_2d, s3acts_2d, s4acts_2d,
+ 0, s6acts_2d, 0, 0, s9acts_2d,
+ s10acts_2d, 0, 0, 0, s14acts_2d,
+ s15acts_2d, 0, s17acts_2d, s18acts_2d, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, s29acts_2d,
+ s30acts_2d, s31acts_2d, 0, s33acts_2d, s34acts_2d,
+ s35acts_2d, s36acts_2d, s37acts_2d, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0
+};
+
+uint16 s0acts_3d[] = {kALcrashStory_3d, 0}; // Crash site
+uint16 s1acts_3d[] = {kALweb_3d, 0}; // Spider's web
+uint16 s2acts_3d[] = {kALbridgetip_3d, 0}; // Bridge1
+uint16 s13acts_3d[] = {kALhut_in_3d, kALmouse_3d, 0}; // In hut
+uint16 s15acts_3d[] = {kALoldman_3d, kALflash_3d, 0}; // Oldman
+uint16 s18acts_3d[] = {kALcamp_3d, 0}; // At camp
+uint16 s19acts_3d[] = {kALsunset_3d, 0}; // Bye bye!
+uint16 s23acts_3d[] = {kALpath_3d, 0}; // Elephant
+const uint16 *screenActs_3d[] = {
+ /* 0 */ s0acts_3d, s1acts_3d, s2acts_3d, 0, 0,
+ 0, 0, 0, 0, 0,
+ /* 10 */ 0, 0, 0, s13acts_3d, 0,
+ s15acts_3d, 0, 0, s18acts_3d, s19acts_3d,
+ /* 20 */ 0, 0, 0, s23acts_3d, 0,
+ 0, 0, 0, 0, 0,
+ /* 30 */ 0
+};
+
+object_t objects_1w[] = {
+//name, description, description_s,path, dx, dy, aptr, seq,seqp, cyc, n,frm,rad,scr,x,y , oldxy,vxy,val,g,cmnd, c, s,ctx,fgb
+{kNHero_1w, kDTthero_1w, 0, USER, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, 0, 0, 229, 144, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 0: (Outside house)
+{kNDoor_1w, kDTtdoor_1w, 0, AUTO, 0, 0, 0, THING4, INVISIBLE, 1, 4, 4, 16, 0, 26, 131, 90, 90, 0, 0, 0, 1, kCMDdoor1_1w, 0, 0, 0, FLOATING, 29, 175, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNEyes_1w, kDTteyes_1w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 0, 80, 148, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, 72, 175, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNEyes_1w, kDTteyes_1w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 0, 59, 78, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, 72, 175, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNBat_1w, kDTtbat_1w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 0, 95, 55, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNPkin_1w, kDTtpkin_1w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 10, 0, 20, 168, 90, 90, 0, 0, 2, 7, kCMDpkin_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNKey_1w, kDTtkey_1w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 10, 0, 24, 177, 90, 90, 0, 0, 5, 7, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFence_1w, 0, 0, AUTO, 193, 37, 0, THING0, INVISIBLE, 0, 0, 0, 30, 0, 69, 161, 127, 145, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 225, 183, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNTree_1w, 0, 0, AUTO, 25, 52, 0, THING0, INVISIBLE, 0, 0, 0, 30, 0, 69, 161, 186, 93, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 190, 183, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 1: (Hall)
+{kNDoor_1w, kDTtdoor_1w, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 1, 125, 56, 90, 90, 0, 0, 0, 1, kCMDdoor2_1w, 0, 0, 0, FLOATING, 127, 98, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDoor_1w, kDTtdoor_1w, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 1, 208, 56, 90, 90, 0, 0, 0, 1, kCMDdoor3_1w, 0, 0, 0, FLOATING, 210, 98, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNEyes_1w, kDTteyes_1w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 1, 23, 48, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, 48, 98, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNEyes_1w, kDTteyes_1w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 1, 7, 93, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, 32, 140, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNBatpic_1w, 0, 0, AUTO, 46, 30, 0, THING0, INVISIBLE, 0, 0, 0, 30, 1, 69, 161, 113, 108, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 110, 160, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNCandle_1w, kDTtcandle_1w, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 30, 1, 176, 131, 90, 90, 0, 0, 3, 7, 0, 0, 0, 0, FLOATING, 164, 165, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNCupb_1w, 0, 0, AUTO, 9, 25, 0, THING0, INVISIBLE, 0, 0, 0, 20, 1, 69, 161, 67, 140, 0, 0, 0, 1, kCMDcupb_1w, 0, 0, 1, FLOATING, 81, 168, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNKnife_1w, kDTtknife_1w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 30, 1, 69, 169, 90, 90, 0, 0, 6, 7, kCMDknife_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWhistle_1w, kDTtwhistle_1w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 30, 1, 79, 171, 90, 90, 0, 0, 6, 7, kCMDwhistle_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 2: (Bedroom 1)
+{kNWard_1w, kDTtward_1w, 0, AUTO, 46, 51, 0, THING0, INVISIBLE, 1, 4, 4, 30, 2, 172, 113, 150, 58, 0, 0, 0, 1, kCMDward_1w, 0, 0, 0, FLOATING, 168, 117, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNWdoorl_1w, 0, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 0, 2, 150, 56, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWdoorr_1w, 0, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 0, 2, 174, 56, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMask_1w, kDTtmask_1w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 10, 2, 155, 100, 90, 90, 0, 0, 4, 7, kCMDmask_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMonkey_1w, 0, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 2, 229, 144, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWindow_1w, 0, 0, AUTO, 29, 22, 0, THING0, INVISIBLE, 1, 4, 4, 30, 2, 172, 113, 117, 57, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 136, 116, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNBed_1w, 0, 0, AUTO, 60, 36, 0, THING0, INVISIBLE, 1, 4, 4, 30, 2, 172, 113, 78, 92, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 127, 130, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+// Screen 3: (Dining room)
+{kNButler_1w, kDTtbutler_1w, 0, AUTO, 0, 0, kALbutler_1w, PERSON, NOT_CYCLING, 0, 0, 0, 20, 3, 70, 78, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNChop_1w, kDTtchop_1w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 20, 3, 69, 161, 90, 90, 0, 0, 0, 7, kCMDchop_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNRedeyes_1w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, 3, 212, 108, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNLips_1w, 0, 0, AUTO, 0, 0, 0, THING2, NOT_CYCLING, 0, 1, 1, 0, 3, 113, 105, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNArm_1w, 0, 0, AUTO, 0, 0, 0, THING2, NOT_CYCLING, 0, 5, 5, 0, 3, 166, 122, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNHdlshero_1w, 0, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 10, 0, 24, 177, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPicture_1w, 0, 0, AUTO, 74, 41, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 172, 113, 122, 52, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 169, 120, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNWindow_1w, 0, 0, AUTO, 41, 50, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 172, 113, 265, 64, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 269, 139, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNCupb_1w, 0, 0, AUTO, 44, 29, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 172, 113, 65, 69, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 78, 124, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNFrank_1w, kDTtfrank_1w, 0, AUTO, 23, 28, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 90, 110, 104, 97, 0, 0, 0, 1, kCMDfrank_1w, 0, 0, 0, FLOATING, 90, 134, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+{kNDracula_1w, kDTtdrac_1w, 0, AUTO, 28, 18, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 130, 110, 135, 107, 0, 0, 0, 1, kCMDdrac_1w, 0, 0, 0, FLOATING, 130, 134, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+{kNGwen_1w, kDTtlady_1w, 0, AUTO, 17, 23, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 160, 110, 174, 97, 0, 0, 0, 1, kCMDgwen_1w, 0, 0, 0, FLOATING, 162, 134, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+{kNHood_1w, kDTthood_1w, 0, AUTO, 35, 26, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 195, 110, 205, 101, 0, 0, 0, 1, kCMDhood_1w, 0, 0, 0, FLOATING, 195, 134, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+{kNSlime_1w, kDTtslime_1w, 0, AUTO, 21, 24, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 75, 140, 88, 113, 0, 0, 0, 1, kCMDslime_1w, 0, 0, 0, FLOATING, 74, 160, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNPeahead_1w, kDTtpeahd_1w, 0, AUTO, 20, 15, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 164, 140, 172, 121, 0, 0, 0, 1, kCMDpeahd_1w, 0, 0, 0, FLOATING, 152, 162, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNFood_1w, 0, 0, AUTO, 19, 10, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 130, 140, 149, 127, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 138, 162, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNPlant_1w, 0, 0, AUTO, 11, 21, 0, THING0, INVISIBLE, 1, 4, 4, 30, 3, 172, 113, 239, 74, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 230, 125, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+// Screen 4: (bathroom)
+{kNWindow_1w, 0, 0, AUTO, 31, 27, 0, THING0, INVISIBLE, 1, 4, 4, 30, 4, 172, 113, 153, 61, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 157, 114, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNToilet_1w, 0, 0, AUTO, 32, 17, 0, THING0, INVISIBLE, 1, 4, 4, 30, 4, 172, 113, 101, 113, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 122, 122, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNBath_1w, 0, 0, AUTO, 47, 36, 0, THING0, INVISIBLE, 1, 4, 4, 30, 4, 172, 113, 73, 125, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 119, 156, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNMirror_1w, 0, 0, AUTO, 12, 24, 0, THING0, INVISIBLE, 1, 4, 4, 30, 4, 172, 113, 207, 71, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 180, 127, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+// Screen 5: (kitchen)
+{kNWindow_1w, 0, 0, AUTO, 66, 35, 0, THING0, INVISIBLE, 1, 4, 4, 30, 5, 172, 113, 107, 76, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 124, 143, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNBroom_1w, 0, 0, AUTO, 19, 51, 0, THING0, INVISIBLE, 1, 4, 4, 30, 5, 172, 113, 280, 114, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 276, 166, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNCupb_1w, 0, 0, AUTO, 159, 29, 0, THING0, INVISIBLE, 1, 4, 4, 30, 5, 172, 113, 50, 112, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 0, 0, 0, 0, 0, 0, 0},
+// Screen 6: (Garden)
+{kNDoor_1w, kDTtdoor_1w, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 6, 226, 58, 90, 90, 0, 0, 0, 1, kCMDdoor4_1w, 0, 0, 0, FLOATING, 224, 104, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNShed_1w, 0, 0, AUTO, 106, 60, 0, THING0, INVISIBLE, 0, 0, 0, 60, 6, 277, 39, 214, 37, 0, 0, 0, 1, kCMDshed_1w, 0, 0, 1, FLOATING, 213, 103, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNOilcan_1w, kDTtoilcan_1w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 40, 6, 240, 65, 90, 90, 0, 0, 4, 1, kCMDoilcan_1w, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNTree_1w, 0, 0, AUTO, 30, 120, 0, THING0, INVISIBLE, 1, 4, 4, 30, 6, 172, 113, 161, 17, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 163, 148, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNShed_1w, 0, 0, AUTO, 25, 40, 0, THING0, INVISIBLE, 1, 4, 4, 30, 6, 172, 113, 226, 58, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 285, 99, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+// Screen 7: (Store room)
+{kNDog_1w, kDTtdog_1w, 0, AUTO, 0, 0, kALdoggy_1w, ANIMAL, NOT_CYCLING, 0, 0, 0, -1, 7, 105, 119, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCarpet_1w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 50, 7, 191, 142, 90, 90, 0, 0, 0, 0, kCMDcarpet_1w, 0, 0, 0, BACKGROUND, 234, 153, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNTrap_1w, kDTttrap_1w, 0, AUTO, 0, 0, 0, THING4, INVISIBLE, 0, 2, 2, 20, 7, 216, 140, 90, 90, 0, 0, 0, 1, kCMDtrap_1w, 0, 0, 0, BACKGROUND, 240, 152, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNBolt_1w, kDTtbolt_1w, 0, AUTO, 7, 5, 0, THING0, INVISIBLE, 0, 0, 0, 20, 7, 220, 145, 237, 151, 0, 0, 0, 1, kCMDbolt_1w, 0, 0, 0, BACKGROUND, 240, 152, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNHerodead_1w, 0, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 10, 0, 24, 177, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMousehole_1w, 0, 0, AUTO, 7, 8, 0, THING0, INVISIBLE, 1, 4, 4, 30, 7, 172, 113, 52, 148, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 65, 158, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+// Screen 8: (Basement)
+{kNRock_1w, 0, 0, AUTO, 66, 53, 0, THING0, INVISIBLE, 1, 4, 4, 30, 8, 172, 113, 132, 88, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 123, 149, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNRock_1w, 0, 0, AUTO, 56, 60, 0, THING0, INVISIBLE, 1, 4, 4, 30, 8, 172, 113, 257, 125, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 270, 187, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNRock_1w, 0, 0, AUTO, 25, 91, 0, THING0, INVISIBLE, 1, 4, 4, 30, 8, 172, 113, 0, 102, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 20, 187, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNDoor_1w, 0, 0, AUTO, 30, 57, 0, THING0, INVISIBLE, 1, 4, 4, 30, 8, 172, 113, 207, 84, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 210, 142, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 9: (Batcave)
+{kNBat_1w, kDTtbat_1w, 0, AUTO, 0, 0, kALbats_1w, THING1, NOT_CYCLING, 0, 0, 0, 16, 9, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBat_1w, kDTtbat_1w, 0, AUTO, 0, 0, kALbats_1w, THING1, NOT_CYCLING, 0, 0, 0, 16, 9, 55, 65, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBat_1w, kDTtbat_1w, 0, AUTO, 0, 0, kALbats_1w, THING1, NOT_CYCLING, 0, 0, 0, 16, 9, 55, 120, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBat_1w, kDTtbat_1w, 0, AUTO, 0, 0, kALbats_1w, THING1, NOT_CYCLING, 0, 0, 0, 16, 9, 55, 130, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 10: (Mummy room)
+{kNMummy_1w, 0, 0, AUTO, 0, 0, kALmummy_1w, PERSON, NOT_CYCLING, 0, 0, 0, DX, 10, 256, 77, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMdoor, 0, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 0, 10, 258, 55, 90, 90, 0, 0, 0, 1, kCMDdoor4_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNGold_1w, kDTtgold_1w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 20, 10, 208, 152, 90, 90, 0, 0, 10, 7, kCMDgold_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNRock_1w, 0, 0, AUTO, 54, 34, 0, THING0, INVISIBLE, 1, 4, 4, -1, 10, 172, 113, 127, 109, 0, 0, 0, 1, kCMDrock_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 11: (Lakeroom)
+{kNBoat_1w, kDTtboat_1w, 0, AUTO, 0, 0, 0, THING2c, NOT_CYCLING, 0, 0, 0, 30, 11, 230, 118, 90, 90, 0, 0, 0, 1, kCMDboat_1w, 0, 0, 1, FLOATING, 250, 150, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNRope_1w, kDTtrope_1w, 0, AUTO, 0, 0, 0, THING2c, NOT_CYCLING, 0, 0, 0, 30, 11, 220, 132, 90, 90, 0, 0, 0, 1, kCMDrope_1w, 0, 0, 0, FLOATING, 209, 153, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNOldman_1w, kDTtoldman_1w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, 11, 160, 38, 90, 90, 0, 0, 0, 1, kCMDoldman_1w, 0, 0, 0, FLOATING, 150, 54, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+{kNWhero_1w, 0, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 11, 100, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 12: (Dead end)
+{kNGuard_1w, kDTtguard_1w, 0, AUTO, 0, 0, 0, THING2d, NOT_CYCLING, 0, 0, 0, -1, 12, 147, 38, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 133, 91, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 15: (Laboratory)
+{kNProf_1w, kDTtprof_1w, 0, AUTO, 0, 0, 0, PERSON2, CYCLE_FORWARD, 0, 0, 0, -1, 1, 150, 55, 90, 90, DX, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNIgor_1w, kDTtigor_1w, 0, AUTO, 0, 0, 0, PERSON2, CYCLE_FORWARD, 0, 0, 0, -1, 15, 180, 122, 90, 90, DX, 0, 0, 1, kCMDigor_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBung_1w, kDTtbung_1w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 14, 15, 75, 145, 90, 90, 0, 0, 11, 7, kCMDbung_1w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNGdoor_1w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, 15, 59, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNSpachero_1w, 0, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 15, 100, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFuzyhero_1w, 0, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 15, 100, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNSpark_1w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, 15, 106, 74, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBooth_1w, 0, 0, AUTO, 38, 64, 0, THING0, INVISIBLE, 1, 4, 4, -1, 15, 172, 113, 108, 99, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 124, 154, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+{kNMachinebits_1w, 0, 0, AUTO, 41, 7, 0, THING0, INVISIBLE, 1, 4, 4, 0, 15, 172, 113, 184, 118, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 191, 168, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNMachine_1w, 0, 0, AUTO, 103, 34, 0, THING0, INVISIBLE, 1, 4, 4, 0, 15, 172, 113, 177, 130, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 240, 168, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNTable_1w, 0, 0, AUTO, 44, 11, 0, THING0, INVISIBLE, 1, 4, 4, 0, 15, 172, 113, 49, 137, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 64, 162, Common::KEYCODE_UP, 0, 0, 0, 0}
+};
+
+uint16 tmatch_2w[] = {kDTtmatch1_2w, kDTtmatch2_2w, 0};
+uint16 tguns_2w[] = {kDTtgun0_2w, kDTtgun1_2w, 0};
+uint16 trobots_2w[] = {kDTtrobot0_2w, kDTtrobot1_2w, 0};
+
+object_t objects_2w[] = {
+// Note new use of non-image objects: Use old_x, old_y, dx, dy to mark rectangle
+// and use dx <> 0 to allow point & click interface to access them.
+// viewx: -1 Walk to object, 0 immediate use, else walk to viewx,viewy.
+// name,description,description_s,path,dx,dy,aptr,seq,seqp, cyc,n,frm,rad,scr,x,y ,oldxy,vxy,val,g,cmnd,c,s,ctx,fgb
+{kNHero_2w, kDTthero_2w, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 0, 319, 199, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPenny_2w, kDTtpenny_2w, 0, AUTO, 0, 0, 0, PERSON, NOT_CYCLING, 0, 0, 0, -1, 1, 109, 140, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 0: (Outside house)
+{kNSmoke_2w, 0, 0, AUTO, 0, 0, 0, THING3, CYCLE_FORWARD, 0, 2, 0, 0, 0, 233, 20, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 1: (Hall)
+{kNDoor_2w, kDTtdoor_2w, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 50, 1, 238, 40, 90, 90, 0, 0, 0, 1, kCMDdoor1_2w, 0, 0, 0, FLOATING, 239, 82, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDoor_2w, kDTtdoordum_2w, 0, AUTO, 26, 42, 0, THING0, INVISIBLE, 0, 0, 0, 50, 1, 80, 40, 80, 40, 0, 0, 0, 1, kCMDdoordum_2w, 0, 0, 0, FLOATING, 82, 82, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDoor_2w, kDTtdoordum_2w, 0, AUTO, 26, 42, 0, THING0, INVISIBLE, 0, 0, 0, 50, 1, 160, 40, 160, 40, 0, 0, 0, 1, kCMDdoordum_2w, 0, 0, 0, FLOATING, 162, 82, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNLips_2w, 0, 0, AUTO, 0, 0, 0, THING2, INVISIBLE, 0, 0, 0, 0, 1, 186, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNMaid_2w, kDTtmaid_2w, 0, AUTO, 0, 0, 0, PERSON4, NOT_CYCLING, 0, 0, 0, 8, 1, 149, 135, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNHallgo_2w, kDTthallgo_2w, 0, AUTO, 189, 72, 0, THING0, INVISIBLE, 0, 0, 0, -1, 1, 0, 0, 116, 106, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 218, 181, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 2: (Bedroom 1)
+{kNPennylie_2w, 0, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 10, 2, 24, 177, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, OVEROVL, -1, -1, -1, 0, 0, 0, 0},
+{kNPenfall_2w, 0, 0, AUTO, 0, 0, 0, THING2, INVISIBLE, 0, 0, 0, 10, 2, 24, 177, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBookcase_2w, kDTtbookcase_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, -1, 2, 70, 81, 90, 90, 0, 0, 0, 1, kCMDbook_2w, 0, 0, 0, FLOATING, 90, 138, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNBook_2w, kDTtbook_2w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 10, 2, 90, 140, 90, 90, 0, 0, 0, 1, kCMDbook_2w, 0, 0, 1, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNKeyhole_2w, 0, 0, AUTO, 7, 9, 0, THING0, INVISIBLE, 0, 0, 0, 10, 2, 28, 166, 26, 129, 0, 0, 0, 0, kCMDkeyhole_2w, 0, 0, 0, FLOATING, 35, 166, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNBed_2w, kDTtbed_2w, 0, AUTO, 109, 27, 0, THING0, INVISIBLE, 0, 0, 0, 0, 2, 160, 40, 174, 135, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 214, 136, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+// Screen 3: (Bedroom 2)
+{kNPanel_2w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, -1, 3, 189, 91, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNCupb_2w, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, 3, 135, 142, 90, 90, 0, 0, 0, 0, kCMDlookdesk_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBird_2w, kDTtbird_2w, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, -1, 3, 186, 100, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FOREGROUND, 192, 157, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNMatches_2w, 0, tmatch_2w, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, 30, 255, 78, 30, 90, 90, 0, 0, 5, 15, kCMDmatches_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDumb_2w, kDTtdumb_2w, 0, AUTO, 32, 26, 0, THING0, INVISIBLE, 0, 0, 0, 30, 3, 72, 138, 55, 91, 0, 0, 0, 1, kCMDdumb_2w, 0, 0, 0, FLOATING, 66, 140, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNPhone_2w, 0, 0, AUTO, 16, 7, 0, THING0, INVISIBLE, 0, 0, 0, 0, 3, 0, 0, 102, 120, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 78, 148, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNBlotpad_2w, 0, 0, AUTO, 41, 10, 0, THING0, INVISIBLE, 0, 0, 0, 0, 3, 0, 0, 116, 122, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 132, 160, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDrawer_2w, 0, 0, AUTO, 38, 9, 0, THING0, INVISIBLE, 0, 0, 0, 0, 3, 0, 0, 127, 133, 0, 0, 0, 1, kCMDlookdesk_2w, 0, 0, 0, FLOATING, 139, 158, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNSwitch_2w, 0, 0, AUTO, 5, 5, 0, THING0, INVISIBLE, 0, 0, 0, 0, 3, 0, 0, 89, 104, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 74, 141, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNKeyhole_2w, 0, 0, AUTO, 7, 11, 0, THING0, INVISIBLE, 0, 0, 0, 0, 3, 0, 0, 282, 134, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 260, 170, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+// Screen 4: (Keyhole)
+{kNMurder_2w, 0, 0, AUTO, 0, 0, 0, THING2e, CYCLE_FORWARD, 1, 2, 16, -1, 4, 141, 76, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 5: (Bed3)
+{kNBalloon_2w, kDTtballoon_2w, 0, WANDER, DX/2, DY/2, 0, THING1, NOT_CYCLING, 0, 0, 0, 50, 5, 180, 40, 90, 90, 0, 0, 0, 1, kCMDballoon_2w, 0, 0, 0, FLOATING, 146, 130, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNBlock_2w, 0, 0, AUTO, 18, 10, 0, THING0, INVISIBLE, 0, 0, 0, 0, 5, 0, 0, 175, 131, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 176, 135, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+{kNCage_2w, 0, 0, AUTO, 46, 23, 0, THING0, INVISIBLE, 0, 0, 0, 0, 5, 0, 0, 93, 123, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 96, 150, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 15, 26, 0, THING0, INVISIBLE, 0, 0, 0, 0, 5, 0, 0, 83, 88, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 106, 133, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 31, 21, 0, THING0, INVISIBLE, 0, 0, 0, 0, 5, 0, 0, 133, 85, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 149, 133, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 6: (Kitchen)
+{kNDumb_2w, kDTtdumb_2w, 0, AUTO, 21, 24, 0, THING0, INVISIBLE, 0, 0, 0, 20, 6, 35, 152, 26, 99, 0, 0, 0, 1, kCMDdumb_2w, 0, 0, 0, FLOATING, 40, 153, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNCupb_2w, 0, 0, AUTO, 61, 23, 0, THING0, INVISIBLE, 0, 0, 0, 55, 6, 135, 142, 90, 118, 0, 0, 0, 0, kCMDlookcupb_2w, 0, 0, 0, FLOATING, 112, 143, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNGarlic_2w, kDTtgarlic_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 20, 255, 78, 30, 90, 90, 0, 0, 5, 7, kCMDgarlic_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDoor_2w, kDTdull_2w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, 6, 290, 196, 90, 90, 0, 0, 0, 0, kCMDkdoor_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 67, 29, 0, THING0, INVISIBLE, 0, 0, 0, 0, 6, 0, 0, 106, 75, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 139, 143, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 8: (Shed)
+{kNGardner_2w, 0, 0, WANDER, DX, DY, 0, PERSON2, CYCLE_FORWARD, 0, 0, 0, -1, 8, 250, 90, 90, 90, 0, 0, 0, 1, kCMDlookgard_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 9: In shed
+{kNRed_2w, kDTtbutton_2w, 0, AUTO, 5, 5, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 177, 99, 0, 0, 0, 1, kCMDred_2w, 0, 0, 0, FLOATING, 188, 137, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNYellow_2w, kDTtbutton_2w, 0, AUTO, 5, 5, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 189, 99, 0, 0, 0, 1, kCMDyellow_2w, 0, 0, 0, FLOATING, 172, 137, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNGreen_2w, kDTtbutton_2w, 0, AUTO, 5, 5, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 201, 99, 0, 0, 0, 1, kCMDgreen_2w, 0, 0, 0, FLOATING, 184, 137, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNBlue_2w, kDTtbutton_2w, 0, AUTO, 5, 5, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 215, 99, 0, 0, 0, 1, kCMDblue_2w, 0, 0, 0, FLOATING, 198, 137, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNButton_2w, kDTtbutton_2w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 90, 90, 0, 0, 0, 1, kCMDbutton_2w, 0, 1, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNShedlight_2w, kDTtslight_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, -1, 9, 161, 48, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNTools_2w, 0, 0, AUTO, 33, 21, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 127, 79, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 136, 127, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 10: Venus fly traps
+{kNMagnify_2w, kDTtmagnify_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 20, 10, 95, 96, 90, 90, 0, 0, 15, 7, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFly_2w, 0, 0, WANDER2, DX, DY, 0, THING2, NOT_CYCLING, 0, 1, 0, 20, 10, 48, 60, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFly_2w, 0, 0, WANDER2, DX, DY, 0, THING2, NOT_CYCLING, 0, 1, 0, 20, 10, 58, 70, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFly_2w, 0, 0, WANDER2, DX, DY, 0, THING2, NOT_CYCLING, 0, 1, 0, 20, 10, 268, 90, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLeaf_2w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 0, 40, 10, 48, 86, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 41, 103, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNLeaf_2w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 2, 0, 40, 10, 79, 104, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 69, 121, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNLeaf_2w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 0, 40, 10, 71, 141, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 68, 153, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNLeaf_2w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 3, 0, 40, 10, 116, 113, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 99, 132, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNLeaf_2w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 1, 40, 10, 164, 120, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 184, 136, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNLeaf_2w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 2, 0, 40, 10, 185, 83, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 167, 101, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNLeaf_2w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 0, 40, 10, 232, 96, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 223, 116, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNLeaf_2w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 0, 40, 10, 273, 141, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 251, 156, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+// Screen 11/12: Gates
+{kNGatelight_2w, kDTtglight_2w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 1, 0, 0, -1, 11, 90, 72, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNGate_2w, 0, 0, AUTO, 83, 56, 0, THING0, INVISIBLE, 0, 0, 0, -1, 12, 190, 137, 118, 99, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 152, 157, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 13: Stream
+{kNCatnip_2w, kDTtcatnip_2w, 0, AUTO, 54, 8, 0, THING0, INVISIBLE, 0, 0, 0, -1, 13, 211, 136, 29, 114, 0, 0, 5, 3, kCMDcatnip_2w, 0, 0, 0, FLOATING, 49, 130, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNBridge_2w, kDTtbridge_2w, 0, AUTO, 61, 25, 0, THING0, INVISIBLE, 0, 0, 0, -1, 13, 211, 136, 162, 116, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 218, 124, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+// Screen 14: Zapper
+{kNZapper_2w, kDTtzapper_2w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 1, 0, 0, -1, 14, 134, 46, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2w, kDTtbug_2w, 0, AUTO, 0, 0, kALbugs_2w, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2w, kDTtbug_2w, 0, AUTO, 0, 0, kALbugs_2w, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2w, kDTtbug_2w, 0, AUTO, 0, 0, kALbugs_2w, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2w, kDTtbug_2w, 0, AUTO, 0, 0, kALbugs_2w, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2w, kDTtbug_2w, 0, AUTO, 0, 0, kALbugs_2w, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 15: Mushroom
+{kNOldman_2w, kDTtoldman_2w, 0, AUTO, 0, 0, 0, THING2c, NOT_CYCLING, 1, 0, 0, -1, 15, 126, 77, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 16: Well
+{kNWell_2w, kDTtwell_2w, 0, AUTO, 53, 55, 0, THING0, INVISIBLE, 0, 0, 0, 30, 16, 211, 136, 184, 85, 0, 0, 0, 1, kCMDwell_2w, 0, 0, 0, FLOATING, 242, 131, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+// Screen 17: Snakepit
+{kNSnake_2w, kDTtsnake_2w, 0, CHASE2, DX, DY, kALsnake_2w, PERSON2, CYCLE_FORWARD, 0, 0, 0, 25, 17, 165, 95, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 18: Phonebox
+{kNTardis_2w, kDTttardis_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 50, 18, 21, 74, 90, 90, 0, 0, 0, 1, kCMDtardis_2w, 0, 0, 1, FLOATING, 50, 126, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+// Screen 19: Street
+{kNGraf_2w, 0, 0, AUTO, 34, 14, 0, THING0, INVISIBLE, 0, 0, 0, 50, 19, 21, 74, 134, 102, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 143, 134, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 20: Kennel
+{kNStick_2w, kDTdull_2w, 0, AUTO, 29, 11, 0, THING0, INVISIBLE, 0, 0, 0, 30, 20, 89, 120, 83, 116, 0, 0, 5, 3, kCMDstick_2w, 0, 0, 0, FLOATING, 88, 132, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDynamite_2w, kDTtdynamite_2w, 0, AUTO, 0, 0, 0, THING2a, INVISIBLE, 0, 0, 0, 40, 20, 195, 111, 90, 90, 0, 0, 0, 7, kCMDdynamite_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNKennel_2w, 0, 0, AUTO, 97, 40, 0, THING0, INVISIBLE, 0, 0, 0, 50, 20, 195, 114, 173, 73, 0, 0, 0, 0, kCMDkennel_2w, 0, 0, 0, FLOATING, 160, 113, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNDog_2w, kDTtdog_2w, 0, AUTO, 0, 0, 0, THING2f, CYCLE_FORWARD, 0, 2, 0, 30, 20, 184, 80, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 200, 117, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+// Screen 21: (Rockroom)
+{kNRock_2w, 0, 0, AUTO, 60, 36, 0, THING0, INVISIBLE, 0, 0, 0, 30, 21, 89, 120, 216, 63, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 254, 102, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNRope_2w, kDTtrope_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 60, 21, 78, 30, 90, 90, 0, 0, 0, 1, kCMDrope_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 22: (Rockgone)
+{kNRope_2w, kDTtrope_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 60, 22, 78, 30, 90, 90, 0, 0, 0, 1, kCMDrope_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 24: (Lampcave)
+{kNLamp_2w, kDTtlamp_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, 24, 78, 115, 90, 90, 0, 0, 10, 7, kCMDlamp_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 25: (Chasm)
+{kNBanana_2w, kDTtbanana_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 20, 25, 254, 107, 90, 90, 0, 0, 5, 7, kCMDbanana_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNHole_2w, 0, 0, AUTO, 40, 80, 0, THING0, INVISIBLE, 0, 0, 0, 20, 25, 254, 107, 183, 92, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 187, 123, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+// Screen 27: (Ladder)
+{kNGenie_2w, kDTtgenie_2w, 0, AUTO, 0, 0, 0, PERSON3, INVISIBLE, 0, 0, 0, 40, 27, 138, 70, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 28: (Traproom)
+{kNSafe_2w, kDTtsafe_2w, 0, AUTO, 37, 34, 0, THING0, INVISIBLE, 0, 0, 0, 20, 28, 122, 144, 104, 110, 0, 0, 0, 1, kCMDsafe_2w, 0, 0, 0, FLOATING, 106, 145, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNWill_2w, kDTtwill_2w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 28, 122, 144, 90, 90, 0, 0, 5, 7, kCMDwill_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMousehole_2w, 0, 0, AUTO, 5, 5, 0, THING0, INVISIBLE, 0, 0, 0, 20, 28, 122, 144, 164, 132, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 153, 146, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 15, 30, 0, THING0, INVISIBLE, 0, 0, 0, -1, 28, 122, 144, 250, 89, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 222, 141, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+// Screen 30: (Lounge)
+{kNPicture_2w, 0, 0, AUTO, 35, 31, 0, THING0, INVISIBLE, 0, 0, 0, 20, 30, 122, 144, 262, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 55, 55, 0, THING0, INVISIBLE, 0, 0, 0, 20, 30, 122, 144, 163, 86, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 186, 144, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 52, 24, 0, THING0, INVISIBLE, 0, 0, 0, 20, 30, 122, 144, 89, 86, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 93, 142, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 55, 24, 0, THING0, INVISIBLE, 0, 0, 0, 20, 30, 122, 144, 23, 89, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 60, 150, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNPlant_2w, 0, 0, AUTO, 19, 51, 0, THING0, INVISIBLE, 0, 0, 0, 20, 30, 122, 144, 57, 93, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 70, 146, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 31: (Parlor)
+{kNCupb_2w, 0, 0, AUTO, 64, 28, 0, THING0, INVISIBLE, 0, 0, 0, 55, 31, 212, 142, 182, 113, 0, 0, 0, 0, kCMDcupbp_2w, 0, 0, 0, FLOATING, 200, 150, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDoor_2w, kDTdull_2w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, 31, 28, 154, 90, 90, 0, 0, 0, 0, kCMDpdoor_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNAlbum_2w, kDTtalbum_2w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, 255, 212, 142, 90, 90, 0, 0, 5, 1, kCMDalbum_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 32: (Catroom)
+{kNCat_2w, kDTtcat_2w, 0, AUTO, 0, 0, 0, THING2b, CYCLE_FORWARD, 0, 2, 0, 40, 32, 189, 69, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 171, 117, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 27, 24, 0, THING0, INVISIBLE, 0, 0, 0, 20, 32, 122, 144, 106, 68, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 113, 118, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 26, 24, 0, THING0, INVISIBLE, 0, 0, 0, 20, 32, 122, 144, 179, 68, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 189, 118, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNPost_2w, 0, 0, AUTO, 29, 32, 0, THING0, INVISIBLE, 0, 0, 0, 20, 32, 122, 144, 195, 100, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 195, 128, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+// Screen 33: (Boxroom)
+{kNDoor_2w, kDTtbdoor_2w, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 33, 137, 97, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 140, 142, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNPaper_2w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, 80, 33, 205, 147, 90, 90, 0, 0, 5, 7, kCMDpaper_2w, 0, 0, 0, BACKGROUND, 188, 159, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNPencil_2w, kDTtpencil_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, 40, 33, 205, 163, 90, 90, 0, 0, 5, 7, kCMDpencil_2w, 0, 0, 0, FLOATING, 188, 168, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNChute_2w, 0, 0, AUTO, 12, 21, 0, THING0, INVISIBLE, 0, 0, 0, 20, 33, 122, 144, 73, 107, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 114, 149, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNCrate_2w, 0, 0, AUTO, 48, 28, 0, THING0, INVISIBLE, 0, 0, 0, 20, 33, 122, 144, 68, 133, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 114, 149, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+// Screen 34: (Hall3)
+{kNDoor_2w, kDTtdoor_2w, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 34, 234, 73, 90, 90, 0, 0, 0, 1, kCMDdoor2_2w, 0, 0, 0, FLOATING, 240, 121, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDoor_2w, kDTtdoor_2w, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 34, 103, 73, 90, 90, 0, 0, 0, 1, kCMDdoor3_2w, 0, 0, 0, FLOATING, 107, 121, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDoor_2w, kDTtdoordum_2w, 0, AUTO, 16, 56, 0, THING0, INVISIBLE, 0, 0, 0, 50, 34, 80, 40, 73, 92, 0, 0, 0, 1, kCMDdoordum_2w, 0, 0, 0, FLOATING, 90, 148, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNMirror_2w, 0, 0, AUTO, 20, 33, 0, THING0, INVISIBLE, 0, 0, 0, 20, 34, 122, 144, 172, 75, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 175, 125, Common::KEYCODE_UP, 0, 0, 0, 0},
+// Screen 35: (Organ)
+{kNHarry_2w, kDTtharry_2w, 0, AUTO, DX, DY, 0, THING2f, CYCLE_FORWARD, 0, 2, 0, -1, 35, 188, 84, 90, 90, 0, 0, 0, 1, kCMDharry_2w, 0, 0, 0, FLOATING, 216, 132, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 33, 33, 0, THING0, INVISIBLE, 0, 0, 0, 20, 35, 122, 144, 248, 72, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 251, 134, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNPicture_2w, 0, 0, AUTO, 33, 21, 0, THING0, INVISIBLE, 0, 0, 0, 20, 35, 122, 144, 95, 78, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPlant_2w, 0, 0, AUTO, 23, 57, 0, THING0, INVISIBLE, 0, 0, 0, 20, 35, 122, 144, 52, 83, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 83, 138, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNOrgan_2w, 0, 0, AUTO, 65, 66, 0, THING0, INVISIBLE, 0, 0, 0, 20, 35, 122, 144, 162, 62, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 36: (Hestroom)
+{kNHester_2w, kDTthester_2w, 0, AUTO, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, 30, 36, 78, 114, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 70, 150, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNLetter_2w, kDTtletter_2w, 0, AUTO, 19, 6, 0, THING0, INVISIBLE, 0, 0, 0, 30, 36, 110, 150, 106, 132, 0, 0, 0, 1, kCMDletter_2w, 0, 0, 0, FLOATING, 98, 151, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNBookcase_2w, 0, 0, AUTO, 69, 62, 0, THING0, INVISIBLE, 0, 0, 0, 20, 36, 122, 144, 179, 81, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 201, 146, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNPicture_2w, 0, 0, AUTO, 23, 24, 0, THING0, INVISIBLE, 0, 0, 0, 20, 36, 122, 144, 271, 91, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 237, 145, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNPlant_2w, 0, 0, AUTO, 12, 21, 0, THING0, INVISIBLE, 0, 0, 0, 20, 36, 122, 144, 263, 111, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 237, 145, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNWindow_2w, 0, 0, AUTO, 24, 23, 0, THING0, INVISIBLE, 0, 0, 0, 20, 36, 122, 144, 25, 94, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 40, 154, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+// Screen 37: (Retupmoc)
+{kNDoctor_2w, kDTtdoctor_2w, 0, WANDER, DX, DY, kALdoctor_2w, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, 37, 78, 114, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNRobot_2w, 0, trobots_2w, CHASE2, DX, DY, kALrobot_2w, PERSON5, NOT_CYCLING, 0, 0, 0, -1, 37, 78, 114, 90, 90, 0, 0, 0, 9, kCMDrobot_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNScrew_2w, kDTtscrew_2w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 37, 100, 123, 90, 90, 0, 0, 15, 3, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 38: (Hall1 revisited)
+{kNDoor_2w, kDTtdoordum_2w, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 50, 38, 238, 40, 90, 90, 0, 0, 0, 1, kCMDdoordum_2w, 0, 0, 0, FLOATING, 239, 82, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDoor_2w, kDTtdoordum_2w, 0, AUTO, 26, 42, 0, THING0, INVISIBLE, 0, 0, 0, 50, 38, 80, 40, 80, 40, 0, 0, 0, 1, kCMDdoordum_2w, 0, 0, 0, FLOATING, 82, 82, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNDoor_2w, kDTtdoordum_2w, 0, AUTO, 26, 42, 0, THING0, INVISIBLE, 0, 0, 0, 50, 38, 160, 40, 160, 40, 0, 0, 0, 1, kCMDdoordum_2w, 0, 0, 0, FLOATING, 162, 82, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNPicture_2w, 0, 0, AUTO, 32, 18, 0, THING0, INVISIBLE, 0, 0, 0, 20, 38, 122, 144, 187, 113, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 200, 158, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNPlant_2w, 0, 0, AUTO, 25, 43, 0, THING0, INVISIBLE, 0, 0, 0, 20, 38, 122, 144, 239, 111, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 219, 157, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+// Misc:
+{kNCook_2w, kDTtcook_2w, 0, AUTO, DX, DY, 0, PERSON, INVISIBLE, 0, 0, 0, 30, 06, 98, 98, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCookb_2w, kDTtcook_2w, 0, AUTO, 0, 0, 0, THING4, CYCLE_FORWARD, 0, 0, 0, 30, 255, 98, 98, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCop_2w, kDTtcop_2w, 0, AUTO, 0, 0, 0, PERSON2, INVISIBLE, 0, 0, 0, 30, 29, 180, 47, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNHorace_2w, kDTthorace_2w, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 30, 34, 215, 76, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBell_2w, kDTtbell_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, MAZE_SCREEN + 15, 149, 109, 90, 90, 0, 0, 5, 7, kCMDbell_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNGun_2w, 0, tguns_2w, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, MAZE_SCREEN + 26, 149, 109, 90, 90, 0, 0, 10, 15, kCMDgun_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBottle_2w, kDTtbottle_2w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, MAZE_SCREEN + 27, 149, 109, 90, 90, 0, 0, 15, 7, kCMDbottle_2w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+};
+
+uint16 tflask_3w[] = {kDTtflask1_3w, kDTtflask2_3w, kDTtflask3_3w, 0};// Descriptions depend on flask state
+uint16 tcage_3w[] = {kDTtcage1_3w, kDTtcage2_3w, 0};
+
+// The objects data base
+// Note new use of non-image objects: Use old_x, old_y, dx, dy to mark rectangle
+// and use dx <> 0 to allow point & click interface to access them.
+object_t objects_3w[] = {
+//name,description,description_s,path,dx,dy,aptr,SPRITE, cyc, n,frm,rad, scr,x,y ,oldxy,vxy,val,g,cmnd,c,s,ctx,fgb, viewx,viewy,dir
+// Common objects // Set Penny state to 3 to avoid story
+{kNHero_3w, kDTthero_3w, 0, USER, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, 0, 0, 161, 110, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWhero_3w, kDTthero_3w, 0, USER, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 0, 219, 133, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+//#if STORY
+{kNPenny_3w, kDTtpenny_3w, 0, AUTO, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, 0, 109, 110, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+//#else
+//{kNPenny_3w, kDTtpenny_3w, 0, AUTO, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, 0, 109, 110, 90, 90, 0, 0, 0, 1, 0, 0, 3, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+//#endif
+{kNPennylie_3w, kDTtplie_3w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, -1, WEB_3w, 75, 156, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLips_3w, 0, 0, AUTO, 0, 0, 0, THING2, INVISIBLE, 0, 0, 0, 0, 0, 186, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+// CRASH site
+{kNPlane_3w, kDTtplane_3w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, CRASH_3w, 184, 136, 90, 90, 0, 0, 0, 1, kCMDcplane_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDoor_3w, kDTdull_3w, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 80, CRASH_3w, 184, 136, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPlant1_3w, 0, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 0, CRASH_3w, 132, 165, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, OVEROVL, -1, -1, -1, 0, 0, 0, 0},
+// INPLANE
+{kNPlane_3w, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, PLANE_3w, 184, 136, 90, 90, 0, 0, 0, 0, kCMDcexit_3w, 0, 0, 1, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWater_3w, kDTtwwater_3w, 0, AUTO, 195, 10, 0, THING0, INVISIBLE, 0, 0, 0, -1, WFALL_3w, 184, 136, 0, 155, 0, 0, 0, 0, kCMDcwfall_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWaterfall_3w, kDTtwwater_3w, 0, AUTO, 57, 131, 0, THING0, INVISIBLE, 0, 0, 0, -1, WFALL_3w, 184, 136, 239, 22, 0, 0, 0, 0, kCMDcwfall_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWater_3w, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, WFALL_B_3w, 184, 136, 90, 90, 0, 0, 0, 0, kCMDcwfall_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWater_3w, kDTtswater_3w, 0, AUTO, 106, 19, 0, THING0, INVISIBLE, 0, 0, 0, -1, STREAM_3w, 184, 136, 102, 150, 0, 0, 0, 0, kCMDcwstream_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWater_3w, kDTtswater_3w, 0, AUTO, 195, 9, 0, THING0, INVISIBLE, 0, 0, 0, -1, STREAM_3w, 184, 136, 55, 183, 0, 0, 0, 0, kCMDcwstream_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPool_3w, kDTtmwater_3w, 0, AUTO, 87, 34, 0, THING0, INVISIBLE, 0, 0, 0, -1, GARDEN_3w, 184, 136, 112, 129, 0, 0, 0, 0, kCMDcwpool_3w, 0, 0, 0, FLOATING, 155, 170, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNClay_3w, kDTtclay_3w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3w, 162, 96, 90, 90, 0, 0, 5, 7, kCMDcclay_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNNeedles_3w, kDTtneedles_3w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3w, 172, 90, 90, 90, 0, 0, 5, 7, kCMDcpins_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNFlask_3w, 0, tflask_3w, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3w, 190, 90, 90, 90, 0, 0, 5, 11, kCMDcflask_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNBouillon_3w, kDTtbouillon_3w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3w, 185, 94, 90, 90, 0, 0, 5, 7, kCMDcbouillon_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNCheese_3w, kDTtcheese_3w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3w, 185, 100, 90, 90, 0, 0, 5, 1, kCMDccheese_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+// WEB
+{kNSpider_3w, kDTtspider_3w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, WEB_3w, 77, 50, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPlant3_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, WEB_3w, 245, 117, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPlant4_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, WEB_3w, 285, 90, 91, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// BRIDGE
+{kNBlock_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, BRIDGE_3w, 225, 132, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBlock_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, BRIDGE_3w, 225, 133, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBlock_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, BRIDGE_3w, 225, 134, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBlock_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, BRIDGE_3w, 225, 135, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNVine_3w, kDTtvine_3w, 0, AUTO, 8, 76, 0, THING0, INVISIBLE, 0, 0, 0, -1, BRIDGE_3w, 184, 136, 228, 24, 0, 0, 0, 1, kCMDcvine_3w, 0, 0, 0, FLOATING, 237, 131, Common::KEYCODE_UP, 0, 0, 0, 0},
+// STREAM
+{kNVine_3w, kDTtvine_3w, 0, AUTO, 6, 50, 0, THING0, INVISIBLE, 0, 0, 0, -1, STREAM_3w, 184, 136, 101, 96, 0, 0, 0, 1, kCMDcswing_3w, 0, 0, 0, FLOATING, 50, 172, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+{kNVine_3w, kDTtvine_3w, 0, AUTO, 6, 50, 0, THING0, INVISIBLE, 0, 0, 0, -1, STREAM_3w, 184, 136, 203, 96, 0, 0, 0, 1, kCMDcswing_3w, 0, 0, 0, FLOATING, 233, 170, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNSwinger_3w, 0, 0, AUTO, 0, 0, 0, PERSON2, INVISIBLE, 0, 0, 0, 0, STREAM_3w, 219, 133, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNSteps_3w, kDTtsteps_3w, 0, AUTO, 153, 15, 0, THING0, INVISIBLE, 0, 0, 0, -1, STREAM_3w, 184, 136, 79, 168, 0, 0, 0, 1, kCMDcsteps_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// HUT_IN
+{kNDoctor_3w, kDTtdoctor_3w, 0, WANDER, DX, DY, kALdocgot_3w, PERSON3, CYCLE_FORWARD, 0, 0, 0, -1, CAMP_3w, 273, 83, 90, 90, 0, 0, 0, 1, kCMDcdoctor_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDoclie_3w, 0, 0, AUTO, 0, 0, 0, THING2, INVISIBLE, 0, 0, 0, 30, HUT_IN_3w, 239, 103, 90, 90, 0, 0, 0, 1, kCMDcdoctor_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCdoor_3w, kDTdull_3w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 40, HUT_IN_3w, 239, 103, 90, 90, 0, 0, 0, 1, kCMDcdoor_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNMouse_3w, kDTtmouse_3w, 0, AUTO, 0, 0, 0, THING2b, INVISIBLE, 0, 0, 0, 30, HUT_IN_3w, 186, 170, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMoushole_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, HUT_IN_3w, 203, 122, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCage_3w, 0, tcage_3w, AUTO, 0, 0, 0, THING2a, NOT_CYCLING, 0, 0, 0, 30, HUT_IN_3w, 156, 121, 90, 90, 0, 0, 1, 13, kCMDccage_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNFire_1_3w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, HUT_OUT_3w, 127, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_1_3w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, HUT_OUT_3w, 172, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_2_3w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, HUT_IN_3w, 30, 145, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_3_3w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, CAMP_3w, 120, 135, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_3w, 0, 0, AUTO, 42, 54, 0, THING0, INVISIBLE, 0, 0, 0, 50, HUT_IN_3w, 50, 136, 30, 121, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 44, 153, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+{kNWindow_3w, 0, 0, AUTO, 39, 32, 0, THING0, INVISIBLE, 0, 0, 0, 50, HUT_IN_3w, 184, 136, 101, 72, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 111, 148, Common::KEYCODE_UP, 0, 0, 0, 0},
+// CAMP
+{kNNat1_3w, kDTtnative_3w, 0, WANDER, DX, 0, 0, PERSON, NOT_CYCLING, 0, 0, 0, -1, CAMP_3w, 130, 105, 90, 90, 0, 0, 0, 1, kCMDcnative_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNNat2_3w, kDTtnative_3w, 0, AUTO, DX, DY, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, CAMP_3w, 17, 97, 90, 90, 4, 0, 0, 1, kCMDcnative_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNNat3_3w, kDTtnative_3w, 0, AUTO, DX, DY, 0, THING2, CYCLE_FORWARD, 0, 16, 0, -1, CAMP_3w, 96, 40, 90, 90, 0, 0, 0, 1, kCMDcnative_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNNatb_3w, kDTtnative_3w, 0, AUTO, DX, DY, 0, THING2, CYCLE_FORWARD, 0, 20, 0, -1, CAMP_3w, 72, 51, 90, 90, 0, 0, 0, 1, kCMDcnative_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNNatg_3w, kDTtnatgirl_3w, 0, AUTO, DX, DY, kALnative_3w, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, CAMP_3w, 28, 101, 90, 90, 3, 0, 0, 1, kCMDcnative_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPipe_3w, kDTtpipe_3w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 30, CAMP_3w, 225, 135, 90, 90, 0, 0, 0, 7, kCMDcdart_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNHut_3w, 0, 0, AUTO, 47, 64, 0, THING0, INVISIBLE, 0, 0, 0, 50, CAMP_3w, 184, 136, 0, 42, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, 42, 92, Common::KEYCODE_LEFT, 0, 0, 0, 0},
+// PATH_2
+{kNElephant_3w, kDTtelephant_3w, 0, AUTO, 0, 0, 0, THING2a, NOT_CYCLING, 0, 4, 0, -1, PATH_3w, 163, 85, 90, 90, 0, 0, 0, 1, kCMDcelephant_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNE_eyes_3w, 0, 0, AUTO, 0, 0, 0, THING2c, NOT_CYCLING, 0, 0, 0, -1, PATH_3w, 194, 102, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+// Misc
+{kNHero_old_3w, 0, 0, USER, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 0, 161, 120, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNAircraft_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, SUNSET_3w, 250, 116, 90, 90, -2, -1, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNScroll_3w, kDTtscroll_3w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, CLIFFTOP_3w, 75, 116, 90, 90, 0, 0, 3, 7, kCMDcscroll_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNCrystal_3w, kDTtcrystal_3w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 30, TURN_3w, 275, 116, 90, 90, 0, 0, 9, 7, kCMDccrystal_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNRock_3w, kDTtrock_3w, 0, AUTO, 93, 55, 0, THING0, INVISIBLE, 0, 0, 0, -1, TURN_3w, 100, 100, 220, 120, 0, 0, 0, 0, kCMDcrock_3w, 0, 0, 0, FLOATING, 220, 169, Common::KEYCODE_RIGHT, 0, 0, 0, 0},
+// CAVE etc.
+{kNPlant2_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, CAVE_3w, 27, 160, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, OVEROVL, -1, -1, -1, 0, 0, 0, 0},
+{kNGhost_3w, kDTtghost_3w, 0, CHASE, DX, DY, 0, THING2c, NOT_CYCLING, 0, 0, 0, -1, CAVE_3w, 121, 86, 90, 90, 0, 0, 0, 1, kCMDcghost_3w, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBell_3w, kDTtbell_3w, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, CLIFF_3w, 202, 152, 90, 90, 0, 0, 2, 7, kCMDcbell_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNBook_3w, kDTtbook_3w, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 30, STREAM_3w, 275, 116, 90, 90, 0, 0, 10, 7, kCMDcbook_3w, 0, 0, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNCandle_3w, kDTtcandle_3w, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 20, 0, 30, HUT_IN_3w, 77, 134, 90, 90, 0, 0, 3, 7, kCMDccandle_3w, 0, 1, 0, FLOATING, GO_OBJ, -1, -1, 0, 0, 0, 0},
+{kNVine_3w, kDTtvine_3w, 0, AUTO, 5, 53, 0, THING0, INVISIBLE, 0, 0, 0, -1, CAVE_3w, 184, 136, 116, 80, 0, 0, 0, 1, kCMDcswingc_3w, 0, 0, 0, FLOATING, 114, 139, Common::KEYCODE_UP, 0, 0, 0, 0},
+{kNRush_3w, kDTtrush_3w, 0, AUTO, 40, 18, 0, THING0, INVISIBLE, 0, 0, 0, 60, STREAM_3w, 240, 160, 231, 144, 0, 0, 0, 1, kCMDcrush_3w, 0, 0, 0, FLOATING, 240, 160, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+{kNRush_3w, kDTtrush_3w, 0, AUTO, 40, 18, 0, THING0, INVISIBLE, 0, 0, 0, 60, STREAM2_3w, 240, 160, 231, 144, 0, 0, 0, 1, kCMDcrush_3w, 0, 0, 0, FLOATING, 240, 160, Common::KEYCODE_DOWN, 0, 0, 0, 0},
+// OLDMAN (inside cave)
+{kNO_eye_3w, 0, 0, AUTO, 0, 0, 0, THING3, INVISIBLE, 0, 0, 0, 0, OLDMAN_3w, 237, 77, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_4_3w, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, OLDMAN_3w, 65, 56, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMouth_3w, 0, 0, AUTO, 0, 0, 0, THING2, NOT_CYCLING, 0, 0, 0, 0, OLDMAN_3w, 191, 128, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPole_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, CAMP_3w, 126, 35, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPlant5_3w, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, TURN_3w, 65, 139, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+};
+
+object_t objects_1d[] = {
+//name, description, path, dx, dy, aptr, seq, seqp, cyc, n, frm, rad, scr, x, y , oldxy, vxy, val, g, cmnd, c, s, ctx, fgb
+{kNHero_1d, kDTthero_1d, 0, USER, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, 0, 0, 229, 144, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 0: (Outside house)
+{kNDoor_1d, kDTtdoor_1d, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 0, 26, 131, 90, 90, 0, 0, 0, 1, kCMDdoor1_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNEyes_1d, kDTteyes_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 0, 80, 148, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNEyes_1d, kDTteyes_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 0, 59, 78, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNBat_1d, kDTtbat_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 0, 95, 55, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNPkin_1d, kDTtpkin_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 10, 0, 20, 168, 90, 90, 0, 0, 2, 7, kCMDpkin_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNKey_1d, kDTtkey_1d, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 10, 0, 24, 177, 90, 90, 0, 0, 5, 7, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 1: (Hall)
+{kNDoor_1d, kDTtdoor_1d, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 1, 125, 56, 90, 90, 0, 0, 0, 1, kCMDdoor2_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDoor_1d, kDTtdoor_1d, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 1, 208, 56, 90, 90, 0, 0, 0, 1, kCMDdoor3_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNEyes_1d, kDTteyes_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 1, 23, 48, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNEyes_1d, kDTteyes_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, 1, 7, 93, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, BACKGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNCandle_1d, kDTtcandle_1d, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 20, 1, 176, 131, 90, 90, 0, 0, 3, 7, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCupb_1d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 1, 69, 161, 90, 90, 0, 0, 0, 1, kCMDcupb_1d, 0, 0, 1, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNKnife_1d, kDTtknife_1d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 1, 69, 161, 90, 90, 0, 0, 6, 3, kCMDknife_1d, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNWhistle_1d, kDTtwhistle_1d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 1, 69, 161, 90, 90, 0, 0, 6, 3, kCMDwhistle_1d, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+// Screen 2: (Bedroom 1)
+// Note how wardrobe doors are catered for: The wardrobe has a name but no images,
+// the right and left doors have no reference but are cycled by the wardrobe action list
+{kNWard_1d, kDTtward_1d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 1, 4, 4, 30, 2, 172, 113, 90, 90, 0, 0, 0, 1, kCMDward_1d, 0, 0, 1, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNWdoorl_1d, 0, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 0, 2, 150, 56, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWdoorr_1d, 0, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 0, 2, 174, 56, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMask_1d, kDTtmask_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 10, 2, 155, 100, 90, 90, 0, 0, 4, 7, kCMDmask_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMonkey_1d, 0, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 2, 229, 144, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 3: (Dining room)
+{kNButler_1d, kDTtbutler_1d, 0, AUTO, 0, 0, kALbutler_1d, PERSON, NOT_CYCLING, 0, 0, 0, DX, 3, 70, 78, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNChop_1d, kDTtchop_1d, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 20, 3, 69, 161, 90, 90, 0, 0, 8, 7, kCMDchop_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNRedeyes_1d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, 3, 212, 108, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNLips_1d, 0, 0, AUTO, 0, 0, 0, THING2, NOT_CYCLING, 0, 1, 1, 0, 3, 113, 105, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNArm_1d, 0, 0, AUTO, 0, 0, 0, THING2, NOT_CYCLING, 0, 5, 5, 0, 3, 166, 122, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNHdlshero_1d, 0, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 10, 0, 24, 177, 90, 90, 0, 0, 0, 7, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 6: (Garden)
+{kNDoor_1d, kDTtdoor_1d, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 6, 226, 58, 90, 90, 0, 0, 0, 1, kCMDdoor4_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNShed_1d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 60, 6, 277, 39, 90, 90, 0, 0, 0, 1, kCMDshed_1d, 0, 0, 1, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNOilcan_1d, kDTtoilcan_1d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 40, 6, 240, 65, 90, 90, 0, 0, 4, 3, kCMDoilcan_1d, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+// Screen 7: (Store room)
+{kNDog_1d, kDTtdog_1d, 0, AUTO, 0, 0, kALdoggy_1d, ANIMAL, NOT_CYCLING, 0, 0, 0, 20, 7, 105, 119, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCarpet_1d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 50, 7, 191, 142, 90, 90, 0, 0, 0, 0, kCMDcarpet_1d, 0, 0, 0, BACKGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNTrap_1d, 0, 0, AUTO, 0, 0, 0, THING4, INVISIBLE, 0, 2, 2, 20, 7, 216, 140, 90, 90, 0, 0, 0, 1, kCMDtrap_1d, 0, 0, 0, BACKGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNBolt_1d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 7, 220, 145, 90, 90, 0, 0, 0, 1, kCMDbolt_1d, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNHerodead_1d, 0, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 10, 0, 24, 177, 90, 90, 0, 0, 0, 7, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 9: (Batcave)
+{kNBat_1d, kDTtbat_1d, 0, AUTO, 0, 0, kALbats_1d, THING1, NOT_CYCLING, 0, 0, 0, 16, 9, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBat_1d, kDTtbat_1d, 0, AUTO, 0, 0, kALbats_1d, THING1, NOT_CYCLING, 0, 0, 0, 16, 9, 55, 65, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBat_1d, kDTtbat_1d, 0, AUTO, 0, 0, kALbats_1d, THING1, NOT_CYCLING, 0, 0, 0, 16, 9, 55, 120, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBat_1d, kDTtbat_1d, 0, AUTO, 0, 0, kALbats_1d, THING1, NOT_CYCLING, 0, 0, 0, 16, 9, 55, 130, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 10: (Mummy room)
+{kNMummy_1d, 0, 0, AUTO, 0, 0, kALmummy_1d, PERSON, NOT_CYCLING, 0, 0, 0, DX, 10, 256, 77, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMdoor_1d, 0, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 0, 10, 258, 55, 90, 90, 0, 0, 0, 1, kCMDdoor4_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNGold_1d, kDTtgold_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 20, 10, 208, 152, 90, 90, 0, 0, 10, 7, kCMDgold_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 11: (Lakeroom)
+{kNBoat_1d, kDTtboat_1d, 0, AUTO, 0, 0, 0, THING2c, NOT_CYCLING, 0, 0, 0, 30, 11, 230, 118, 90, 90, 0, 0, 0, 1, kCMDboat_1d, 0, 0, 1, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNRope_1d, kDTtrope_1d, 0, AUTO, 0, 0, 0, THING2c, NOT_CYCLING, 0, 0, 0, 30, 11, 220, 132, 90, 90, 0, 0, 0, 1, kCMDrope_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNOldman_1d, kDTtoldman_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, 11, 160, 38, 90, 90, 0, 0, 0, 1, kCMDoldman_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWhero_1d, 0, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 11, 100, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 12: (Dead end)
+{kNGuard_1d, kDTtguard_1d, 0, AUTO, 0, 0, 0, THING2d, NOT_CYCLING, 0, 0, 0, -1, 12, 147, 39, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 15: (Laboratory)
+{kNProf_1d, kDTtprof_1d, 0, AUTO, 0, 0, 0, PERSON2, CYCLE_FORWARD, 0, 0, 0, -1, 1, 150, 55, 90, 90, DX, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNIgor_1d, kDTtigor_1d, 0, AUTO, 0, 0, 0, PERSON2, CYCLE_FORWARD, 0, 0, 0, -1, 15, 180, 122, 90, 90, DX, 0, 0, 1, kCMDigor_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBung_1d, kDTtbung_1d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 14, 15, 75, 145, 90, 90, 0, 0, 11, 7, kCMDbung_1d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNGdoor_1d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, 15, 59, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNSpachero_1d, 0, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 15, 100, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFuzyhero_1d, 0, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 15, 100, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNArc_1d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, 15, 106, 74, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0}
+};
+
+object_t objects_2d[] = {
+//name,description, path,dx,dy,aptr,seq,seqp, cyc,n,frm,rad,scr,x,y ,oldxy,vxy,val,g,cmnd,c,s,ctx,fgb
+{kNHero_2d, kDTthero_2d, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 0, 319, 199, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPenny_2d, kDTtpenny_2d, 0, AUTO, 0, 0, 0, PERSON, NOT_CYCLING, 0, 0, 0, -1, 1, 109, 140, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 0: (Outside house)
+{kNSmoke_2d, 0, 0, AUTO, 0, 0, 0, THING3, CYCLE_FORWARD, 0, 2, 0, 0, 0, 233, 20, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 1: (Hall)
+{kNDoor_2d, kDTtdoor_2d, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 1, 238, 40, 90, 90, 0, 0, 0, 1, kCMDdoor1_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLips_2d, 0, 0, AUTO, 0, 0, 0, THING2, INVISIBLE, 0, 0, 0, 0, 1, 186, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNMaid_2d, kDTtmaid_2d, 0, AUTO, 0, 0, 0, PERSON4, NOT_CYCLING, 0, 0, 0, 8, 1, 149, 135, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 2: (Bedroom 1)
+{kNPennylie_2d, 0, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 10, 2, 24, 177, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, OVEROVL, -1, -1, -1, 0, 0, 0, 0},
+{kNPenfall_2d, 0, 0, AUTO, 0, 0, 0, THING2, INVISIBLE, 0, 0, 0, 10, 2, 24, 177, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBookcase_2d, kDTtbookcase_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, -1, 2, 70, 81, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBook_2d, kDTtbook_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 10, 2, 90, 140, 90, 90, 0, 0, 0, 1, kCMDbook_2d, 0, 0, 1, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNKeyhole_2d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 10, 2, 28, 166, 90, 90, 0, 0, 0, 0, kCMDkeyhole_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 3: (Bedroom 2)
+{kNPanel_2d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, -1, 3, 189, 91, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNCupb_2d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, 3, 135, 142, 90, 90, 0, 0, 0, 0, kCMDlookdesk_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBird_2d, kDTtbird_2d, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, -1, 3, 186, 100, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNMatches_2d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, 20, -1, 78, 30, 90, 90, 0, 0, 5, 7, kCMDmatches_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDumb_2d, kDTtdumb_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 3, 72, 138, 90, 90, 0, 0, 0, 1, kCMDdumb_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 4: (Keyhole)
+{kNMurder_2d, 0, 0, AUTO, 0, 0, 0, THING2e, CYCLE_FORWARD, 1, 2, 16, -1, 4, 141, 76, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 5: (Bed3)
+{kNBalloon_2d, kDTtballoon_2d, 0, WANDER, DX/2, DY/2, 0, THING1, NOT_CYCLING, 0, 0, 0, 50, 5, 180, 40, 90, 90, 0, 0, 0, 1, kCMDballoon_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 6: (Kitchen)
+{kNDumb_2d, kDTtdumb_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 6, 35, 152, 90, 90, 0, 0, 0, 1, kCMDdumb_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCupb_2d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, 6, 135, 142, 90, 90, 0, 0, 0, 0, kCMDlookcupb_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNGarlic_2d, kDTtgarlic_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 20, -1, 78, 30, 90, 90, 0, 0, 5, 7, kCMDgarlic_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDoor_2d, kDTdull_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, 6, 290, 196, 90, 90, 0, 0, 0, 0, kCMDkdoor_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 8: (Shed)
+{kNGardner_2d, kDTtgardner_2d, 0, WANDER, DX, DY, 0, PERSON2, CYCLE_FORWARD, 0, 0, 0, -1, 8, 250, 90, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 9: In shed
+{kNButton_2d, kDTtbutton_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 90, 90, 0, 0, 0, 1, kCMDbutton_2d, 0, 1, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNRed_2d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 90, 90, 0, 0, 0, 1, kCMDred_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNYellow_2d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 90, 90, 0, 0, 0, 1, kCMDyellow_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNGreen_2d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 90, 90, 0, 0, 0, 1, kCMDgreen_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBlue_2d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 30, 9, 190, 137, 90, 90, 0, 0, 0, 1, kCMDblue_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNShedlight_2d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, -1, 9, 161, 48, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 10: Venus fly traps
+{kNMagnify_2d, kDTtmagnify_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 20, 10, 95, 96, 90, 90, 0, 0, 15, 7, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFly_2d, 0, 0, WANDER2, DX, DY, 0, THING2, NOT_CYCLING, 0, 1, 0, 20, 10, 48, 60, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFly_2d, 0, 0, WANDER2, DX, DY, 0, THING2, NOT_CYCLING, 0, 1, 0, 20, 10, 58, 70, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFly_2d, 0, 0, WANDER2, DX, DY, 0, THING2, NOT_CYCLING, 0, 1, 0, 20, 10, 268, 90, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLeaf_2d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 0, 20, 10, 48, 86, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLeaf_2d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 2, 0, 20, 10, 79, 104, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLeaf_2d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 0, 20, 10, 71, 141, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLeaf_2d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 3, 0, 20, 10, 116, 113, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLeaf_2d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 1, 20, 10, 164, 120, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLeaf_2d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 2, 0, 20, 10, 185, 83, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLeaf_2d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 0, 20, 10, 232, 96, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLeaf_2d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 1, 0, 20, 10, 273, 141, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 11: Gates
+{kNGatelight_2d, 0, 0, AUTO, 0, 0, 0, THING1, ALMOST_INVISIBLE, 1, 0, 0, -1, 11, 90, 72, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 13: Stream
+{kNCatnip_2d, kDTdull_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, 13, 211, 136, 90, 90, 0, 0, 5, 3, kCMDcatnip_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 14: Zapper
+{kNZapper_2d, kDTtzapper_2d, 0, AUTO, 0, 0, 0, THING1, ALMOST_INVISIBLE, 1, 0, 0, -1, 14, 134, 46, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2d, kDTtbug_2d, 0, AUTO, 0, 0, kALbugs_2d, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2d, kDTtbug_2d, 0, AUTO, 0, 0, kALbugs_2d, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2d, kDTtbug_2d, 0, AUTO, 0, 0, kALbugs_2d, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2d, kDTtbug_2d, 0, AUTO, 0, 0, kALbugs_2d, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBug_2d, kDTtbug_2d, 0, AUTO, 0, 0, kALbugs_2d, THING2, CYCLE_FORWARD, 0, 0, 0, 16, 14, 65, 25, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 15: Mushroom
+{kNOldman_2d, kDTtoldman_2d, 0, AUTO, 0, 0, 0, THING2c, NOT_CYCLING, 1, 0, 0, -1, 15, 126, 77, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 16: Well
+{kNWell_2d, kDTtwell_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 30, 16, 211, 136, 90, 90, 0, 0, 0, 1, kCMDwell_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 17: Snakepit
+{kNSnake_2d, kDTtsnake_2d, 0, CHASE2, DX, DY, kALsnake_2d, PERSON2, CYCLE_FORWARD, 0, 0, 0, 16, 17, 165, 95, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 18: Phonebox
+{kNTardis_2d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 50, 18, 21, 74, 90, 90, 0, 0, 0, 0, kCMDtardis_2d, 0, 0, 1, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 20: Kennel
+{kNStick_2d, kDTdull_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 30, 20, 89, 120, 90, 90, 0, 0, 5, 3, kCMDstick_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDynamite_2d, kDTtdynamite_2d, 0, AUTO, 0, 0, 0, THING2a, INVISIBLE, 0, 0, 0, 30, 20, 200, 100, 90, 90, 0, 0, 0, 7, kCMDdynamite_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNKennel_2d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 20, 195, 114, 90, 90, 0, 0, 0, 0, kCMDkennel_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDog_2d, kDTtdog_2d, 0, AUTO, 0, 0, 0, THING2f, CYCLE_FORWARD, 0, 2, 0, 30, 20, 184, 80, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 21: (Rockroom)
+{kNRope_2d, kDTtrope_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 60, 21, 78, 30, 90, 90, 0, 0, 0, 1, kCMDrope_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 22: (Rockgone)
+{kNRope_2d, kDTtrope_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 60, 22, 78, 30, 90, 90, 0, 0, 0, 1, kCMDrope_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 24: (Lampcave)
+{kNLamp_2d, kDTtlamp_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, 24, 78, 114, 90, 90, 0, 0, 10, 7, kCMDlamp_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 25: (Chasm)
+{kNBanana_2d, kDTtbanana_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 20, 25, 254, 107, 90, 90, 0, 0, 5, 7, kCMDbanana_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 27: (Ladder)
+{kNGenie_2d, kDTtgenie_2d, 0, AUTO, 0, 0, 0, PERSON3, INVISIBLE, 0, 0, 0, 30, 27, 138, 70, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 28: (Traproom)
+{kNSafe_2d, kDTtsafe_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 28, 122, 144, 90, 90, 0, 0, 0, 1, kCMDsafe_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWill_2d, kDTtwill_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 28, 122, 144, 90, 90, 0, 0, 5, 7, kCMDwill_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 31: (Parlor)
+{kNCupb_2d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, 31, 212, 142, 90, 90, 0, 0, 0, 0, kCMDcupbp_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDoor_2d, kDTdull_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, 31, 28, 154, 90, 90, 0, 0, 0, 0, kCMDpdoor_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNAlbum_2d, kDTtalbum_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 55, -1, 212, 142, 90, 90, 0, 0, 5, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 32: (Catroom)
+{kNCat_2d, kDTdull_2d, 0, AUTO, 0, 0, 0, THING2b, CYCLE_FORWARD, 0, 2, 0, 40, 32, 189, 69, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 33: (Boxroom)
+{kNDoor_2d, kDTtbdoor_2d, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 33, 137, 97, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPaper_2d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, 20, 33, 205, 147, 90, 90, 0, 0, 5, 7, kCMDpaper_2d, 0, 0, 0, BACKGROUND, -1, -1, -1, 0, 0, 0, 0},
+{kNPencil_2d, kDTdull_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 1, 0, 0, 20, 33, 205, 163, 90, 90, 0, 0, 5, 7, kCMDpencil_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 34: (Hall3)
+{kNDoor_2d, kDTtdoor_2d, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 34, 234, 73, 90, 90, 0, 0, 0, 1, kCMDdoor2_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDoor_2d, kDTtdoor_2d, 0, AUTO, 0, 0, 0, THING4, NOT_CYCLING, 1, 4, 4, 16, 34, 103, 73, 90, 90, 0, 0, 0, 1, kCMDdoor3_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 35: (Organ)
+{kNHarry_2d, kDTtharry_2d, 0, AUTO, DX, DY, 0, THING2g, CYCLE_FORWARD, 0, 2, 0, -1, 35, 188, 84, 90, 90, 0, 0, 0, 1, kCMDharry_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 36: (Hestroom)
+{kNHester_2d, kDTthester_2d, 0, AUTO, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, 30, 36, 78, 114, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLetter_2d, kDTtletter_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 30, 36, 110, 150, 90, 90, 0, 0, 0, 1, kCMDletter_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Screen 37: (Retupmoc)
+{kNDoctor_2d, kDTtdoctor_2d, 0, WANDER, DX, DY, kALdoctor_2d, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, 37, 78, 114, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDalek_2d, kDTtdalek_2d, 0, CHASE2, DX, DY, kALdalek_2d, PERSON5, NOT_CYCLING, 0, 0, 0, -1, 37, 78, 114, 90, 90, 0, 0, 0, 1, kCMDgun_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNScrew_2d, kDTtscrew_2d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 20, 37, 100, 123, 90, 90, 0, 0, 15, 3, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// Misc:
+{kNCook_2d, kDTtcook_2d, 0, AUTO, DX, DY, 0, PERSON, INVISIBLE, 0, 0, 0, 30, 06, 98, 98, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCookb_2d, kDTtcook_2d, 0, AUTO, 0, 0, 0, THING4, CYCLE_FORWARD, 0, 0, 0, 30, -1, 98, 98, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCop_2d, kDTtcop_2d, 0, AUTO, 0, 0, 0, PERSON2, INVISIBLE, 0, 0, 0, 30, 29, 180, 47, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNHorace_2d, kDTthorace_2d, 0, AUTO, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 30, 34, 215, 76, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBell_2d, kDTtbell_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, MAZE_SCREEN + 15, 149, 109, 90, 90, 0, 0, 5, 7, kCMDbell_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNGun_2d, kDTtgun_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, MAZE_SCREEN + 26, 149, 109, 90, 90, 0, 0, 10, 7, kCMDgun_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBottle_2d, kDTtbottle_2d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, MAZE_SCREEN + 27, 149, 109, 90, 90, 0, 0, 15, 7, kCMDbottle_2d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+};
+
+object_t objects_3d[] = {
+//name,description,path,dx,dy,aptr,SPRITE, cyc, n,frm,rad, scr,x,y ,oldxy,vxy,val,g,cmnd,c,s,ctx,fgb
+// Common objects // Set Penny state to 3 to avoid story
+{kNHero_3d, kDTthero_3d, 0, USER, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, 0, 0, 161, 110, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWhero_3d, kDTthero_3d, 0, USER, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 0, 219, 133, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+//#if NO_STORY
+//{kNPenny_3d, kDTtpenny_3d, 0, AUTO, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, 0, 109, 110, 90, 90, 0, 0, 0, 1, 0, 0, 3, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+//#else
+{kNPenny_3d, kDTtpenny_3d, 0, AUTO, 0, 0, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, 0, 109, 110, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+//#endif
+{kNPennylie_3d, 0, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, -1, WEB_3d, 75, 156, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNLips_3d, 0, 0, AUTO, 0, 0, 0, THING2, INVISIBLE, 0, 0, 0, 0, 0, 186, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+// CRASH site
+{kNPlane_3d, kDTtplane_3d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, CRASH_3d, 184, 136, 90, 90, 0, 0, 0, 1, kCMDcplane_3d, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDoor_3d, kDTdull_3d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, 80, CRASH_3d, 184, 136, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0, FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPlant1_3d, 0, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 0, CRASH_3d, 132, 165, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, OVEROVL, -1, -1, -1, 0, 0, 0, 0},
+// INPLANE
+{kNPlane_3d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, PLANE_3d, 184, 136, 90, 90, 0, 0, 0, 0, kCMDcexit_3d, 0, 0, 1,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWater_3d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, WFALL_3d, 184, 136, 90, 90, 0, 0, 0, 0, kCMDcwfall_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWater_3d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, WFALL_B_3d, 184, 136, 90, 90, 0, 0, 0, 0, kCMDcwfall_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWater_3d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, STREAM_3d, 184, 136, 90, 90, 0, 0, 0, 0, kCMDcwstream_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNWater_3d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, GARDEN_3d, 184, 136, 90, 90, 0, 0, 0, 0, kCMDcwpool_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNClay_3d, kDTtclay_3d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3d, 162, 96, 90, 90, 0, 0, 5, 7, kCMDcclay_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNNeedles_3d, kDTtneedles_3d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3d, 172, 90, 90, 90, 0, 0, 5, 7, kCMDcpins_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFlask_3d, kDTtflask_3d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3d, 190, 90, 90, 90, 0, 0, 5, 7, kCMDcflask_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBouillon_3d, kDTtbouillon_3d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3d, 185, 94, 90, 90, 0, 0, 5, 7, kCMDcbouillon_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCheese_3d, kDTtcheese_3d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, PLANE_3d, 185, 100, 90, 90, 0, 0, 5, 1, kCMDccheese_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// WEB
+{kNSpider_3d, kDTtspider_3d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, WEB_3d, 77, 50, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPlant3_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, WEB_3d, 245, 117, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPlant4_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, WEB_3d, 285, 90, 91, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// BRIDGE
+{kNBlock_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, BRIDGE_3d, 225, 133, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBlock_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, BRIDGE_3d, 225, 134, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBlock_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, BRIDGE_3d, 225, 135, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNVine_3d, kDTtvine_3d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, BRIDGE_3d, 184, 136, 90, 90, 0, 0, 0, 1, kCMDcvine_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// STREAM
+{kNVine_3d, kDTtvine_3d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, STREAM_3d, 184, 136, 90, 90, 0, 0, 0, 1, kCMDcswing_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNSwinger_3d, 0, 0, AUTO, 0, 0, 0, PERSON2, INVISIBLE, 0, 0, 0, 0, STREAM_3d, 219, 133, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// HUT_IN
+{kNDoctor_3d, kDTtdoctor_3d, 0, WANDER, DX, DY, kALdocgot_3d, PERSON3, CYCLE_FORWARD, 0, 0, 0, -1, CAMP_3d, 273, 83, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNDoclie_3d, 0, 0, AUTO, 0, 0, 0, THING2, INVISIBLE, 0, 0, 0, 30, HUT_IN_3d, 239, 103, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCdoor_3d, kDTdull_3d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 40, HUT_IN_3d, 239, 103, 90, 90, 0, 0, 0, 1, kCMDcdoor_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMouse_3d, kDTtmouse_3d, 0, AUTO, 0, 0, 0, THING2b, INVISIBLE, 0, 0, 0, 30, HUT_IN_3d, 186, 170, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMoushole_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, HUT_IN_3d, 203, 122, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCage_3d, kDTtcage_3d, 0, AUTO, 0, 0, 0, THING2a, NOT_CYCLING, 0, 0, 0, 30, HUT_IN_3d, 156, 121, 90, 90, 0, 0, 1, 5, kCMDccage_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_1_3d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, HUT_OUT_3d, 127, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_1_3d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, HUT_OUT_3d, 172, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_2_3d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, HUT_IN_3d, 30, 145, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_3_3d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, CAMP_3d, 120, 135, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// CAMP
+{kNNat1_3d, kDTtnative_3d, 0, WANDER, DX, 0, 0, PERSON, NOT_CYCLING, 0, 0, 0, -1, CAMP_3d, 130, 105, 90, 90, 0, 0, 0, 1, kCMDcnative_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNNat2_3d, kDTtnative_3d, 0, AUTO, DX, DY, 0, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, CAMP_3d, 17, 97, 90, 90, 4, 0, 0, 1, kCMDcnative_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNNat3_3d, kDTtnative_3d, 0, AUTO, DX, DY, 0, THING2, CYCLE_FORWARD, 0, 16, 0, -1, CAMP_3d, 96, 40, 90, 90, 0, 0, 0, 1, kCMDcnative_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNNatb_3d, kDTtnative_3d, 0, AUTO, DX, DY, 0, THING2, CYCLE_FORWARD, 0, 20, 0, -1, CAMP_3d, 72, 51, 90, 90, 0, 0, 0, 1, kCMDcnative_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNNatg_3d, kDTtnatgirl_3d, 0, AUTO, DX, DY, kALnative_3d, PERSON, CYCLE_FORWARD, 0, 0, 0, -1, CAMP_3d, 28, 101, 90, 90, 3, 0, 0, 1, kCMDcnative_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPipe_3d, kDTtpipe_3d, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 30, CAMP_3d, 225, 135, 90, 90, 0, 0, 0, 7, kCMDcdart_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// PATH_2
+{kNElephant_3d, kDTtelephant_3d, 0, AUTO, 0, 0, 0, THING2a, NOT_CYCLING, 0, 4, 0, -1, PATH_3d, 163, 85, 90, 90, 0, 0, 0, 1, kCMDcdart_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNE_eyes_3d, 0, 0, AUTO, 0, 0, 0, THING2c, NOT_CYCLING, 0, 0, 0, -1, PATH_3d, 194, 102, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FOREGROUND, -1, -1, -1, 0, 0, 0, 0},
+// Misc
+{kNHero_old_3d, 0, 0, USER, 0, 0, 0, PERSON, INVISIBLE, 0, 0, 0, 0, 0, 161, 120, 90, 90, 0, 0, 0, 1, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNAircraft_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, -1, SUNSET_3d, 275, 116, 90, 90, -2, -1, 0, 1, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNScroll_3d, kDTtscroll_3d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, CLIFFTOP_3d, 75, 116, 90, 90, 0, 0, 3, 7, kCMDcscroll_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCrystal_3d, kDTtcrystal_3d, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 30, TURN_3d, 275, 116, 90, 90, 0, 0, 9, 7, kCMDccrystal_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNRock_3d, 0, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, TURN_3d, 100, 100, 90, 90, 0, 0, 0, 0, kCMDcrock_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// CAVE etc.
+{kNPlant2_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, CAVE_3d, 27, 160, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,OVEROVL, -1, -1, -1, 0, 0, 0, 0},
+{kNGhost_3d, kDTtghost_3d, 0, CHASE, DX, DY, 0, THING2c, NOT_CYCLING, 0, 0, 0, -1, CAVE_3d, 121, 86, 90, 90, 0, 0, 0, 1, kCMDcghost_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBell_3d, kDTtbell_3d, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 30, CLIFF_3d, 202, 152, 90, 90, 0, 0, 2, 7, kCMDcbell_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNBook_3d, kDTtbook_3d, 0, AUTO, 0, 0, 0, THING1, INVISIBLE, 0, 0, 0, 30, STREAM_3d, 275, 116, 90, 90, 0, 0, 10, 7, kCMDcbook_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNCandle_3d, kDTtcandle_3d, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 20, 0, 30, HUT_IN_3d, 77, 134, 90, 90, 0, 0, 3, 7, kCMDccandle_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNVine_3d, kDTtvine_3d, 0, AUTO, 0, 0, 0, THING0, INVISIBLE, 0, 0, 0, -1, CAVE_3d, 184, 136, 90, 90, 0, 0, 0, 1, kCMDcswingc_3d, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+// OLDMAN (inside cave)
+{kNO_eye_3d, 0, 0, AUTO, 0, 0, 0, THING3, INVISIBLE, 0, 0, 0, 0, OLDMAN_3d, 237, 77, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNFire_4_3d, 0, 0, AUTO, 0, 0, 0, THING2, CYCLE_FORWARD, 0, 0, 0, 0, OLDMAN_3d, 65, 56, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNMouth_3d, 0, 0, AUTO, 0, 0, 0, THING2, NOT_CYCLING, 0, 0, 0, 0, OLDMAN_3d, 191, 128, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPole_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, CAMP_3d, 126, 35, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+{kNPlant5_3d, 0, 0, AUTO, 0, 0, 0, THING1, NOT_CYCLING, 0, 0, 0, 0, TURN_3d, 65, 139, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0,FLOATING, -1, -1, -1, 0, 0, 0, 0},
+};
+
+// Hugo 1 Win
+int rep1_1w[] = {kSTsrep1_1w, -1};
+int rep2_1w[] = {kSTsrep2_1w, -1};
+int rep3_1w[] = {kSTsrep3_1w, -1};
+int rep4_1w[] = {kSTsrep4_1w, -1};
+int rep5_1w[] = {kSTsrep5_1w, -1};
+int rep6_1w[] = {kSTsrep6_1w, -1};
+int rep7_1w[] = {kSTsrep7_1w, -1};
+int openrep_1w[] = {kSTsopenr_1w, -1};
+
+// Action lists (suffix with 0)
+// These are the various actions, referred to in the command lists and/or
+// referenced directly as part of screen actions
+act0 areplight_1w = {ASCHEDULE, 11 * NORMAL_TPS, kALightning_1w};
+act0 arepeye_1w = {ASCHEDULE, 8 * NORMAL_TPS, kALblinkeyes1_1w};
+act0 arepbat_1w = {ASCHEDULE, 12 * NORMAL_TPS, kALbat_1w};
+act0 arepeye2_1w = {ASCHEDULE, 8 * NORMAL_TPS, kALblinkeyes2_1w};
+act0 arepredeye_1w = {ASCHEDULE, 6 * NORMAL_TPS, kALrepredeye_1w};
+act0 areplips_1w = {ASCHEDULE, 4 * NORMAL_TPS, kALreplips_1w};
+act0 areparm_1w = {ASCHEDULE, 5 * NORMAL_TPS, kALreparm_1w};
+act0 adead_1w = {ASCHEDULE, 0, kALdead_1w};
+act0 arepbata_1w = {ASCHEDULE, 3 * NORMAL_TPS, kALbatrep_1w};
+act0 ajailrep_1w = {ASCHEDULE, 4, kALjailrep_1w};
+act0 aend_1w = {ASCHEDULE, 4 * NORMAL_TPS, kALend_1w};
+act0 arepbox_1w = {ASCHEDULE, NORMAL_TPS, kALbox_1w};
+act0 aweird_1w = {ASCHEDULE, 16, kALweird_1w};
+act0 acycle_1w = {ASCHEDULE, 0, kALcycle_1w};
+
+act1 aopendoor1a_1w = {START_OBJ, NORMAL_TPS, DOOR1_1w, 1, CYCLE_FORWARD};
+act1 aclosedoor1_1w = {START_OBJ, NORMAL_TPS, DOOR1_1w, 1, CYCLE_BACKWARD};
+act1 ablink1a_1w = {START_OBJ, 0, EYES1_1w, 0, INVISIBLE};
+act1 ablink1b_1w = {START_OBJ, 1, EYES1_1w, 0, NOT_CYCLING};
+act1 ablink1c_1w = {START_OBJ, 2, EYES1_1w, 0, INVISIBLE};
+act1 ablink1d_1w = {START_OBJ, 3, EYES1_1w, 0, NOT_CYCLING};
+act1 ablink2a_1w = {START_OBJ, 3 * NORMAL_TPS, EYES2_1w, 0, INVISIBLE};
+act1 ablink2b_1w = {START_OBJ, 3 * NORMAL_TPS + 1, EYES2_1w, 0, NOT_CYCLING};
+act1 ablink2c_1w = {START_OBJ, 3 * NORMAL_TPS + 2, EYES2_1w, 0, INVISIBLE};
+act1 ablink2d_1w = {START_OBJ, 3 * NORMAL_TPS + 3, EYES2_1w, 0, NOT_CYCLING};
+act1 aridpkin_1w = {START_OBJ, 0, PKIN_1w, 0, INVISIBLE};
+act1 ashowkey_1w = {START_OBJ, 0, KEY_1w, 0, NOT_CYCLING};
+act1 aridprof_1w = {START_OBJ, 130 / DX, PROF_1w, 0, INVISIBLE};
+act1 aopendoor2_1w = {START_OBJ, 0, DOOR2_1w, 1, CYCLE_FORWARD};
+act1 aopendoor3_1w = {START_OBJ, 0, DOOR3_1w, 1, CYCLE_FORWARD};
+act1 ablink3a_1w = {START_OBJ, 0, EYES3_1w, 0, INVISIBLE};
+act1 ablink3b_1w = {START_OBJ, 1, EYES3_1w, 0, NOT_CYCLING};
+act1 ablink3c_1w = {START_OBJ, 2, EYES3_1w, 0, INVISIBLE};
+act1 ablink3d_1w = {START_OBJ, 3, EYES3_1w, 0, NOT_CYCLING};
+act1 ablink4a_1w = {START_OBJ, 3 * NORMAL_TPS, EYES4_1w, 0, INVISIBLE};
+act1 ablink4b_1w = {START_OBJ, 3 * NORMAL_TPS + 1, EYES4_1w, 0, NOT_CYCLING};
+act1 ablink4c_1w = {START_OBJ, 3 * NORMAL_TPS + 2, EYES4_1w, 0, INVISIBLE};
+act1 ablink4d_1w = {START_OBJ, 3 * NORMAL_TPS + 3, EYES4_1w, 0, NOT_CYCLING};
+act1 a115b_1w = {START_OBJ, 0, MASK_1w, 0, NOT_CYCLING};
+act1 acupknife_1w = {START_OBJ, 0, KNIFE_1w, 0, NOT_CYCLING};
+act1 acupwhist_1w = {START_OBJ, 0, WHISTLE_1w, 0, NOT_CYCLING};
+act1 aopenwdoorl_1w = {START_OBJ, NORMAL_TPS, WDOORL_1w, 1, CYCLE_FORWARD};
+act1 aopenwdoorr_1w = {START_OBJ, NORMAL_TPS, WDOORR_1w, 1, CYCLE_FORWARD};
+act1 aopenwd1_1w = {START_OBJ, NORMAL_TPS, MASK_1w, 1, NOT_CYCLING};
+act1 aclosewdoorl_1w = {START_OBJ, NORMAL_TPS, WDOORL_1w, 1, CYCLE_BACKWARD};
+act1 aclosewdoorr_1w = {START_OBJ, NORMAL_TPS, WDOORR_1w, 1, CYCLE_BACKWARD};
+act1 abut1_1w = {START_OBJ, 4 * NORMAL_TPS, BUTLER_1w, 0, CYCLE_FORWARD};
+act1 abut6d_1w = {START_OBJ, 7, HERO, 0, INVISIBLE};
+act1 abut6f_1w = {START_OBJ, 7, HDLSHERO_1w, 0, NOT_CYCLING};
+act1 ashowchop_1w = {START_OBJ, 0, CHOP_1w, 0, NOT_CYCLING};
+act1 aridchop_1w = {START_OBJ, 0, CHOP_1w, 0, INVISIBLE};
+act1 adogcyc_1w = {START_OBJ, 0, DOG_1w, 0, CYCLE_FORWARD};
+act1 ablink5a_1w = {START_OBJ, 0, REDEYES_1w, 0, INVISIBLE};
+act1 ablink5b_1w = {START_OBJ, 1, REDEYES_1w, 0, NOT_CYCLING};
+act1 ablink5c_1w = {START_OBJ, 2, REDEYES_1w, 0, INVISIBLE};
+act1 ablink5d_1w = {START_OBJ, 3, REDEYES_1w, 0, NOT_CYCLING};
+act1 alips_1w = {START_OBJ, 0, LIPS_1w, 6, CYCLE_FORWARD};
+act1 aarm_1w = {START_OBJ, 0, ARM_1w, 3, CYCLE_BACKWARD};
+act1 aopendoor4_1w = {START_OBJ, 0, DOOR4_1w, 1, CYCLE_FORWARD};
+act1 aclosedoor4_1w = {START_OBJ, 0, DOOR4_1w, 1, CYCLE_BACKWARD};
+act1 adog1_1w = {START_OBJ, 0, DOG_1w, 0, CYCLE_FORWARD};
+act1 adead1_1w = {START_OBJ, 0, HERO, 0, INVISIBLE};
+act1 adead3_1w = {START_OBJ, 0, HERODEAD_1w, 0, NOT_CYCLING};
+act1 amovecarp1_1w = {START_OBJ, 0, CARPET_1w, 0, INVISIBLE};
+act1 amovecarp2_1w = {START_OBJ, 0, TRAP_1w, 0, NOT_CYCLING};
+act1 aopentrap_1w = {START_OBJ, NORMAL_TPS, TRAP_1w, 1, CYCLE_FORWARD};
+act1 aclosetrap_1w = {START_OBJ, NORMAL_TPS, TRAP_1w, 1, CYCLE_BACKWARD};
+act1 amdoor1_1w = {START_OBJ, NORMAL_TPS, MDOOR_1w, 1, CYCLE_FORWARD};
+act1 amdoor2_1w = {START_OBJ, 3 * NORMAL_TPS, MDOOR_1w, 0, INVISIBLE};
+act1 amum1_1w = {START_OBJ, 2 * NORMAL_TPS, MUMMY_1w, 0, CYCLE_FORWARD};
+act1 arock2_1w = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 arock7_1w = {START_OBJ, 20, HERO, 0, NOT_CYCLING};
+act1 arock9_1w = {START_OBJ, 40, HERO, 0, CYCLE_FORWARD};
+act1 arock14_1w = {START_OBJ, 55, HERO, 0, NOT_CYCLING};
+act1 abin2_1w = {START_OBJ, 0, HERO, 0, INVISIBLE};
+act1 aridbung_1w = {START_OBJ, 0, BUNG_1w, 0, INVISIBLE};
+act1 about2_1w = {START_OBJ, 0, HERO, 0, NOT_CYCLING};
+act1 ajail2_1w = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 atheend1_1w = {START_OBJ, 5 * NORMAL_TPS, HERO, 0, INVISIBLE};
+act1 aguardgo2_1w = {START_OBJ, 0, GUARD_1w, 0, CYCLE_FORWARD};
+act1 alab5_1w = {START_OBJ, 0, PROF_1w, 0, CYCLE_FORWARD};
+act1 alab8_1w = {START_OBJ, 12, PROF_1w, 0, NOT_CYCLING};
+act1 alab9_1w = {START_OBJ, 16, IGOR_1w, 0, NOT_CYCLING};
+act1 abox10_1w = {START_OBJ, 38, PROF_1w, 0, CYCLE_FORWARD};
+act1 abox11_1w = {START_OBJ, 73, PROF_1w, 0, INVISIBLE};
+
+act2 abatxy_1w = {INIT_OBJXY, 0, BAT_1w, 95, 55};
+act2 aheroxy01_1w = {INIT_OBJXY, 0, HERO, 106, 130};
+act2 aheroxy12_1w = {INIT_OBJXY, 12, HERO, 169, 87};
+act2 aheroxy14_1w = {INIT_OBJXY, 12, HERO, 135, 115};
+act2 aheroxy10_1w = {INIT_OBJXY, 0, HERO, 33, 134};
+act2 aheroxy13_1w = {INIT_OBJXY, 0, HERO, 40, 127};
+act2 aheroxy15_1w = {INIT_OBJXY, 0, HERO, 250, 120};
+act2 ahchase2_1w = {INIT_OBJXY, 5 * NORMAL_TPS, DOG_1w, 280, 137};
+act2 akchase2_1w = {INIT_OBJXY, 5 * NORMAL_TPS, DOG_1w, 30, 120};
+act2 a115d_1w = {INIT_OBJXY, 0, MASK_1w, 236, 91};
+act2 aheroxy115_1w = {INIT_OBJXY, 1, HERO, 27, 130};
+act2 aheroxy21_1w = {INIT_OBJXY, 0, HERO, 130, 56};
+act2 achopxy_1w = {INIT_OBJXY, 0, CHOP_1w, 51, 155};
+act2 aheroxy31_1w = {INIT_OBJXY, 0, HERO, 263, 126};
+act2 aheroxy35_1w = {INIT_OBJXY, 0, HERO, 253, 96};
+act2 aheroxy41_1w = {INIT_OBJXY, 0, HERO, 200, 56};
+act2 aheroxy51_1w = {INIT_OBJXY, 0, HERO, 200, 110};
+act2 aheroxy53_1w = {INIT_OBJXY, 0, HERO, 50, 90};
+act2 aheroxy56_1w = {INIT_OBJXY, 0, HERO, 260, 140};
+act2 aheroxy57_1w = {INIT_OBJXY, 0, HERO, 245, 107};
+act2 aheroxy65_1w = {INIT_OBJXY, 0, HERO, 215, 96};
+act2 aheroxy75_1w = {INIT_OBJXY, 0, HERO, 25, 105};
+act2 adog4_1w = {INIT_OBJXY, 0, DOG_1w, 105, 119};
+act2 aheroxy78_1w = {INIT_OBJXY, NORMAL_TPS + 12, HERO, 80, 42};
+act2 aheroxy89_1w = {INIT_OBJXY, 0, HERO, 276, 135};
+act2 aheroxy87_1w = {INIT_OBJXY, 0, HERO, 235, 108};
+act2 aheroxy910_1w = {INIT_OBJXY, 0, HERO, 50, 132};
+act2 aheroxy98_1w = {INIT_OBJXY, 0, HERO, 130, 120};
+act2 abata1c_1w = {INIT_OBJXY, 0, BAT2_1w, 65, 25};
+act2 abata2c_1w = {INIT_OBJXY, 0, BAT3_1w, 55, 65};
+act2 abata3c_1w = {INIT_OBJXY, 0, BAT4_1w, 50, 120};
+act2 abata4c_1w = {INIT_OBJXY, 0, BAT5_1w, 55, 130};
+act2 aheroxy109_1w = {INIT_OBJXY, 0, HERO, 96, 105};
+act2 aheroxy1011_1w = {INIT_OBJXY, 0, HERO, 76, 130};
+act2 aheroxy1110_1w = {INIT_OBJXY, 0, HERO, 261, 77};
+act2 aheroxy1112_1w = {INIT_OBJXY, 0, HERO, 216, 134};
+act2 aherofar_1w = {INIT_OBJXY, 0, HERO, 142, 25};
+act2 aheronear_1w = {INIT_OBJXY, 0, HERO, 230, 132};
+act2 aheroxy1213_1w = {INIT_OBJXY, 0, HERO, 131, 110};
+act2 aguardgo1_1w = {INIT_OBJXY, 0, GUARD_1w, 137, 39};
+act2 aheroxy1211_1w = {INIT_OBJXY, 0, HERO, 291, 42};
+act2 aheroxy151_1w = {INIT_OBJXY, 0, HERO, 245, 55};
+act2 alab2_1w = {INIT_OBJXY, 0, PROF_1w, 100, 130};
+act2 abox4a_1w = {INIT_OBJXY, 20, HERO, 124, 122};
+act2 aigor12_1w = {INIT_OBJXY, 30, HERO, 116, 112};
+
+act3 aopenp_1w = {PROMPT, 0, kSTsopenp_1w, openrep_1w, kALopenyes_1w, kALopenno_1w, false};
+act3 amanq1_1w = {PROMPT, 0, kSTsq1_1w, rep1_1w, kALrepyes1_1w, kALrepno1_1w, false};
+act3 amanq2_1w = {PROMPT, 0, kSTsq2_1w, rep2_1w, kALrepyes2_1w, kALrepno1_1w, false};
+act3 amanq3_1w = {PROMPT, 0, kSTsq3_1w, rep3_1w, kALrepyes3_1w, kALrepno1_1w, false};
+act3 amanq4_1w = {PROMPT, 0, kSTsq4_1w, rep4_1w, kALrepyes4_1w, kALrepno1_1w, false};
+act3 amanq5_1w = {PROMPT, 0, kSTsq5_1w, rep5_1w, kALrepyes5_1w, kALrepno1_1w, false};
+act3 amanq6_1w = {PROMPT, 0, kSTsq6_1w, rep6_1w, kALrepyes6_1w, kALrepno1_1w, false};
+act3 amanq7_1w = {PROMPT, 0, kSTsq7_1w, rep7_1w, kALrepyes7_1w, kALrepno3_1w, false};
+
+act4 abk1_1w = {BKGD_COLOR, 0, _BLUE};
+act4 abknorm1_1w = {BKGD_COLOR, 0, _BLACK};
+act4 abk2_1w = {BKGD_COLOR, 2, _BLUE};
+act4 abknorm2_1w = {BKGD_COLOR, 3, _BLACK};
+act4 abg1_1w = {BKGD_COLOR, 0, _LIGHTYELLOW};
+act4 abg2_1w = {BKGD_COLOR, 2, _LIGHTMAGENTA};
+act4 abg3_1w = {BKGD_COLOR, 4, _LIGHTRED};
+act4 abg4_1w = {BKGD_COLOR, 6, _BLACK};
+act4 abg5_1w = {BKGD_COLOR, 8, _LIGHTYELLOW};
+act4 abg6_1w = {BKGD_COLOR, 10, _LIGHTMAGENTA};
+act4 abg7_1w = {BKGD_COLOR, 12, _LIGHTRED};
+act4 abg8_1w = {BKGD_COLOR, 14, _BLACK};
+
+act5 aopendoor1b_1w = {INIT_OBJVXY, 0, HERO, DX, -DY};
+act5 abatvxy1_1w = {INIT_OBJVXY, 0, BAT_1w, 2, -2};
+act5 abatvxy2_1w = {INIT_OBJVXY, 20, BAT_1w, -1, 1};
+act5 abatvxy3_1w = {INIT_OBJVXY, 40, BAT_1w, -1, -1};
+act5 abatvxy4_1w = {INIT_OBJVXY, 50, BAT_1w, -5, 0};
+act5 abatvxy5_1w = {INIT_OBJVXY, 60, BAT_1w, 0, 0};
+act5 astophero_1w = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 abutvxy1_1w = {INIT_OBJVXY, 4 * NORMAL_TPS, BUTLER_1w, DX - 2, 0};
+act5 adead4_1w = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 arock4_1w = {INIT_OBJVXY, 0, HERO, DX, 0};
+act5 arock6_1w = {INIT_OBJVXY, 11, HERO, 0, -DY};
+act5 arock8_1w = {INIT_OBJVXY, 20, HERO, 0, 0};
+act5 arock11_1w = {INIT_OBJVXY, 40, HERO, 0, -DY};
+act5 arock13_1w = {INIT_OBJVXY, 44, HERO, 0, DY};
+act5 arock15_1w = {INIT_OBJVXY, 55, HERO, 0, 0};
+act5 ahin2_1w = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 aboatvxy1_1w = {INIT_OBJVXY, 0, BOAT_1w, 0, -2};
+act5 aboatvxy2_1w = {INIT_OBJVXY, 10, BOAT_1w, -5, 0};
+act5 aboatvxy3_1w = {INIT_OBJVXY, 20, BOAT_1w, 2, 0};
+act5 aboatvxy4_1w = {INIT_OBJVXY, 50, BOAT_1w, 1, -1};
+act5 aboatvxy5_1w = {INIT_OBJVXY, 60, BOAT_1w, -2, -3};
+act5 aboatvxy6_1w = {INIT_OBJVXY, 70, BOAT_1w, -3, 0};
+act5 aboatvxy7_1w = {INIT_OBJVXY, 100, BOAT_1w, 0, -3};
+act5 aboatvxy8_1w = {INIT_OBJVXY, 104, BOAT_1w, -1, -1};
+act5 aboatvxy9_1w = {INIT_OBJVXY, 107, BOAT_1w, 0, 0};
+act5 aboatvxy10_1w = {INIT_OBJVXY, 0, BOAT_1w, 9, 7};
+act5 aboatvxy11_1w = {INIT_OBJVXY, 3, BOAT_1w, 0, 0};
+act5 aboatvxy12_1w = {INIT_OBJVXY, 10, BOAT_1w, 1, 1};
+act5 aguardgo4_1w = {INIT_OBJVXY, 0, GUARD_1w, -DX, 0};
+act5 alab3_1w = {INIT_OBJVXY, 0, PROF_1w, DX, 0};
+act5 alab6_1w = {INIT_OBJVXY, 12, PROF_1w, 0, 0};
+act5 alab7_1w = {INIT_OBJVXY, 16, IGOR_1w, 0, 0};
+act5 abox0_1w = {INIT_OBJVXY, 0, GDOOR_1w, 6, 0};
+act5 abox1_1w = {INIT_OBJVXY, 9, GDOOR_1w, 0, 0};
+act5 abox7_1w = {INIT_OBJVXY, 50, GDOOR_1w, -6, 0};
+act5 abox8_1w = {INIT_OBJVXY, 57, GDOOR_1w, 0, 0};
+act5 abox8a_1w = {INIT_OBJVXY, 56, GDOOR_1w, 0, 0};
+act5 abox9_1w = {INIT_OBJVXY, 38, PROF_1w, -DX, 0};
+
+act6 adroppkin_1w = {INIT_CARRY, 0, PKIN_1w, false};
+act6 a115c_1w = {INIT_CARRY, 0, MASK_1w, false};
+act6 adropmask_1w = {INIT_CARRY, 0, MASK_1w, false};
+act6 abut7_1w = {INIT_CARRY, 0, CHOP_1w, true};
+act6 adropchop_1w = {INIT_CARRY, 0, CHOP_1w, false};
+act6 ashedoil3_1w = {INIT_CARRY, 0, OILCAN_1w, true};
+act6 adropbung_1w = {INIT_CARRY, 0, BUNG_1w, false};
+
+act7 amovekey_1w = {INIT_HF_COORD, 0, KEY_1w};
+act7 ahchase1_1w = {INIT_HF_COORD, 5 * NORMAL_TPS, DOG_1w};
+act7 akchase1_1w = {INIT_HF_COORD, 5 * NORMAL_TPS, DOG_1w};
+// Those two actions were defined as act11 with a type set to INIT_HF_COORD
+act7 adog3_1w = {INIT_HF_COORD, 0, DOG_1w};
+act7 alab1_1w = {INIT_HF_COORD, 0, PROF_1w};
+
+act8 ascr01_1w = {NEW_SCREEN, 0, 1};
+act8 ascr12_1w = {NEW_SCREEN, 12, 2};
+act8 ascr14_1w = {NEW_SCREEN, 12, 4};
+act8 ascr10_1w = {NEW_SCREEN, 0, 0};
+act8 ascr13_1w = {NEW_SCREEN, 0, 3};
+act8 ascr15_1w = {NEW_SCREEN, 0, 5};
+act8 ascr115_1w = {NEW_SCREEN, 1, 15};
+act8 ascr21_1w = {NEW_SCREEN, 0, 1};
+act8 ascr31_1w = {NEW_SCREEN, 0, 1};
+act8 ascr35_1w = {NEW_SCREEN, 0, 5};
+act8 ascr41_1w = {NEW_SCREEN, 0, 1};
+act8 ascr51_1w = {NEW_SCREEN, 0, 1};
+act8 ascr53_1w = {NEW_SCREEN, 0, 3};
+act8 ascr56_1w = {NEW_SCREEN, 0, 6};
+act8 ascr57_1w = {NEW_SCREEN, 0, 7};
+act8 ascr65_1w = {NEW_SCREEN, 0, 5};
+act8 ascr75_1w = {NEW_SCREEN, 0, 5};
+act8 aopen78_1w = {NEW_SCREEN, NORMAL_TPS + 12, 8};
+act8 ascr89_1w = {NEW_SCREEN, 0, 9};
+act8 ascr87_1w = {NEW_SCREEN, 0, 7};
+act8 ascr910_1w = {NEW_SCREEN, 0, 10};
+act8 ascr98_1w = {NEW_SCREEN, 0, 8};
+act8 ascr109_1w = {NEW_SCREEN, 0, 9};
+act8 ascr1011_1w = {NEW_SCREEN, 0, 11};
+act8 ascr1110_1w = {NEW_SCREEN, 0, 10};
+act8 ascr1112_1w = {NEW_SCREEN, 0, 12};
+act8 ascr1213_1w = {NEW_SCREEN, 0, 13};
+act8 atheend2_1w = {NEW_SCREEN, 5 * NORMAL_TPS, 14};
+act8 ascr1211_1w = {NEW_SCREEN, 0, 11};
+act8 ascr151_1w = {NEW_SCREEN, 0, 1};
+
+act9 ast12_1w = {INIT_OBJSTATE, 12, DOOR2_1w, 0};
+act9 ast14_1w = {INIT_OBJSTATE, 12, DOOR3_1w, 0};
+act9 ast01_1w = {INIT_OBJSTATE, 0, DOOR1_1w, 0};
+act9 adef8_1w = {INIT_OBJSTATE, 0, WHISTLE_1w, 1};
+act9 a115g_1w = {INIT_OBJSTATE, 0, MASK_1w, 0};
+act9 aopenwd2_1w = {INIT_OBJSTATE, 0, WDOORL_1w, 1};
+act9 aworn_1w = {INIT_OBJSTATE, 0, MASK_1w, 1};
+act9 aremoved_1w = {INIT_OBJSTATE, 0, MASK_1w, 0};
+act9 abut4a_1w = {INIT_OBJSTATE, 0, BUTLER_1w, 1};
+act9 abut7a_1w = {INIT_OBJSTATE, 0, BUTLER_1w, 1};
+act9 abut10_1w = {INIT_OBJSTATE, 10 * NORMAL_TPS, BUTLER_1w, 0};
+act9 astatedoor4_1w = {INIT_OBJSTATE, 0, DOOR4_1w, 1};
+act9 ashedoil2_1w = {INIT_OBJSTATE, 0, SHED_1w, 1};
+act9 ast78_1w = {INIT_OBJSTATE, NORMAL_TPS + 12, TRAP_1w, 0};
+act9 ahin1_1w = {INIT_OBJSTATE, 0, HERO, 1};
+act9 ahout_1w = {INIT_OBJSTATE, 0, HERO, 0};
+act9 aboatmov_1w = {INIT_OBJSTATE, 0, BOAT_1w, 2};
+act9 aboatfar_1w = {INIT_OBJSTATE, 107, BOAT_1w, 1};
+act9 aboatnear_1w = {INIT_OBJSTATE, 13, BOAT_1w, 0};
+act9 aompass_1w = {INIT_OBJSTATE, 0, OLDMAN_1w, 1};
+act9 abox12_1w = {INIT_OBJSTATE, 0, GDOOR_1w, 1};
+act9 aigor33_1w = {INIT_OBJSTATE, 0, GDOOR_1w, 4};
+act9 aigor23_1w = {INIT_OBJSTATE, 0, GDOOR_1w, 3};
+act9 aigor14_1w = {INIT_OBJSTATE, 0, GDOOR_1w, 2};
+
+act10 ahchase3_1w = {INIT_PATH, 5 * NORMAL_TPS, DOG_1w, CHASE, DX * 2, DY * 2};
+act10 akchase3_1w = {INIT_PATH, 5 * NORMAL_TPS, DOG_1w, CHASE, DX * 2, DY * 2};
+act10 adef2_1w = {INIT_PATH, NORMAL_TPS, BAT2_1w, WANDER, DX, DY};
+act10 adef3_1w = {INIT_PATH, NORMAL_TPS, BAT3_1w, WANDER, DX, DY};
+act10 adef4_1w = {INIT_PATH, NORMAL_TPS, BAT4_1w, WANDER, DX, DY};
+act10 adef5_1w = {INIT_PATH, NORMAL_TPS, BAT5_1w, WANDER, DX, DY};
+act10 abut2_1w = {INIT_PATH, 8 * NORMAL_TPS, BUTLER_1w, CHASE, DX - 2, DY - 2};
+act10 abut3_1w = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 abut8_1w = {INIT_PATH, 0, BUTLER_1w, WANDER, DX - 2, DY - 2};
+act10 abut9_1w = {INIT_PATH, 0, HERO, USER, 0, 0};
+act10 adog2_1w = {INIT_PATH, 0, DOG_1w, CHASE, DX * 2, DY * 2};
+act10 abata1a_1w = {INIT_PATH, 0, BAT2_1w, CHASE, DX * 2, DY * 2};
+act10 abata1b_1w = {INIT_PATH, 7, BAT2_1w, WANDER, DX, DY};
+act10 abata2a_1w = {INIT_PATH, 0, BAT3_1w, CHASE, DX * 2, DY * 2};
+act10 abata2b_1w = {INIT_PATH, 6, BAT3_1w, WANDER, DX, DY};
+act10 abata3a_1w = {INIT_PATH, 0, BAT4_1w, CHASE, DX * 2, DY * 2};
+act10 abata3b_1w = {INIT_PATH, 5, BAT4_1w, WANDER, DX, DY};
+act10 abata4a_1w = {INIT_PATH, 0, BAT5_1w, CHASE, DX * 2, DY * 2};
+act10 abata4b_1w = {INIT_PATH, 4, BAT5_1w, WANDER, DX, DY};
+act10 amum2_1w = {INIT_PATH, 3 * NORMAL_TPS, MUMMY_1w, CHASE, DX * 2, DY * 2};
+act10 arock1_1w = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 arock16_1w = {INIT_PATH, 55, HERO, USER, 0, 0};
+act10 abin3_1w = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 about3_1w = {INIT_PATH, 0, HERO, USER, 0, 0};
+act10 ajail1_1w = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 alab14_1w = {INIT_PATH, 40, IGOR_1w, WANDER, DX, 0};
+act10 acyc1_1w = {INIT_PATH, 0, HERO, QUIET, 0, 0};
+act10 acyc2_1w = {INIT_PATH, 57, HERO, USER, 0, 0};
+
+act11 atcup2_1w = {COND_R, 0, CUPBOARD_1w, 2, kALcuptxt2_1w, kALcuptxt3_1w};
+act11 atcup1_1w = {COND_R, 0, CUPBOARD_1w, 1, kALcuptxt1_1w, kALlookcupb2_1w};
+act11 atcup0_1w = {COND_R, 0, CUPBOARD_1w, 0, kALcuptxt0_1w, kALlookcupb1_1w};
+act11 a115a_1w = {COND_R, 0, MASK_1w, 1, kALswapmask_1w, 0};
+act11 achkmaskcarry_1w = {COND_R, 0, WDOORL_1w, 0, kALopenwdoorm_1w, 0};
+act11 aswapcheck_1w = {COND_R, 0, MASK_1w, 0, kALwearmask_1w, kALremovemask_1w};
+act11 abut3a_1w = {COND_R, 0, BUTLER_1w, 0, kALbutp_1w, 0};
+act11 abut5_1w = {COND_R, 0, MASK_1w, 0, kALbutchopped_1w, kALbutchop_1w};
+act11 abut6_1w = {COND_R, 0, MASK_1w, 0, kALbutchopped_1w, kALbutroam_1w};
+act11 at78b_1w = {COND_R, 0, MASK_1w, 1, kALswapmask_1w, 0};
+act11 atrap_1w = {COND_R, 0, BOLT_1w, 2, kALopenpass_1w, kALopenfail_1w};
+act11 abatcheck_1w = {COND_R, 0, WHISTLE_1w, 0, kALbatty_1w, 0};
+act11 abin_1w = {COND_R, 0, BUNG_1w, 0, kALnobung_1w, kALembark_1w};
+act11 achkout_1w = {COND_R, 0, OLDMAN_1w, 1, kALdeboat_1w, kALnodeboat_1w};
+act11 agetout_1w = {COND_R, 0, BOAT_1w, 0, kALdeboat_1w, kALchkout_1w};
+act11 aherochk_1w = {COND_R, 107, HERO, 1, kALherofar_1w, 0};
+act11 apush_1w = {COND_R, 0, BOAT_1w, 0, kALgofar_1w, kALcomenear_1w};
+act11 achkmove_1w = {COND_R, 0, BOAT_1w, 2, kALmoving_1w, kALmoveboat_1w};
+act11 achkrope_1w = {COND_R, 0, ROPE_1w, 1, kALchkmove_1w, kALnotcut_1w};
+act11 achkboat1_1w = {COND_R, 0, HERO, 0, kALgetinboat_1w, kALchkboat2_1w};
+act11 achkpass_1w = {COND_R, 0, OLDMAN_1w, 1, kALomasked_1w, kALomask_1w};
+act11 achkd3_1w = {COND_R, 0, GDOOR_1w, 3, kALdmsg3_1w, kALok151_1w};
+act11 achkd2_1w = {COND_R, 0, GDOOR_1w, 2, kALdmsg2_1w, kALchkd3_1w};
+act11 achkd1_1w = {COND_R, 0, GDOOR_1w, 1, kALdmsg1_1w, kALchkd2_1w};
+act11 achkd0_1w = {COND_R, 0, GDOOR_1w, 0, kALok151_1w, kALchkd1_1w};
+act11 achklab_1w = {COND_R, 0, GDOOR_1w, 0, kALprof_1w, 0};
+act11 abbox_1w = {COND_R, 0, GDOOR_1w, 0, kALbox0_1w, 0};
+act11 aichk3_1w = {COND_R, 0, GDOOR_1w, 3, kALigor3_1w, kALinorm_1w};
+act11 aichk2_1w = {COND_R, 0, GDOOR_1w, 2, kALigor2_1w, kALichk3_1w};
+act11 aichk1_1w = {COND_R, 0, GDOOR_1w, 1, kALigor1_1w, kALichk2_1w};
+act11 aichk0_1w = {COND_R, 0, GDOOR_1w, 0, kALigor0_1w, kALichk1_1w};
+
+act12 apbreak_1w = {TEXT, 0, kSTspbreak_1w};
+act12 acuptxt0_1w = {TEXT, 0, kSTsseepkdw_1w};
+act12 acuptxt1_1w = {TEXT, 0, kSTsseedw_1w};
+act12 acuptxt2_1w = {TEXT, 0, kSTsseepk_1w};
+act12 acuptxt3_1w = {TEXT, 0, kSTesnosee_1w};
+act12 adwwhy_1w = {TEXT, 0, kSTsWonder_1w};
+act12 ablowt_1w = {TEXT, 3 * NORMAL_TPS, kSTsBlowWhistle_1w};
+act12 adef6_1w = {TEXT, NORMAL_TPS, kSTsdefbat1_1w};
+act12 adef7_1w = {TEXT, 3 * NORMAL_TPS, kSTsdefbat2_1w};
+act12 anought_1w = {TEXT, NORMAL_TPS, kSTsNothing_1w};
+act12 a115e_1w = {TEXT, 0, kSTsDropMask_1w};
+act12 aweartext_1w = {TEXT, 0, kSTWearMask_1w};
+act12 aremovetext_1w = {TEXT, 0, kSTRemoveMask_1w};
+act12 abut6a_1w = {TEXT, 0, kSTsButSniff_1w};
+act12 abut6b_1w = {TEXT, 3, kSTsButChop_1w};
+act12 abut6c_1w = {TEXT, 6, kSTsButHead_1w};
+act12 abut9a_1w = {TEXT, NORMAL_TPS / 3, kSTsButEnjoy_1w};
+act12 abut9b_1w = {TEXT, NORMAL_TPS / 3 + 1, kSTsButTake_1w};
+act12 abut11_1w = {TEXT, NORMAL_TPS / 3, kSTsButLater_1w};
+act12 aeatchop_1w = {TEXT, 0, kSTsEatChop_1w};
+act12 achopfail_1w = {TEXT, 0, kSTesthrown_1w};
+act12 achopthrown_1w = {TEXT, 5 * NORMAL_TPS, kSTsDogEat_1w};
+act12 atalk1a_1w = {TEXT, 0, kSTAskFrank_1w};
+act12 atalk1b_1w = {TEXT, 0, kSTRepFrank_1w};
+act12 atalk2a_1w = {TEXT, 0, kSTAskDrac_1w};
+act12 atalk2b_1w = {TEXT, 0, kSTRepDrac_1w};
+act12 atalk3a_1w = {TEXT, 0, kSTAskGwen_1w};
+act12 atalk3b_1w = {TEXT, 0, kSTRepGwen_1w};
+act12 atalk4a_1w = {TEXT, 0, kSTAskFriar_1w};
+act12 atalk4b_1w = {TEXT, 0, kSTRepFriar_1w};
+act12 atalk5a_1w = {TEXT, 0, kSTAskSlime_1w};
+act12 atalk5b_1w = {TEXT, 0, kSTRepSlime_1w};
+act12 atalk6a_1w = {TEXT, 0, kSTAskPea_1w};
+act12 atalk6b_1w = {TEXT, 0, kSTRepPea_1w};
+act12 anoopen_1w = {TEXT, 0, kSTsWrongCombo_1w};
+act12 aopen4_1w = {TEXT, 0, kSTsRightCombo_1w};
+act12 ashedoil1_1w = {TEXT, 0, kSTsTakeOil_1w};
+act12 adoggy_1w = {TEXT, 0, kSTsDogEatHero_1w};
+act12 at78a_1w = {TEXT, 0, kSTsTossMask_1w};
+act12 aopenfail_1w = {TEXT, 0, kSTsTrapBolted_1w};
+act12 ahelps1_1w = {TEXT, 0, kSTsBaseHelp1_1w};
+act12 anohelp_1w = {TEXT, 0, kSTsNoHelp_1w};
+act12 ahelps2_1w = {TEXT, 0, kSTsBaseHelp2_1w};
+act12 abat5a_1w = {TEXT, 0, kSTsGotcher_1w};
+act12 abat5b_1w = {TEXT, 0, kSTsBatGot_1w};
+act12 amum3_1w = {TEXT, 0, kSTsGotcher_1w};
+act12 amum4_1w = {TEXT, 0, kSTsMummyGot_1w};
+act12 abin0_1w = {TEXT, 0, kSTsEnterBoat_1w};
+act12 abung1_1w = {TEXT, 0, kSTsBoatHole_1w};
+act12 ahout1_1w = {TEXT, 0, kSTsExitBoat_1w};
+act12 anodeboat_1w = {TEXT, 0, kSTsManBlock_1w};
+act12 amoving_1w = {TEXT, 0, kSTsShutup_1w};
+act12 anotcut_1w = {TEXT, 0, kSTsBoatTied_1w};
+act12 arepyep_1w = {TEXT, 0, kSTsCorrect_1w};
+act12 arepnop_1w = {TEXT, 0, kSTsIncorrect_1w};
+act12 amans1_1w = {TEXT, 0, kSTsDoomed1_1w};
+act12 arepno5_1w = {TEXT, 0, kSTsDoomed2_1w};
+act12 arepyep2_1w = {TEXT, 0, kSTsContinue_1w};
+act12 amans3_1w = {TEXT, 0, kSTsOldMan1_1w};
+act12 amans4_1w = {TEXT, 0, kSTsOldMan2_1w};
+act12 amans5_1w = {TEXT, 0, kSTsOldMan3_1w};
+act12 amans6_1w = {TEXT, 0, kSTsOldMan4_1w};
+act12 amans7_1w = {TEXT, 0, kSTsOldMan5_1w};
+act12 ajails1_1w = {TEXT, 0, kSTsCongrats_1w};
+act12 ajails2_1w = {TEXT, 0, kSTsRescued1_1w};
+act12 ajails3_1w = {TEXT, 0, kSTsRescued2_1w};
+act12 ajails4_1w = {TEXT, 0, kSTsRescued3_1w};
+act12 agive1_1w = {TEXT, 0, kSTsGuard1_1w};
+act12 agive2_1w = {TEXT, 0, kSTsGuard2_1w};
+act12 anogive_1w = {TEXT, 0, kSTsNoGive_1w};
+act12 bye1_1w = {TEXT, 2 * NORMAL_TPS, kSTsKissy_1w};
+act12 bye2_1w = {TEXT, 3 * NORMAL_TPS, kSTsGoodbye_1w};
+act12 admsg3_1w = {TEXT, 0, kSTsGrip_1w};
+act12 admsg2_1w = {TEXT, 0, kSTsCoordinate_1w};
+act12 admsg1_1w = {TEXT, 0, kSTsReach_1w};
+act12 alab12_1w = {TEXT, 24, kSTsProf1_1w};
+act12 alab13_1w = {TEXT, 24, kSTsProf2_1w};
+act12 abox2_1w = {TEXT, 16, kSTsProf3_1w};
+act12 abox3_1w = {TEXT, 16, kSTsIgorRed_1w};
+act12 abox5_1w = {TEXT, 38, kSTsProfUpset_1w};
+act12 abox6_1w = {TEXT, 44, kSTsProfRetires_1w};
+act12 ainorm_1w = {TEXT, 0, kSTsIgorRefuses_1w};
+act12 aigor22_1w = {TEXT, 0, kSTsIgorGreen_1w};
+act12 aigor13_1w = {TEXT, 0, kSTsIgorYellow_1w};
+act12 aigor32_1w = {TEXT, 0, kSTsIgorBlue_1w};
+act12 aigor0_1w = {TEXT, 0, kSTsIgorNo_1w};
+act12 agobox_1w = {TEXT, 0, kSTsIgorBox_1w};
+
+act13 aswapmask_1w = {SWAP_IMAGES, 0, HERO, MONKEY_1w};
+act13 aswaphero_1w = {SWAP_IMAGES, 0, HERO, WHERO_1w};
+act13 abox4_1w = {SWAP_IMAGES, 20, HERO, WHERO_1w};
+act13 aigor30_1w = {SWAP_IMAGES, 30, HERO, FUZYHERO_1w};
+act13 aigor31_1w = {SWAP_IMAGES, 30, HERO, HERO};
+act13 aigor20_1w = {SWAP_IMAGES, 30, HERO, SPACHERO_1w};
+act13 aigor21_1w = {SWAP_IMAGES, 30, HERO, FUZYHERO_1w};
+act13 aigor10_1w = {SWAP_IMAGES, 30, HERO, WHERO_1w};
+act13 aigor11_1w = {SWAP_IMAGES, 30, HERO, SPACHERO_1w};
+
+act14 acond9_1w = {COND_SCR, 0, HERO, 9, kALdefbats_1w, kALnought_1w};
+act14 acond5_1w = {COND_SCR, 0, HERO, 5, kALchasekit_1w, kALcond9_1w};
+act14 ablow1_1w = {COND_SCR, 0, HERO, 1, kALchasehall_1w, kALcond5_1w};
+act14 athrowchop_1w = {COND_SCR, 0, HERO, 7, kALchoppass_1w, kALchopfail_1w};
+act14 atakechop_1w = {COND_SCR, 0, HERO, 7, kALdoggy_1w, 0};
+act14 achkscr_1w = {COND_SCR, 0, HERO, 12, kALgive_1w, kALnogive_1w};
+
+act15 adogchop_1w = {AUTOPILOT, 0, DOG_1w, CHOP_1w, DX + 2, DY * 2};
+
+act16 aclosedoor2_1w = {INIT_OBJ_SEQ, 12, DOOR2_1w, 0};
+act16 aclosedoor3_1w = {INIT_OBJ_SEQ, 12, DOOR3_1w, 0};
+act16 adogseq_1w = {INIT_OBJ_SEQ, 0, DOG_1w, 1};
+act16 adogseq2_1w = {INIT_OBJ_SEQ, 4 * NORMAL_TPS, DOG_1w, 2};
+act16 adog5_1w = {INIT_OBJ_SEQ, 0, DOG_1w, 0};
+act16 at78c_1w = {INIT_OBJ_SEQ, NORMAL_TPS + 12, TRAP_1w, 0};
+act16 arock3_1w = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 arock5_1w = {INIT_OBJ_SEQ, 11, HERO, _UP};
+act16 arock10_1w = {INIT_OBJ_SEQ, 40, HERO, _UP};
+act16 arock12_1w = {INIT_OBJ_SEQ, 44, HERO, DOWN};
+act16 acutrope_1w = {INIT_OBJ_SEQ, 0, ROPE_1w, 1};
+act16 abin1_1w = {INIT_OBJ_SEQ, 0, BOAT_1w, 1};
+act16 about1_1w = {INIT_OBJ_SEQ, 0, BOAT_1w, 0};
+act16 ajail3_1w = {INIT_OBJ_SEQ, 0, HERO, 0};
+act16 ajail4_1w = {INIT_OBJ_SEQ, 2, HERO, 1};
+act16 aguardgo3_1w = {INIT_OBJ_SEQ, 0, GUARD_1w, 1};
+act16 aturnguard_1w = {INIT_OBJ_SEQ, 2 * NORMAL_TPS, GUARD_1w, 0};
+act16 alab4_1w = {INIT_OBJ_SEQ, 0, PROF_1w, 0};
+act16 alab10_1w = {INIT_OBJ_SEQ, 14, PROF_1w, 1};
+act16 alab11_1w = {INIT_OBJ_SEQ, 18, IGOR_1w, 1};
+
+act17 acupbpk_1w = {SET_STATE_BITS, 0, CUPBOARD_1w, 1};
+act17 acupbdw_1w = {SET_STATE_BITS, 0, CUPBOARD_1w, 2};
+
+act20 adef1_1w = {DEL_EVENTS, 1 * NORMAL_TPS, ASCHEDULE};
+
+act21 abut6g_1w = {GAMEOVER, 7};
+act21 adead5_1w = {GAMEOVER, 0};
+
+// Those two were act7, with a type set to INIT_HH_COORD
+act22 abut6e_1w = {INIT_HH_COORD, 7, HDLSHERO_1w};
+act22 adead2_1w = {INIT_HH_COORD, 0, HERODEAD_1w};
+
+act23 bye3_1w = {EXIT, 4 * NORMAL_TPS};
+
+act24 abonus12_1w = {BONUS, 0, 12};
+act24 abonus1_1w = {BONUS, 0, 1};
+act24 abonus2_1w = {BONUS, 0, 2};
+act24 abonus6_1w = {BONUS, 0, 6};
+act24 achopbonus_1w = {BONUS, 0, 11};
+act24 abonus3_1w = {BONUS, 0, 3};
+act24 abonus9_1w = {BONUS, 0, 9};
+act24 abonus4_1w = {BONUS, 0, 4};
+act24 abonus5_1w = {BONUS, 0, 5};
+act24 abonus7_1w = {BONUS, 0, 7};
+act24 abonus8_1w = {BONUS, 0, 8};
+// The following was defined as a act27 with a type set to BONUS
+act24 abut7b_1w = {BONUS, 0, 10};
+
+act25 achkdoor_1w = {COND_BOX, 2 * NORMAL_TPS, HERO, 25, 173, 40, 175, kALgoinside_1w, 0};
+act25 achkbbox_1w = {COND_BOX, 0, HERO, 100, 153, 144, 160, kALbbox_1w, 0};
+act25 aichkbox_1w = {COND_BOX, 0, HERO, 100, 153, 144, 163, kALichk0_1w, kALgobox_1w};
+
+act26 acreak_1w = {SOUND, 0, DOOR_CREAK_1w};
+act26 abatsnd_1w = {SOUND, 50, BAT_FLUTTER_1w};
+act26 adooropen_1w = {SOUND, 0, DOOR_OPEN_1w};
+act26 ahchase4_1w = {SOUND, 5 * NORMAL_TPS, DOG_BARK_1w};
+act26 abutsnd_1w = {SOUND, 3, BUTLER_GOTCHER_1w};
+act26 abut6h_1w = {SOUND, 7, T_TRACK10};
+act26 amunch_1w = {SOUND, 0, MUNCH_1w};
+act26 afork_1w = {SOUND, 1 * NORMAL_TPS, FORK_BANG_1w};
+act26 asong3_1w = {SOUND, 0, DOG_BARK_1w};
+act26 afuneral_1w = {SOUND, 0, T_TRACK10};
+act26 abatgot_1w = {SOUND, 0, BAT_FLUTTER_1w};
+act26 asong2_1w = {SOUND, 3 * NORMAL_TPS, MUMMY_CHASE_1w};
+act26 amumgot_1w = {SOUND, 0, MUMMY_GOTCHER_1w};
+act26 asplash_1w = {SOUND, 0, SPLASH_1w};
+act26 afinale_1w = {SOUND, 0, T_TRACK1};
+act26 abgsnd_1w = {SOUND, 0, MACHINE_NOISE_1w};
+
+act27 ashedoil4_1w = {ADD_SCORE, 0, OILCAN_1w};
+
+act28 a115f_1w = {SUB_SCORE, 0, MASK_1w};
+
+act29 achkmask_1w = {COND_CARRY, 0, MASK_1w, kALputmask_1w, 0};
+act29 achkmask2_1w = {COND_CARRY, 0, MASK_1w, kALridmask_1w, 0};
+
+act43 abut4_1w = {YESNO, 0, kSTsbut1_1w, kALbutyes_1w, kALbutno_1w};
+act43 achopprompt_1w = {YESNO, 0, kSTsChopPrompt_1w, kALeatchop_1w, 0};
+act43 ahelp1_1w = {YESNO, 4 * 60 * NORMAL_TPS, kSTshelpp1_1w, kALhelpy_1w, kALhelpn_1w};
+act43 ahelp2_1w = {YESNO, 5 * 60 * NORMAL_TPS, kSTshelpp2_1w, kALhelpy2_1w, kALhelpn_1w};
+act43 achkboat2_1w = {YESNO, 0, kSTsBoatAsk_1w, kALpushboat_1w, kALgetoutboat_1w};
+
+act47 aviewfar_1w = {INIT_VIEW, 107, BOAT_1w, 140, 55, Common::KEYCODE_DOWN};
+act47 aviewnear_1w = {INIT_VIEW, 13, BOAT_1w, 250, 150, Common::KEYCODE_UP};
+
+act48 ainitdoor_1w = {INIT_OBJ_FRAME, 0, DOOR1_1w, 0, 3};
+
+actListPtr ALDummy[] = {0};
+actListPtr ALgoinside_1w[] = {&aopendoor1b_1w, 0};
+actListPtr ALopendoor1_1w[] = {&acreak_1w, &aopendoor1a_1w, &achkdoor_1w, 0};
+actListPtr ALclosedoor1_1w[] = {&acreak_1w, &ainitdoor_1w, &aclosedoor1_1w, 0};
+actListPtr ALightning_1w[] = {&abk1_1w, &abknorm1_1w, &abk2_1w, &abknorm2_1w, &areplight_1w, 0};
+actListPtr ALblinkeyes1_1w[] = {&ablink1a_1w, &ablink1b_1w, &ablink1c_1w, &ablink1d_1w, &ablink2a_1w, &ablink2b_1w, &ablink2c_1w, &ablink2d_1w, &arepeye_1w, 0};
+actListPtr ALbat_1w[] = {&abatxy_1w, &abatvxy1_1w, &abatvxy2_1w, &abatvxy3_1w, &abatvxy4_1w, &abatvxy5_1w, &abatsnd_1w, &arepbat_1w, 0};
+actListPtr ALpkin_1w[] = {&abonus12_1w, &apbreak_1w, &ashowkey_1w, &aridpkin_1w, &adroppkin_1w, &amovekey_1w, 0};
+actListPtr ALscr1_1w[] = {&abonus1_1w, &aheroxy01_1w, &ascr01_1w, 0};
+actListPtr ALridprof_1w[] = {&aridprof_1w, 0};
+actListPtr ALopendoor2_1w[] = {&astophero_1w, &adooropen_1w, &aopendoor2_1w, &ast12_1w, &aheroxy12_1w, &aclosedoor2_1w, &ascr12_1w, 0};
+actListPtr ALopendoor3_1w[] = {&astophero_1w, &adooropen_1w, &aopendoor3_1w, &ast14_1w, &aheroxy14_1w, &aclosedoor3_1w, &ascr14_1w, 0};
+actListPtr ALblinkeyes2_1w[] = {&ablink3a_1w, &ablink3b_1w, &ablink3c_1w, &ablink3d_1w, &ablink4a_1w, &ablink4b_1w, &ablink4c_1w, &ablink4d_1w, &arepeye2_1w, 0};
+actListPtr ALscr10_1w[] = {&aheroxy10_1w, &ast01_1w, &ascr10_1w, 0};
+actListPtr ALscr13_1w[] = {&aheroxy13_1w, &ascr13_1w, 0};
+actListPtr ALscr15_1w[] = {&aheroxy15_1w, &ascr15_1w, 0};
+actListPtr ALcuptxt0_1w[] = {&acuptxt0_1w, &acupknife_1w, &acupwhist_1w, 0};
+actListPtr ALcuptxt1_1w[] = {&acuptxt1_1w, 0};
+actListPtr ALcuptxt2_1w[] = {&acuptxt2_1w, 0};
+actListPtr ALcuptxt3_1w[] = {&acuptxt3_1w, 0};
+actListPtr ALlookcupb2_1w[] = {&atcup2_1w, 0};
+actListPtr ALlookcupb1_1w[] = {&atcup1_1w, 0};
+actListPtr ALlookcupb_1w[] = {&abonus2_1w, &atcup0_1w, 0};
+actListPtr ALcupbpk_1w[] = {&acupbpk_1w, 0};
+actListPtr ALcupbdw_1w[] = {&acupbdw_1w, &adwwhy_1w, 0};
+actListPtr ALchasehall_1w[] = {&ablowt_1w, &ahchase1_1w, &ahchase2_1w, &ahchase3_1w, &ahchase4_1w, 0};
+actListPtr ALchasekit_1w[] = {&ablowt_1w, &akchase1_1w, &akchase2_1w, &akchase3_1w, &ahchase4_1w, 0};
+actListPtr ALdefbats_1w[] = {&abonus6_1w, &adef1_1w, &adef2_1w, &adef3_1w, &adef4_1w, &adef5_1w, &adef6_1w, &adef7_1w, &adef8_1w, 0};
+actListPtr ALnought_1w[] = {&anought_1w, 0};
+actListPtr ALcond9_1w[] = {&acond9_1w, 0};
+actListPtr ALcond5_1w[] = {&acond5_1w, 0};
+actListPtr ALblowdw_1w[] = {&ablow1_1w, 0};
+actListPtr ALputmask_1w[] = {&a115a_1w, &a115b_1w, &a115c_1w, &a115d_1w, &a115e_1w, &a115f_1w, &a115g_1w, 0};
+actListPtr ALscr115_1w[] = {&achkmask_1w, &aheroxy115_1w, &ascr115_1w, 0};
+actListPtr ALopenwdoorm_1w[] = {&aopenwd1_1w, &aopenwd2_1w, 0};
+actListPtr ALopenwdoors_1w[] = {&aopenwdoorl_1w, &aopenwdoorr_1w, &achkmaskcarry_1w, 0};
+actListPtr ALclosewdoors_1w[] = {&aclosewdoorl_1w, &aclosewdoorr_1w, 0};
+actListPtr ALswapmask_1w[] = {&aswapmask_1w, 0};
+actListPtr ALdropmask_1w[] = {&adropmask_1w, 0};
+actListPtr ALwearmask_1w[] = {&aweartext_1w, &aswapmask_1w, &aworn_1w, 0};
+actListPtr ALremovemask_1w[] = {&aremovetext_1w, &aswapmask_1w, &aremoved_1w, 0};
+actListPtr ALusemask_1w[] = {&aswapcheck_1w, 0};
+actListPtr ALscr21_1w[] = {&aheroxy21_1w, &ascr21_1w, 0};
+actListPtr ALbut_1w[] = {&abut1_1w, &abutvxy1_1w, &abut2_1w, 0};
+actListPtr ALbutler_1w[] = {&abut3a_1w, 0};
+actListPtr ALbutp_1w[] = {/*&abut3_1w, */&abut4_1w, &abut4a_1w, 0};
+actListPtr ALbutyes_1w[] = {&abut5_1w, 0};
+actListPtr ALbutno_1w[] = {&abut6_1w, 0};
+actListPtr ALbutchopped_1w[] = {&abutsnd_1w, &abut6a_1w, &abut6b_1w, &abut6c_1w, &abut6d_1w, &abut6e_1w, &abut6f_1w, &abut6g_1w, &abut6h_1w, 0};
+actListPtr ALbutchop_1w[] = {&abut7_1w, &abut7a_1w, &abut7b_1w, &abut8_1w, &abut9_1w, &abut9a_1w, &abut9b_1w, 0};
+actListPtr ALbutroam_1w[] = {&abut8_1w, &abut9_1w, &abut10_1w, &abut11_1w, 0};
+actListPtr AL_eatchop_1w[] = {&adropchop_1w, &aeatchop_1w, &aridchop_1w, 0};
+actListPtr ALeatchop_1w[] = {&achopprompt_1w, 0};
+actListPtr ALthrowchop_1w[] = {&athrowchop_1w, 0};
+actListPtr ALchopfail_1w[] = {&adropchop_1w, &aridchop_1w, &achopfail_1w, 0};
+actListPtr ALchoppass_1w[] = {&ashowchop_1w, &achopthrown_1w, &adropchop_1w, &achopxy_1w, &adogchop_1w, &adogseq_1w, &adogcyc_1w, &adogseq2_1w, &achopbonus_1w, 0};
+actListPtr ALrepredeye_1w[] = {&ablink5a_1w, &ablink5b_1w, &ablink5c_1w, &ablink5d_1w, &arepredeye_1w, 0};
+actListPtr ALreplips_1w[] = {&amunch_1w, &alips_1w, &areplips_1w, 0};
+actListPtr ALreparm_1w[] = {&afork_1w, &aarm_1w, &areparm_1w, 0};
+actListPtr ALtalkfrank_1w[] = {&atalk1a_1w, &atalk1b_1w, 0};
+actListPtr ALtalkdrac_1w[] = {&atalk2a_1w, &atalk2b_1w, 0};
+actListPtr ALtalkgwen_1w[] = {&atalk3a_1w, &atalk3b_1w, 0};
+actListPtr ALtalkhood_1w[] = {&atalk4a_1w, &atalk4b_1w, 0};
+actListPtr ALtalkslime_1w[] = {&atalk5a_1w, &atalk5b_1w, 0};
+actListPtr ALtalkpeahd_1w[] = {&atalk6a_1w, &atalk6b_1w, 0};
+actListPtr ALscr31_1w[] = {&aheroxy31_1w, &ascr31_1w, 0};
+actListPtr ALscr35_1w[] = {&aheroxy35_1w, &ascr35_1w, 0};
+actListPtr ALscr41_1w[] = {&aheroxy41_1w, &ascr41_1w, 0};
+actListPtr ALscr51_1w[] = {&aheroxy51_1w, &ascr51_1w, 0};
+actListPtr ALscr53_1w[] = {&aheroxy53_1w, &ascr53_1w, 0};
+actListPtr ALscr56_1w[] = {&aheroxy56_1w, &ascr56_1w, 0};
+actListPtr ALscr57_1w[] = {&aheroxy57_1w, &ascr57_1w, 0};
+actListPtr ALscr65_1w[] = {&aheroxy65_1w, &ascr65_1w, 0};
+actListPtr ALopenyes_1w[] = {&abonus3_1w, &aopen4_1w, &adooropen_1w, &aopendoor4_1w, &astatedoor4_1w, 0};
+actListPtr ALopenno_1w[] = {&anoopen_1w, 0};
+actListPtr ALopendoor4_1w[] = {&aopenp_1w, 0};
+actListPtr ALclosedoor4_1w[] = {&aclosedoor4_1w, 0};
+actListPtr ALshedoil_1w[] = {&ashedoil1_1w, &ashedoil2_1w, &ashedoil3_1w, &ashedoil4_1w, 0};
+actListPtr ALscr75_1w[] = {&aheroxy75_1w, &ascr75_1w, 0};
+actListPtr ALdog_1w[] = {&asong3_1w, &adog1_1w, &adog2_1w, &adog3_1w, &adog4_1w, &adog5_1w, 0};
+actListPtr ALdead_1w[] = {&afuneral_1w, &adead1_1w, &adead2_1w, &adead3_1w, &adead4_1w, &adead5_1w, 0};
+actListPtr ALdoggy_1w[] = {&adead_1w, &adoggy_1w, 0};
+actListPtr ALgetchop_1w[] = {&atakechop_1w, 0};
+actListPtr ALmovecarp_1w[] = {&amovecarp1_1w, &amovecarp2_1w, &abonus9_1w, 0};
+actListPtr ALridmask_1w[] = {&at78a_1w, &at78b_1w, &adropmask_1w, 0};
+actListPtr ALopenpass_1w[] = {&abonus4_1w, &aopentrap_1w, &aheroxy78_1w, &ast78_1w, &at78c_1w, &aopen78_1w, &achkmask2_1w, 0};
+actListPtr ALopenfail_1w[] = {&aopenfail_1w, 0};
+actListPtr ALopentrap_1w[] = {&atrap_1w, 0};
+actListPtr ALclosetrap_1w[] = {&aclosetrap_1w, 0};
+actListPtr ALscr89_1w[] = {&abonus5_1w, &aheroxy89_1w, &ascr89_1w, 0};
+actListPtr ALscr87_1w[] = {&aheroxy87_1w, &ascr87_1w, 0};
+actListPtr ALhelpy_1w[] = {&ahelps1_1w, 0};
+actListPtr ALhelpn_1w[] = {&anohelp_1w, 0};
+actListPtr ALhelpy2_1w[] = {&ahelps2_1w, 0};
+actListPtr ALhelp_1w[] = {&ahelp1_1w, &ahelp2_1w, 0};
+actListPtr ALscr910_1w[] = {&aheroxy910_1w, &ascr910_1w, 0};
+actListPtr ALscr98_1w[] = {&aheroxy98_1w, &ascr98_1w, 0};
+actListPtr ALbatrep_1w[] = {&abata1a_1w, &abata1b_1w, &abata2a_1w, &abata2b_1w, &abata3a_1w, &abata3b_1w, &abata4a_1w, &abata4b_1w, &arepbata_1w, 0};
+actListPtr ALbatattack_1w[] = {&abata1a_1w, &abata1b_1w, &abata1c_1w, &abata2a_1w, &abata2b_1w, &abata2c_1w, &abata3a_1w, &abata3b_1w, &abata3c_1w, &abata4a_1w, &abata4b_1w, &abata4c_1w, &arepbata_1w, 0};
+actListPtr ALbatty_1w[] = {&abatgot_1w, &adead_1w, &abat5a_1w, &abat5b_1w, 0};
+actListPtr ALbats_1w[] = {&abatcheck_1w, 0};
+actListPtr ALmum_1w[] = {&acreak_1w, &asong2_1w, &amdoor1_1w, &amdoor2_1w, &amum1_1w, &amum2_1w, 0};
+actListPtr ALmummy_1w[] = {&adead_1w, &amumgot_1w, &amum3_1w, &amum4_1w, 0};
+actListPtr ALrock_1w[] = {&arock1_1w, &arock2_1w, &arock3_1w, &arock4_1w, &arock5_1w, &arock6_1w, &arock7_1w, &arock8_1w, &arock9_1w, &arock10_1w, &arock11_1w, &arock12_1w, &arock13_1w, &arock14_1w, &arock15_1w, &arock16_1w, 0};
+actListPtr ALscr109_1w[] = {&aheroxy109_1w, &ascr109_1w, 0};
+actListPtr ALscr1011_1w[] = {&aswaphero_1w, &aheroxy1011_1w, &ascr1011_1w, 0};
+actListPtr ALscr1110_1w[] = {&aswaphero_1w, &aheroxy1110_1w, &ascr1110_1w, 0};
+actListPtr ALscr1112_1w[] = {&aswaphero_1w, &aheroxy1112_1w, &ascr1112_1w, 0};
+actListPtr ALcutrope_1w[] = {&acutrope_1w, 0};
+actListPtr ALherofar_1w[] = {&aherofar_1w, 0};
+actListPtr ALembark_1w[] = {&abin0_1w, &ahin1_1w, &ahin2_1w, &abin1_1w, &abin2_1w, &abin3_1w, &asplash_1w, 0};
+actListPtr ALnobung_1w[] = {&abung1_1w, 0};
+actListPtr ALgetinboat_1w[] = {&abin_1w, 0};
+actListPtr ALplugbung_1w[] = {&aridbung_1w, &adropbung_1w, 0};
+actListPtr ALdeboat_1w[] = {&ahout_1w, &ahout1_1w, &about1_1w, &about2_1w, &about3_1w, &asplash_1w, 0};
+actListPtr ALnodeboat_1w[] = {&anodeboat_1w, 0};
+actListPtr ALchkout_1w[] = {&achkout_1w, 0};
+actListPtr ALgetoutboat_1w[] = {&agetout_1w, 0};
+actListPtr ALgofar_1w[] = {&aboatmov_1w, &aboatvxy1_1w, &aboatvxy2_1w, &aboatvxy3_1w, &aboatvxy4_1w, &aboatvxy5_1w, &aboatvxy6_1w, &aboatvxy7_1w, &aboatvxy8_1w, &aboatvxy9_1w, &aherochk_1w, &aboatfar_1w, &aviewfar_1w, 0};
+actListPtr ALcomenear_1w[] = {&aboatmov_1w, &aboatvxy10_1w, &aboatvxy11_1w, &aboatvxy12_1w, &aheronear_1w, &aboatnear_1w, &aviewnear_1w, 0};
+actListPtr ALmoveboat_1w[] = {&apush_1w, 0};
+actListPtr ALmoving_1w[] = {&amoving_1w, 0};
+actListPtr ALchkmove_1w[] = {&achkmove_1w, 0};
+actListPtr ALnotcut_1w[] = {&anotcut_1w, 0};
+actListPtr ALpushboat_1w[] = {&achkrope_1w, 0};
+actListPtr ALchkboat2_1w[] = {&achkboat2_1w, 0};
+actListPtr ALuseboat_1w[] = {&achkboat1_1w, 0};
+actListPtr ALrepno1_1w[] = {&arepnop_1w, &amans1_1w, &aboatvxy9_1w, 0};
+actListPtr ALrepno3_1w[] = {&arepno5_1w, &aboatvxy9_1w, 0};
+actListPtr ALrepyes1_1w[] = {&arepyep_1w, &amanq2_1w, 0};
+actListPtr ALrepyes2_1w[] = {&arepyep_1w, &amanq3_1w, 0};
+actListPtr ALrepyes3_1w[] = {&arepyep_1w, &amanq4_1w, 0};
+actListPtr ALrepyes4_1w[] = {&amanq5_1w, 0};
+actListPtr ALrepyes5_1w[] = {&amanq6_1w, 0};
+actListPtr ALrepyes6_1w[] = {&amanq7_1w, 0};
+actListPtr ALrepyes7_1w[] = {&abonus7_1w, &arepyep2_1w, &aompass_1w, 0};
+actListPtr ALomask_1w[] = {&amans3_1w, &amans4_1w, &amans5_1w, &amans6_1w, &amanq1_1w, 0};
+actListPtr ALomasked_1w[] = {&amans7_1w, 0};
+actListPtr ALoldman_1w[] = {&achkpass_1w, 0};
+actListPtr ALscr1213_1w[] = {&aheroxy1213_1w, &ascr1213_1w, 0};
+actListPtr ALjailrep_1w[] = {&ajail3_1w, &ajail4_1w, &ajailrep_1w, 0};
+actListPtr ALend_1w[] = {&ajails1_1w, &ajails2_1w, &ajails3_1w, &ajails4_1w, 0};
+actListPtr ALjail_1w[] = {&afinale_1w, &ajail1_1w, &ajail2_1w, &ajailrep_1w, &aend_1w, &atheend1_1w, &atheend2_1w, 0};
+actListPtr ALgive_1w[] = {&abonus8_1w, &agive1_1w, &agive2_1w, &aguardgo1_1w, &aguardgo2_1w, &aguardgo3_1w, &aguardgo4_1w, &aturnguard_1w, 0};
+actListPtr ALnogive_1w[] = {&anogive_1w, 0};
+actListPtr ALgold_1w[] = {&achkscr_1w, 0};
+actListPtr ALscr1211_1w[] = {&aswaphero_1w, &aheroxy1211_1w, &ascr1211_1w, 0};
+actListPtr ALgoodbye_1w[] = {&bye1_1w, &bye2_1w, &bye3_1w, 0};
+actListPtr ALok151_1w[] = {&aheroxy151_1w, &ascr151_1w, 0};
+actListPtr ALdmsg3_1w[] = {&admsg3_1w, 0};
+actListPtr ALdmsg2_1w[] = {&admsg2_1w, 0};
+actListPtr ALdmsg1_1w[] = {&admsg1_1w, 0};
+actListPtr ALchkd3_1w[] = {&achkd3_1w, 0};
+actListPtr ALchkd2_1w[] = {&achkd2_1w, 0};
+actListPtr ALchkd1_1w[] = {&achkd1_1w, 0};
+actListPtr ALscr151_1w[] = {&achkd0_1w, 0};
+actListPtr ALprof_1w[] = {&alab1_1w, &alab2_1w, &alab3_1w, &alab4_1w, &alab5_1w, &alab6_1w, &alab7_1w, &alab8_1w, &alab9_1w, &alab10_1w, &alab11_1w, &alab12_1w, &alab13_1w, &alab14_1w, 0};
+actListPtr ALlab_1w[] = {&achklab_1w, 0};
+actListPtr ALbox0_1w[] = {&acycle_1w, &abox2_1w, &abox3_1w, &abox4_1w, &abox4a_1w, &abox5_1w, &abox6_1w, &abox8a_1w, &abox9_1w, &abox10_1w, &abox11_1w, &abox12_1w, 0};
+actListPtr ALbbox_1w[] = {&abbox_1w, 0};
+actListPtr ALbox_1w[] = {&achkbbox_1w, &arepbox_1w, 0};
+actListPtr ALweird_1w[] = {&abgsnd_1w, &abg1_1w, &abg2_1w, &abg3_1w, &abg4_1w, &abg5_1w, &abg6_1w, &abg7_1w, &abg8_1w, 0};
+actListPtr ALcycle_1w[] = {&abox0_1w, &abox1_1w, &acyc1_1w, &acyc2_1w, &aweird_1w, &abox7_1w, &abox8_1w, 0};
+actListPtr ALinorm_1w[] = {&ainorm_1w, 0};
+actListPtr ALigor3_1w[] = {&acycle_1w, &aigor30_1w, &aigor31_1w, &aigor32_1w, &aigor33_1w, 0};
+actListPtr ALigor2_1w[] = {&acycle_1w, &aigor20_1w, &aigor21_1w, &aigor22_1w, &aigor23_1w, 0};
+actListPtr ALigor1_1w[] = {&acycle_1w, &aigor10_1w, &aigor11_1w, &aigor12_1w, &aigor13_1w, &aigor14_1w, 0};
+actListPtr ALigor0_1w[] = {&aigor0_1w, 0};
+actListPtr ALgobox_1w[] = {&agobox_1w, 0};
+actListPtr ALichk3_1w[] = {&aichk3_1w, 0};
+actListPtr ALichk2_1w[] = {&aichk2_1w, 0};
+actListPtr ALichk1_1w[] = {&aichk1_1w, 0};
+actListPtr ALichk0_1w[] = {&aichk0_1w, 0};
+actListPtr ALigor_1w[] = {&aichkbox_1w, 0};
+
+actList actListArr_1w[] = {
+ ALDummy, ALgoinside_1w, ALopendoor1_1w, ALclosedoor1_1w, ALightning_1w,
+ ALblinkeyes1_1w, ALbat_1w, ALpkin_1w, ALscr1_1w, ALridprof_1w,
+ ALopendoor2_1w, ALopendoor3_1w, ALblinkeyes2_1w, ALscr10_1w, ALscr13_1w,
+ ALscr15_1w, ALcuptxt0_1w, ALcuptxt1_1w, ALcuptxt2_1w, ALcuptxt3_1w,
+ ALlookcupb2_1w, ALlookcupb1_1w, ALlookcupb_1w, ALcupbpk_1w, ALcupbdw_1w,
+ ALchasehall_1w, ALchasekit_1w, ALdefbats_1w, ALnought_1w, ALcond9_1w,
+ ALcond5_1w, ALblowdw_1w, ALputmask_1w, ALscr115_1w, ALopenwdoorm_1w,
+ ALopenwdoors_1w, ALclosewdoors_1w, ALswapmask_1w, ALdropmask_1w, ALwearmask_1w,
+ ALremovemask_1w, ALusemask_1w, ALscr21_1w, ALbut_1w, ALbutler_1w,
+ ALbutp_1w, ALbutyes_1w, ALbutno_1w, ALbutchopped_1w, ALbutchop_1w,
+ ALbutroam_1w, AL_eatchop_1w, ALeatchop_1w, ALthrowchop_1w, ALchopfail_1w,
+ ALchoppass_1w, ALrepredeye_1w, ALreplips_1w, ALreparm_1w, ALtalkfrank_1w,
+ ALtalkdrac_1w, ALtalkgwen_1w, ALtalkhood_1w, ALtalkslime_1w, ALtalkpeahd_1w,
+ ALscr31_1w, ALscr35_1w, ALscr41_1w, ALscr51_1w, ALscr53_1w,
+ ALscr56_1w, ALscr57_1w, ALscr65_1w, ALopenyes_1w, ALopenno_1w,
+ ALopendoor4_1w, ALclosedoor4_1w, ALshedoil_1w, ALscr75_1w, ALdog_1w,
+ ALdead_1w, ALdoggy_1w, ALgetchop_1w, ALmovecarp_1w, ALridmask_1w,
+ ALopenpass_1w, ALopenfail_1w, ALopentrap_1w, ALclosetrap_1w, ALscr89_1w,
+ ALscr87_1w, ALhelpy_1w, ALhelpn_1w, ALhelpy2_1w, ALhelp_1w,
+ ALscr910_1w, ALscr98_1w, ALbatrep_1w, ALbatattack_1w, ALbatty_1w,
+ ALbats_1w, ALmum_1w, ALmummy_1w, ALrock_1w, ALscr109_1w,
+ ALscr1011_1w, ALscr1110_1w, ALscr1112_1w, ALcutrope_1w, ALherofar_1w,
+ ALembark_1w, ALnobung_1w, ALgetinboat_1w, ALplugbung_1w, ALdeboat_1w,
+ ALnodeboat_1w, ALchkout_1w, ALgetoutboat_1w, ALgofar_1w, ALcomenear_1w,
+ ALmoveboat_1w, ALmoving_1w, ALchkmove_1w, ALnotcut_1w, ALpushboat_1w,
+ ALchkboat2_1w, ALuseboat_1w, ALrepno1_1w, ALrepno3_1w, ALrepyes1_1w,
+ ALrepyes2_1w, ALrepyes3_1w, ALrepyes4_1w, ALrepyes5_1w, ALrepyes6_1w,
+ ALrepyes7_1w, ALomask_1w, ALomasked_1w, ALoldman_1w, ALscr1213_1w,
+ ALjailrep_1w, ALend_1w, ALjail_1w, ALgive_1w, ALnogive_1w,
+ ALgold_1w, ALscr1211_1w, ALgoodbye_1w, ALok151_1w, ALdmsg3_1w,
+ ALdmsg2_1w, ALdmsg1_1w, ALchkd3_1w, ALchkd2_1w, ALchkd1_1w,
+ ALscr151_1w, ALprof_1w, ALlab_1w, ALbox0_1w, ALbbox_1w,
+ ALbox_1w, ALweird_1w, ALcycle_1w, ALinorm_1w, ALigor3_1w,
+ ALigor2_1w, ALigor1_1w, ALigor0_1w, ALgobox_1w, ALichk3_1w,
+ ALichk2_1w, ALichk1_1w, ALichk0_1w, ALigor_1w
+};
+
+// Hugo 2 Win
+int dialrsp_2w[] = {kSTSdial2_2w, -1};
+int whorsp_2w[] = {kSTNobody_2w, kSTNo_one1_2w, kSTNo_one2_2w, kSTSharry_2w, -1};
+
+act0 arepchk_2w = {ASCHEDULE, 4, kALscr25_2w};
+act0 aclimax_2w = {ASCHEDULE, 20, kALclimax_2w};
+act0 aclue09_2w = {ASCHEDULE, 200 * NORMAL_TPS, kALchkc09_2w};
+act0 ahdrink10_2w = {ASCHEDULE, 72, kALhfaint_2w};
+act0 aschedbut_2w = {ASCHEDULE, 30, kALschedbut_2w};
+act0 arepbuga_2w = {ASCHEDULE, 3 * NORMAL_TPS, kALbugrep1_2w};
+act0 arepbugf_2w = {ASCHEDULE, 2 * NORMAL_TPS, kALbugrep2_2w};
+act0 arepblah_2w = {ASCHEDULE, 12 * NORMAL_TPS, kALblah_2w};
+act0 arepmsg1_2w = {ASCHEDULE, 120 * NORMAL_TPS, kALrepmsg1_2w};
+
+act1 aback1_2w = {START_OBJ, 0, CAT_2w, 0, INVISIBLE};
+act1 aback2_2w = {START_OBJ, 2, CAT_2w, 0, NOT_CYCLING};
+act1 aball3_2w = {START_OBJ, 0, BALLOON_2w, 0, INVISIBLE};
+act1 abel1_2w = {START_OBJ, 0, BELL_2w, 0, NOT_CYCLING};
+act1 acook7_2w = {START_OBJ, 60, COOKB_2w, 0, INVISIBLE};
+act1 acook8_2w = {START_OBJ, 60, COOK_2w, 0, NOT_CYCLING};
+act1 acop1_2w = {START_OBJ, 0, COP_2w, 0, CYCLE_FORWARD};
+act1 acop3_2w = {START_OBJ, 12, COP_2w, 0, INVISIBLE};
+act1 adone12_2w = {START_OBJ, 10, HERO, 0, CYCLE_FORWARD};
+act1 adone5_2w = {START_OBJ, 0, HORACE_2w, 0, CYCLE_FORWARD};
+act1 adyn2_2w = {START_OBJ, 0, DYNAMITE_2w, 0, NOT_CYCLING};
+act1 afall2_2w = {START_OBJ, 0, PENFALL_2w, 0, CYCLE_FORWARD};
+act1 afuze2_2w = {START_OBJ, 0, DYNAMITE_2w, 0, CYCLE_FORWARD};
+act1 agenie2_2w = {START_OBJ, 0, GENIE_2w, 0, CYCLE_FORWARD};
+act1 agiveb4_2w = {START_OBJ, 2, CAT_2w, 0, CYCLE_FORWARD};
+act1 agiveb7_2w = {START_OBJ, 0, CAT_2w, 0, INVISIBLE};
+act1 aglightoff1_2w = {START_OBJ, 0, GATELIGHT_2w, 0, INVISIBLE};
+act1 aglighton1_2w = {START_OBJ, 0, GATELIGHT_2w, 0, NOT_CYCLING};
+act1 ahdrink3_2w = {START_OBJ, 0, HESTER_2w, 0, CYCLE_FORWARD};
+act1 ahdrink6_2w = {START_OBJ, 70, HESTER_2w, 0, NOT_CYCLING};
+act1 ahest11_2w = {START_OBJ, 47, HESTER_2w, 0, NOT_CYCLING};
+act1 ahest2_2w = {START_OBJ, 0, HESTER_2w, 0, CYCLE_FORWARD};
+act1 ahfaint1_2w = {START_OBJ, 4, HERO, 0, INVISIBLE};
+act1 ahfaint3_2w = {START_OBJ, 4, PENNYLIE_2w, 0, NOT_CYCLING};
+act1 ahfaint4_2w = {START_OBJ, 8, PENNYLIE_2w, 0, INVISIBLE};
+act1 ahfaint5_2w = {START_OBJ, 8, HERO, 0, NOT_CYCLING};
+act1 akeyhole5_2w = {START_OBJ, 0, HERO, 0, INVISIBLE};
+act1 amaidb2_2w = {START_OBJ, 0, MAID_2w, 0, CYCLE_FORWARD};
+act1 amaidb5_2w = {START_OBJ, 10, MAID_2w, 0, INVISIBLE};
+act1 amaidbk3_2w = {START_OBJ, 0, MAID_2w, 0, CYCLE_FORWARD};
+act1 amaidbk7_2w = {START_OBJ, 10, MAID_2w, 0, NOT_CYCLING};
+act1 amat2_2w = {START_OBJ, 0, MATCHES_2w, 0, NOT_CYCLING};
+act1 amurd3_2w = {START_OBJ, 30, HERO, 0, NOT_CYCLING};
+act1 aom15_2w = {START_OBJ, 59, OLDMAN_2w, 0, INVISIBLE};
+act1 aom18_2w = {START_OBJ, 60, HERO, 0, NOT_CYCLING};
+act1 aom19_2w = {START_OBJ, 60, OLDMAN_2w, 0, NOT_CYCLING};
+act1 aomridlip_2w = {START_OBJ, 49, LIPS_2w, 0, INVISIBLE};
+act1 aopendoor1_2w = {START_OBJ, 0, DOOR1_2w, 1, CYCLE_FORWARD};
+act1 apaper2_2w = {START_OBJ, 0, PAPER_2w, 0, NOT_CYCLING};
+act1 aridban_2w = {START_OBJ, 0, BANANA_2w, 0, INVISIBLE};
+act1 aridcooklips_2w = {START_OBJ, 22, LIPS_2w, 0, INVISIBLE};
+act1 aridgard2_2w = {START_OBJ, 0, GARDENER_2w, 0, CYCLE_FORWARD};
+act1 aridgard6_2w = {START_OBJ, 20, GARDENER_2w, 0, INVISIBLE};
+act1 aridgarl_2w = {START_OBJ, 0, GARLIC_2w, 0, INVISIBLE};
+act1 arobot5_2w = {START_OBJ, 4, ROBOT_2w, 0, CYCLE_FORWARD};
+act1 aslightoff1_2w = {START_OBJ, 0, SHEDLIGHT_2w, 0, INVISIBLE};
+act1 aslighton1_2w = {START_OBJ, 0, SHEDLIGHT_2w, 0, NOT_CYCLING};
+act1 astick5_2w = {START_OBJ, 0, DOG_2w, 0, CYCLE_FORWARD};
+act1 astick7_2w = {START_OBJ, 16, DOG_2w, 0, INVISIBLE};
+act1 azapperoff1_2w = {START_OBJ, 0, ZAPPER_2w, 0, INVISIBLE};
+act1 azapperon1_2w = {START_OBJ, 0, ZAPPER_2w, 0, NOT_CYCLING};
+act1 adead1_2w = {START_OBJ, 0, HERO, 0, INVISIBLE};
+act1 adead3_2w = {START_OBJ, 0, PENNYLIE_2w, 0, NOT_CYCLING};
+act1 afaint2_2w = {START_OBJ, 10, HERO, 0, INVISIBLE};
+act1 afaint4_2w = {START_OBJ, 10, PENNYLIE_2w, 0, NOT_CYCLING};
+act1 afaint6_2w = {START_OBJ, 30, PENNYLIE_2w, 0, INVISIBLE};
+act1 afaint7_2w = {START_OBJ, 30, HERO, 0, NOT_CYCLING};
+act1 agone1_2w = {START_OBJ, 23, HERO, 0, INVISIBLE};
+act1 agone14_2w = {START_OBJ, 129, HERO, 0, CYCLE_FORWARD};
+act1 agone2_2w = {START_OBJ, 120, PENNYLIE_2w, 0, INVISIBLE};
+act1 agone4_2w = {START_OBJ, 120, HERO, 0, NOT_CYCLING};
+act1 aharry1_2w = {START_OBJ, 0, HARRY_2w, 0, NOT_CYCLING};
+act1 aharry6_2w = {START_OBJ, 4, HARRY_2w, 0, CYCLE_FORWARD};
+act1 amaidc10_2w = {START_OBJ, 26, MAID_2w, 0, INVISIBLE};
+act1 amaidc14_2w = {START_OBJ, 30, MAID_2w, 0, NOT_CYCLING};
+act1 amaidc5_2w = {START_OBJ, 8, MAID_2w, 0, CYCLE_FORWARD};
+act1 aopendoor2_2w = {START_OBJ, 0, DOOR2_2w, 1, CYCLE_FORWARD};
+act1 aopendoor3_2w = {START_OBJ, 0, DOOR3_2w, 1, CYCLE_FORWARD};
+act1 apenblie1_2w = {START_OBJ, 30, PENNY_2w, 0, INVISIBLE};
+act1 apenblie2_2w = {START_OBJ, 30, PENNYLIE_2w, 0, NOT_CYCLING};
+act1 apenbstart_2w = {START_OBJ, 0, PENNY_2w, 0, CYCLE_FORWARD};
+act1 apenbstop_2w = {START_OBJ, 20, PENNY_2w, 0, NOT_CYCLING};
+act1 apeng1_2w = {START_OBJ, 23, HERO, 0, INVISIBLE};
+act1 apeng3_2w = {START_OBJ, 40, HERO, 0, NOT_CYCLING};
+act1 aridmaidlips_2w = {START_OBJ, 15, LIPS_2w, 0, INVISIBLE};
+act1 aherostart_2w = {START_OBJ, 0, HERO, 0, NOT_CYCLING};
+act1 apenstart_2w = {START_OBJ, PENDELAY + 10, PENNY_2w, 0, CYCLE_FORWARD};
+act1 apenstop_2w = {START_OBJ, PENDELAY + 70, PENNY_2w, 0, NOT_CYCLING};
+act1 askip3_2w = {START_OBJ, 0, HERO, 0, NOT_CYCLING};
+
+act2 aback3_2w = {INIT_OBJXY, 2, CAT_2w, 189, 69};
+act2 abanana10_2w = {INIT_OBJXY, 16, GENIE_2w, 212, 10};
+act2 abanana11_2w = {INIT_OBJXY, 18, GENIE_2w, 209, 20};
+act2 abanana12_2w = {INIT_OBJXY, 20, GENIE_2w, 206, 40};
+act2 abanana13_2w = {INIT_OBJXY, 22, GENIE_2w, 200, 65};
+act2 abanana5_2w = {INIT_OBJXY, 00, GENIE_2w, 203, 60};
+act2 abanana6_2w = {INIT_OBJXY, 02, GENIE_2w, 206, 40};
+act2 abanana7_2w = {INIT_OBJXY, 04, GENIE_2w, 209, 20};
+act2 abanana8_2w = {INIT_OBJXY, 06, GENIE_2w, 212, 10};
+act2 abd1_2w = {INIT_OBJXY, 0, HERO, 214, 92};
+act2 abd10_2w = {INIT_OBJXY, 0, HERO, 20, 92};
+act2 abd20_2w = {INIT_OBJXY, 0, HERO, 20, 92};
+act2 abed2_1_2w = {INIT_OBJXY, 0, HERO, 200, 95};
+act2 abed3_1_2w = {INIT_OBJXY, 0, HERO, 60, 120};
+act2 abel3_2w = {INIT_OBJXY, 0, BELL_2w, 185, 110};
+act2 aboomxy_2w = {INIT_OBJXY, 0, PENNYLIE_2w, 120, 110};
+act2 acatroom1_2w = {INIT_OBJXY, 0, HERO, 258, 98};
+act2 achasm25_2w = {INIT_OBJXY, 0, HERO, 155, 20};
+act2 adumb1_2w = {INIT_OBJXY, 0, HERO, 40, 107};
+act2 adumb11_2w = {INIT_OBJXY, 0, HERO, 64, 103};
+act2 afall1_2w = {INIT_OBJXY, 0, PENFALL_2w, 188, 95};
+act2 agard3_2w = {INIT_OBJXY, 0, GARDENER_2w, 190, 90};
+act2 agates1_2w = {INIT_OBJXY, 0, HERO, 279, 108};
+act2 agates11_2w = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 agiveb6_2w = {INIT_OBJXY, 2, CAT_2w, 157, 96};
+act2 ahall1_1_2w = {INIT_OBJXY, 0, HERO, 14, 92};
+act2 ahall1_2_2w = {INIT_OBJXY, 0, HERO, 35, 130};
+act2 ahall2_1_2w = {INIT_OBJXY, 0, HERO, 61, 105};
+act2 ahall2_2_2w = {INIT_OBJXY, 0, HERO, 231, 120};
+act2 ahall2_3_2w = {INIT_OBJXY, 0, HERO, 182, 122};
+act2 ahall2_4_2w = {INIT_OBJXY, 0, HERO, 160, 140};
+act2 ahall2_5_2w = {INIT_OBJXY, 0, HERO, 264, 117};
+act2 ahall3_1_2w = {INIT_OBJXY, 0, HERO, 147, 112};
+act2 ahall3_2_2w = {INIT_OBJXY, 0, HERO, 42, 41};
+act2 aheroxy12_2w = {INIT_OBJXY, DOORDELAY, HERO, 100, 125};
+act2 ahest1_2w = {INIT_OBJXY, 0, HESTER_2w, 78, 114};
+act2 ahestroom1_2w = {INIT_OBJXY, 0, HERO, 108, 76};
+act2 ainshed1_2w = {INIT_OBJXY, 0, HERO, 140, 88};
+act2 akennel1_2w = {INIT_OBJXY, 0, HERO, 283, 63};
+act2 akit1_2w = {INIT_OBJXY, 0, HERO, 145, 120};
+act2 akit11_2w = {INIT_OBJXY, 0, HERO, 40, 108};
+act2 aladder1_2w = {INIT_OBJXY, 0, HERO, 282, 107};
+act2 alamp1_2w = {INIT_OBJXY, 0, HERO, 26, 46};
+act2 alignpen_2w = {INIT_OBJXY, 0, HERO, 52, 107};
+act2 alounge1_2w = {INIT_OBJXY, 0, HERO, 232, 55};
+act2 amaidbk8_2w = {INIT_OBJXY, 12, MAID_2w, 207, 99};
+act2 amat4_2w = {INIT_OBJXY, 0, MATCHES_2w, 216, 146};
+act2 amurd2_2w = {INIT_OBJXY, 26, MURDER_2w, 120, 86};
+act2 amush1_2w = {INIT_OBJXY, 0, HERO, 272, 107};
+act2 amush11_2w = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 amush21_2w = {INIT_OBJXY, 0, HERO, 95, 26};
+act2 aom17_2w = {INIT_OBJXY, 60, OLDMAN_2w, 155, 95};
+act2 aorgan1_2w = {INIT_OBJXY, 0, HERO, 241, 76};
+act2 apanel2_2w = {INIT_OBJXY, 0, PANEL_2w, 189, 91};
+act2 apanel4_2w = {INIT_OBJXY, 20, HERO, 192, 95};
+act2 apaper4_2w = {INIT_OBJXY, 0, PAPER_2w, 138, 130};
+act2 aparlor1_2w = {INIT_OBJXY, 0, HERO, 75, 75};
+act2 aparlor2_2w = {INIT_OBJXY, 0, HERO, 86, 30};
+act2 aparlor3_2w = {INIT_OBJXY, 2, HERO, 263, 114};
+act2 aparty1b_2w = {INIT_OBJXY, 0, COP_2w, 80, 115};
+act2 aparty2b_2w = {INIT_OBJXY, 0, MAID_2w, 100, 130};
+act2 aparty3b_2w = {INIT_OBJXY, 0, HESTER_2w, 120, 120};
+act2 aparty4b_2w = {INIT_OBJXY, 0, GARDENER_2w, 140, 120};
+act2 aparty5b_2w = {INIT_OBJXY, 0, SNAKE_2w, 80, 150};
+act2 aparty6b_2w = {INIT_OBJXY, 0, GENIE_2w, 70, 120};
+act2 aparty7b_2w = {INIT_OBJXY, 0, HARRY_2w, 150, 130};
+act2 aparty8b_2w = {INIT_OBJXY, 0, DOCTOR_2w, 170, 100};
+act2 aparty9b_2w = {INIT_OBJXY, 0, COOK_2w, 200, 110};
+act2 apass1_2w = {INIT_OBJXY, 0, HERO, 262, 45};
+act2 apass11_2w = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 apen4_2w = {INIT_OBJXY, 0, HERO, 147, 112};
+act2 aphone1_2w = {INIT_OBJXY, 0, HERO, 286, 108};
+act2 aphone11c_2w = {INIT_OBJXY, 0, HERO, 146, 127};
+act2 aphone11l_2w = {INIT_OBJXY, 0, HERO, 285, 87};
+act2 aphone11r_2w = {INIT_OBJXY, 0, HERO, 18, 93};
+act2 aretupxy_2w = {INIT_OBJXY, 0, HERO, 61, 81};
+act2 aridgard3_2w = {INIT_OBJXY, 4, GARDENER_2w, 190, 88};
+act2 arockg1_2w = {INIT_OBJXY, 0, HERO, 146, 122};
+act2 arxy_2w = {INIT_OBJXY, 0, HERO, 75, 73};
+act2 arxy21_2w = {INIT_OBJXY, 0, HERO, 205, 82};
+act2 ascr33c_2w = {INIT_OBJXY, 4, HERO, 160, 105};
+act2 ashed1_2w = {INIT_OBJXY, 0, HERO, 139, 139};
+act2 ashed11_2w = {INIT_OBJXY, 0, HERO, 54, 89};
+act2 ashed21_2w = {INIT_OBJXY, 0, HERO, 13, 124};
+act2 asnake1_2w = {INIT_OBJXY, 0, HERO, 264, 79};
+act2 asnake11_2w = {INIT_OBJXY, 0, HERO, 14, 66};
+act2 asnake21_2w = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 astick3_2w = {INIT_OBJXY, 0, DOG_2w, 165, 80};
+act2 astream1_2w = {INIT_OBJXY, 0, HERO, 283, 124};
+act2 astream11_2w = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 athree1_2w = {INIT_OBJXY, 0, HERO, 268, 50};
+act2 athree11_2w = {INIT_OBJXY, 0, HERO, 272, 69};
+act2 athree21_2w = {INIT_OBJXY, 0, HERO, 19, 81};
+act2 athree31_2w = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 atrap1_2w = {INIT_OBJXY, 0, HERO, 209, 35};
+act2 atrap2_2w = {INIT_OBJXY, 0, HERO, 270, 87};
+act2 auptrap1_2w = {INIT_OBJXY, 0, HERO, 193, 101};
+act2 avenus1_2w = {INIT_OBJXY, 0, HERO, 275, 130};
+act2 awell1_2w = {INIT_OBJXY, 0, HERO, 146, 131};
+act2 awho3_2w = {INIT_OBJXY, 0, HERO, 255, 39};
+act2 azap1_2w = {INIT_OBJXY, 0, HERO, 284, 110};
+act2 azap11_2w = {INIT_OBJXY, 0, HERO, 25, 64};
+act2 abuga1c_2w = {INIT_OBJXY, 0, BUG1_2w, 165, 25};
+act2 abuga2c_2w = {INIT_OBJXY, 0, BUG2_2w, 265, 95};
+act2 abuga3c_2w = {INIT_OBJXY, 0, BUG3_2w, 255, 110};
+act2 abuga4c_2w = {INIT_OBJXY, 0, BUG4_2w, 300, 120};
+act2 abuga5c_2w = {INIT_OBJXY, 0, BUG5_2w, 175, 130};
+act2 abugf1c_2w = {INIT_OBJXY, 0, BUG1_2w, 65, 25};
+act2 abugf2c_2w = {INIT_OBJXY, 0, BUG2_2w, 245, 85};
+act2 abugf3c_2w = {INIT_OBJXY, 0, BUG3_2w, 155, 60};
+act2 abugf4c_2w = {INIT_OBJXY, 0, BUG4_2w, 270, 25};
+act2 abugf5c_2w = {INIT_OBJXY, 0, BUG5_2w, 175, 30};
+act2 agone3_2w = {INIT_OBJXY, 23, HERO, 229, 119};
+act2 aheroxy11_2w = {INIT_OBJXY, 0, HERO, 160, 100};
+act2 aheroxy3435_2w = {INIT_OBJXY, DOORDELAY, HERO, 76, 133};
+act2 aheroxy3436_2w = {INIT_OBJXY, DOORDELAY, HERO, 246, 120};
+act2 amaidc12_2w = {INIT_OBJXY, 30, MAID_2w, 207, 99};
+act2 amaidc3_2w = {INIT_OBJXY, 8, MAID_2w, 74, 78};
+act2 amaidp2_2w = {INIT_OBJXY, 0, MAID_2w, 207, 99};
+act2 amazexy_2w = {INIT_OBJXY, 0, HERO, 134, 92};
+act2 apenbxy1_2w = {INIT_OBJXY, 0, PENNY_2w, 129, 119};
+act2 apenbxy2_2w = {INIT_OBJXY, 30, PENNYLIE_2w, 215, 125};
+act2 apeng2_2w = {INIT_OBJXY, 23, HERO, 192, 93};
+act2 aheroxy01_2w = {INIT_OBJXY, 0, HERO, 169, 141};
+act2 apenxy_2w = {INIT_OBJXY, 0, PENNY_2w, 109, 140};
+act2 askip2_2w = {INIT_OBJXY, 0, HERO, 100, 100};
+
+act3 aclimax7_2w = {PROMPT, 100, kSTSclimax7_2w, whorsp_2w, kALcheat_2w, kALdidnt_2w, false};
+act3 adial_2w = {PROMPT, 0, kSTSdial1_2w, dialrsp_2w, kALwho_2w, kALnoreply_2w, false};
+act3 asafepr_2w = {PROMPT, 0, kSTSafepr_2w, dialrsp_2w, kALcomb1_2w, kALcomb2_2w, false};
+
+act5 aball2_2w = {INIT_OBJVXY, 0, BALLOON_2w, 0, 0};
+act5 acop2_2w = {INIT_OBJVXY, 0, COP_2w, DX, 0};
+act5 adone11_2w = {INIT_OBJVXY, 10, HERO, 0, -1};
+act5 adone7_2w = {INIT_OBJVXY, 0, HORACE_2w, -DX, DY};
+act5 adone8_2w = {INIT_OBJVXY, 10, HORACE_2w, 0, -1};
+act5 afall4_2w = {INIT_OBJVXY, 0, PENFALL_2w, 0, 4};
+act5 ahest10_2w = {INIT_OBJVXY, 46, HESTER_2w, 0, 0};
+act5 ahest4_2w = {INIT_OBJVXY, 0, HESTER_2w, DX, 0};
+act5 ahest6_2w = {INIT_OBJVXY, 22, HESTER_2w, 0, -DY};
+act5 ahest8_2w = {INIT_OBJVXY, 24, HESTER_2w, -DX, -1};
+act5 amaidb3_2w = {INIT_OBJVXY, 0, MAID_2w, DX, 0};
+act5 amaidb4_2w = {INIT_OBJVXY, 10, MAID_2w, 0, 0};
+act5 amaidbk4_2w = {INIT_OBJVXY, 0, MAID_2w, -DX, 0};
+act5 amaidbk5_2w = {INIT_OBJVXY, 10, MAID_2w, 0, 0};
+act5 amaidstop2_2w = {INIT_OBJVXY, 0, MAID_2w, 0, 0};
+act5 aom3_2w = {INIT_OBJVXY, 12, HERO, 0, 0};
+act5 aom8_2w = {INIT_OBJVXY, 40, HERO, 0, 0};
+act5 apanel3_2w = {INIT_OBJVXY, 5, PANEL_2w, 0, -4};
+act5 apanel8_2w = {INIT_OBJVXY, 25, PANEL_2w, 0, 4};
+act5 aridgard5_2w = {INIT_OBJVXY, 4, GARDENER_2w, -2 * DX, 0};
+act5 arobot4_2w = {INIT_OBJVXY, 4, ROBOT_2w, 0, 0};
+act5 astick6_2w = {INIT_OBJVXY, 0, DOG_2w, -DX * 2, 0};
+act5 abkstart1_2w = {INIT_OBJVXY, 0, BOOKCASE_2w, -2, 0};
+act5 abkstart2_2w = {INIT_OBJVXY, 23, BOOKCASE_2w, +2, 0};
+act5 abkstop_2w = {INIT_OBJVXY, 46, BOOKCASE_2w, 0, 0};
+act5 adead4_2w = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 agone15_2w = {INIT_OBJVXY, 133, HERO, -DX, 0};
+act5 amaidc1_2w = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 amaidc6_2w = {INIT_OBJVXY, 8, MAID_2w, DX, 0};
+act5 amaidc8_2w = {INIT_OBJVXY, 16, MAID_2w, -DX, 0};
+act5 amaidc9_2w = {INIT_OBJVXY, 26, MAID_2w, 0, 0};
+act5 apenbvxy1_2w = {INIT_OBJVXY, 0, PENNY_2w, DX, 0};
+act5 apenbvxy2_2w = {INIT_OBJVXY, 20, PENNY_2w, 0, 0};
+act5 astophero_2w = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 apenvxy1_2w = {INIT_OBJVXY, PENDELAY + 10, PENNY_2w, -DX, 0};
+act5 apenvxy2_2w = {INIT_OBJVXY, PENDELAY + 17, PENNY_2w, 0, -DY};
+act5 apenvxy3_2w = {INIT_OBJVXY, PENDELAY + 42, PENNY_2w, DX, 0};
+act5 apenvxy4_2w = {INIT_OBJVXY, PENDELAY + 70, PENNY_2w, 0, 0};
+
+act6 abanana2_2w = {INIT_CARRY, 0, BANANA_2w, false};
+act6 abel2_2w = {INIT_CARRY, 0, BELL_2w, false};
+act6 adrop33a_2w = {INIT_CARRY, 0, BOTTLE_2w, false};
+act6 adrop33b_2w = {INIT_CARRY, 0, GUN_2w, false};
+act6 adrop33c_2w = {INIT_CARRY, 0, BELL_2w, false};
+act6 adrop33d_2w = {INIT_CARRY, 0, SCREW_2w, false};
+act6 adrop33e_2w = {INIT_CARRY, 0, ALBUM_2w, false};
+act6 adrop33f_2w = {INIT_CARRY, 0, WILL_2w, false};
+act6 adrop33g_2w = {INIT_CARRY, 0, OILLAMP_2w, false};
+act6 adrop33h_2w = {INIT_CARRY, 0, CATNIP_2w, false};
+act6 adrop33i_2w = {INIT_CARRY, 0, MAGNIFY_2w, false};
+act6 adrop33j_2w = {INIT_CARRY, 0, MATCHES_2w, false};
+act6 adropban_2w = {INIT_CARRY, 0, BANANA_2w, false};
+act6 adropgarl_2w = {INIT_CARRY, 0, GARLIC_2w, false};
+act6 amat3_2w = {INIT_CARRY, 0, MATCHES_2w, false};
+act6 apaper3_2w = {INIT_CARRY, 0, PAPER_2w, false};
+act6 aphoto1_2w = {INIT_CARRY, 0, ALBUM_2w, true};
+act6 asafe4_2w = {INIT_CARRY, 0, WILL_2w, true};
+act6 asonic5_2w = {INIT_CARRY, 0, SCREW_2w, true};
+act6 astick9_2w = {INIT_CARRY, 0, STICK_2w, false};
+
+act7 agard2_2w = {INIT_HF_COORD, 0, GARDENER_2w};
+act7 agetgarlic_2w = {INIT_HF_COORD, 0, GARLIC_2w};
+act7 agetmatch_2w = {INIT_HF_COORD, 0, MATCHES_2w};
+act7 ahfaint2_2w = {INIT_HF_COORD, 4, PENNYLIE_2w};
+act7 adead2_2w = {INIT_HF_COORD, 0, PENNYLIE_2w};
+act7 afaint3_2w = {INIT_HF_COORD, 10, PENNYLIE_2w};
+act7 apenscr_2w = {INIT_HF_COORD, 0, PENNY_2w};
+
+act8 akaboom3_2w = {NEW_SCREEN, 0, 22};
+act8 arg_2w = {NEW_SCREEN, 0, 22};
+act8 arr_2w = {NEW_SCREEN, 0, 21};
+act8 arr21_2w = {NEW_SCREEN, 0, 16};
+act8 ascr0204_2w = {NEW_SCREEN, 0, 4};
+act8 ascr0305_2w = {NEW_SCREEN, 0, 5};
+act8 ascr0306_2w = {NEW_SCREEN, 0, 6};
+act8 ascr0402_2w = {NEW_SCREEN, 30, 2};
+act8 ascr0503_2w = {NEW_SCREEN, 0, 3};
+act8 ascr0603_2w = {NEW_SCREEN, 0, 3};
+act8 ascr0607_2w = {NEW_SCREEN, 0, 7};
+act8 ascr0631_2w = {NEW_SCREEN, 0, 31};
+act8 ascr0706_2w = {NEW_SCREEN, 0, 6};
+act8 ascr0708_2w = {NEW_SCREEN, 0, 8};
+act8 ascr0710_2w = {NEW_SCREEN, 0, 10};
+act8 ascr0807_2w = {NEW_SCREEN, 0, 7};
+act8 ascr0809_2w = {NEW_SCREEN, 0, 9};
+act8 ascr0811_2w = {NEW_SCREEN, 0, 11};
+act8 ascr0812_2w = {NEW_SCREEN, 0, 12};
+act8 ascr0908_2w = {NEW_SCREEN, 0, 8};
+act8 ascr1007_2w = {NEW_SCREEN, 0, 7};
+act8 ascr1108_2w = {NEW_SCREEN, 0, 8};
+act8 ascr1113_2w = {NEW_SCREEN, 0, 13};
+act8 ascr12_2w = {NEW_SCREEN, DOORDELAY, 2};
+act8 ascr1314_2w = {NEW_SCREEN, 0, 14};
+act8 ascr1413_2w = {NEW_SCREEN, 0, 13};
+act8 ascr1415_2w = {NEW_SCREEN, 0, 15};
+act8 ascr1514_2w = {NEW_SCREEN, 0, 14};
+act8 ascr1516_2w = {NEW_SCREEN, 0, 16};
+act8 ascr1517_2w = {NEW_SCREEN, 0, 17};
+act8 ascr1615_2w = {NEW_SCREEN, 0, 15};
+act8 ascr1715_2w = {NEW_SCREEN, 0, 15};
+act8 ascr1718_2w = {NEW_SCREEN, 0, 18};
+act8 ascr1720_2w = {NEW_SCREEN, 0, 20};
+act8 ascr1817_2w = {NEW_SCREEN, 0, 17};
+act8 ascr1819_2w = {NEW_SCREEN, 0, 19};
+act8 ascr1837_2w = {NEW_SCREEN, 0, 37};
+act8 ascr1918_2w = {NEW_SCREEN, 0, 18};
+act8 ascr2017_2w = {NEW_SCREEN, 0, 17};
+act8 ascr2223_2w = {NEW_SCREEN, 0, 23};
+act8 ascr2322_2w = {NEW_SCREEN, 0, 22};
+act8 ascr2324_2w = {NEW_SCREEN, 0, 24};
+act8 ascr2325_2w = {NEW_SCREEN, 0, 25};
+act8 ascr2326_2w = {NEW_SCREEN, 0, 26};
+act8 ascr2423_2w = {NEW_SCREEN, 0, 23};
+act8 ascr2523_2w = {NEW_SCREEN, 0, 23};
+act8 ascr2623_2w = {NEW_SCREEN, 0, 23};
+act8 ascr2627_2w = {NEW_SCREEN, 0, 27};
+act8 ascr2726_2w = {NEW_SCREEN, 0, 26};
+act8 ascr2827_2w = {NEW_SCREEN, 0, 27};
+act8 ascr2829_2w = {NEW_SCREEN, 0, 29};
+act8 ascr2928_2w = {NEW_SCREEN, 0, 28};
+act8 ascr2930_2w = {NEW_SCREEN, 0, 30};
+act8 ascr2931_2w = {NEW_SCREEN, 0, 31};
+act8 ascr2934_2w = {NEW_SCREEN, 0, 34};
+act8 ascr2938_2w = {NEW_SCREEN, 0, 38};
+act8 ascr3029_2w = {NEW_SCREEN, 0, 29};
+act8 ascr3106_2w = {NEW_SCREEN, 2, 6};
+act8 ascr3129_2w = {NEW_SCREEN, 0, 29};
+act8 ascr3132_2w = {NEW_SCREEN, 0, 32};
+act8 ascr3231_2w = {NEW_SCREEN, 0, 31};
+act8 ascr3334_2w = {NEW_SCREEN, 0, 34};
+act8 ascr33d_2w = {NEW_SCREEN, 4, 33};
+act8 ascr3429_2w = {NEW_SCREEN, 0, 29};
+act8 ascr3438_2w = {NEW_SCREEN, 0, 38};
+act8 ascr3534_2w = {NEW_SCREEN, 0, 34};
+act8 ascr3634_2w = {NEW_SCREEN, 0, 34};
+act8 ascr3718_2w = {NEW_SCREEN, 0, 18};
+act8 ascr3829_2w = {NEW_SCREEN, 0, 29};
+act8 ascr3834_2w = {NEW_SCREEN, 0, 34};
+act8 auptrap2_2w = {NEW_SCREEN, 0, 28};
+act8 ascr0203_2w = {NEW_SCREEN, 40, 3};
+act8 ascr11maze_2w = {NEW_SCREEN, 0, MAZE_SCREEN + 59};// Enter maze
+act8 ascr3435_2w = {NEW_SCREEN, DOORDELAY, 35}; // Goto to organ
+act8 ascr3436_2w = {NEW_SCREEN, DOORDELAY, 36}; // Goto to hestroom
+act8 ascrmaze_2w = {NEW_SCREEN, 0, 11}; // Maze exit to gatesopn
+act8 ascr01_2w = {NEW_SCREEN, STORYDELAY + 10, 1};
+act8 askip5_2w = {NEW_SCREEN, 0, 3};
+
+act9 abanana9_2w = {INIT_OBJSTATE, 16, GENIE_2w, 1};
+act9 abite1_2w = {INIT_OBJSTATE, 0, SNAKE_2w, 1};
+act9 acallp1_2w = {INIT_OBJSTATE, 0, TARDIS_2w, 1};
+act9 acat2_2w = {INIT_OBJSTATE, 0, CATNIP_2w, 1};
+act9 acook6_2w = {INIT_OBJSTATE, 0, COOK_2w, 2};
+act9 acookp1_2w = {INIT_OBJSTATE, 0, COOK_2w, 1};
+act9 adynamite1_2w = {INIT_OBJSTATE, 0, DYNAMITE_2w, 1};
+act9 afinito_2w = {INIT_OBJSTATE, 0, HERO, 1};
+act9 afuze3_2w = {INIT_OBJSTATE, 0, WELL_2w, 1};
+act9 agarl1_2w = {INIT_OBJSTATE, 0, GARLIC_2w, 1};
+act9 agenie4_2w = {INIT_OBJSTATE, 0, OILLAMP_2w, 1};
+act9 agotalbum_2w = {INIT_OBJSTATE, 0, CATNIP_2w, 2};
+act9 ahdrink1_2w = {INIT_OBJSTATE, 0, LETTER_2w, 3};
+act9 ahdrink7_2w = {INIT_OBJSTATE, 70, LETTER_2w, 2};
+act9 ahest16_2w = {INIT_OBJSTATE, 50, LETTER_2w, 1};
+act9 ahestd1_2w = {INIT_OBJSTATE, 0, LETTER_2w, 2};
+act9 akeyhole3_2w = {INIT_OBJSTATE, 0, KEYHOLE_2w, 1};
+act9 akeyhole4_2w = {INIT_OBJSTATE, 0, BOOK_2w, 2};
+act9 amat1_2w = {INIT_OBJSTATE, 0, MATCHES_2w, 1};
+act9 amissed1_2w = {INIT_OBJSTATE, 0, GUN_2w, 1};
+act9 aom4_2w = {INIT_OBJSTATE, 12, OLDMAN_2w, 1};
+act9 apanel1_2w = {INIT_OBJSTATE, 0, PANEL_2w, 1};
+act9 apaper1_2w = {INIT_OBJSTATE, 0, PAPER_2w, 1};
+act9 apaper5_2w = {INIT_OBJSTATE, 0, PAPER_2w, 0};
+act9 aphoto5_2w = {INIT_OBJSTATE, 0, ALBUM_2w, 1};
+act9 apushkey_2w = {INIT_OBJSTATE, 0, PENCIL_2w, 1};
+act9 aridkey1_2w = {INIT_OBJSTATE, 0, PAPER_2w, 2};
+act9 arobot6_2w = {INIT_OBJSTATE, 4, ROBOT_2w, 1};
+act9 asafe2_2w = {INIT_OBJSTATE, 0, SAFE_2w, 1};
+act9 asafe3_2w = {INIT_OBJSTATE, 0, WILL_2w, 1};
+act9 asonic7_2w = {INIT_OBJSTATE, 0, DOCTOR_2w, 1};
+act9 ast12_2w = {INIT_OBJSTATE, DOORDELAY, DOOR1_2w, 0};
+act9 astick2_2w = {INIT_OBJSTATE, 0, STICK_2w, 1};
+act9 awho4_2w = {INIT_OBJSTATE, 0, TARDIS_2w, 2};
+act9 amaidp9_2w = {INIT_OBJSTATE, 12, MAID_2w, 1};
+act9 asetbk1_2w = {INIT_OBJSTATE, 0, BOOK_2w, 1};
+act9 asetbk2_2w = {INIT_OBJSTATE, 0, BOOK_2w, 2};
+act9 asetbk3_2w = {INIT_OBJSTATE, 0, BOOK_2w, 3};
+act9 ast3435_2w = {INIT_OBJSTATE, DOORDELAY, DOOR2_2w, 0};
+act9 ast3436_2w = {INIT_OBJSTATE, DOORDELAY, DOOR3_2w, 0};
+
+act10 aball1_2w = {INIT_PATH, 0, BALLOON_2w, AUTO, 0, 0};
+act10 abanana14_2w = {INIT_PATH, 24, GENIE_2w, WANDER, DX, DY};
+act10 abanana4_2w = {INIT_PATH, 0, GENIE_2w, AUTO, 0, 0};
+act10 acook9_2w = {INIT_PATH, 60, COOK_2w, WANDER, DX, DY};
+act10 agard11_2w = {INIT_PATH, 300, GARDENER_2w, WANDER, DX, DY};
+act10 agard4_2w = {INIT_PATH, 16, GARDENER_2w, CHASE, DX, DY};
+act10 agenie3_2w = {INIT_PATH, 4, GENIE_2w, CHASE, DX, DY};
+act10 ahfaint6_2w = {INIT_PATH, 8, HERO, USER, 0, 0};
+act10 akeyhole6_2w = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 amaidstop1_2w = {INIT_PATH, 0, MAID_2w, AUTO, 0, 0};// For phase 3
+act10 aom2_2w = {INIT_PATH, 12, HERO, AUTO, 0, 0};
+act10 aom20_2w = {INIT_PATH, 60, HERO, USER, 0, 0};
+act10 apanel5_2w = {INIT_PATH, 20, HERO, USER, 0, 0};
+act10 aparty1c_2w = {INIT_PATH, 0, COP_2w, CHASE, DX, DY};
+act10 aparty2c_2w = {INIT_PATH, 0, MAID_2w, WANDER, DX, DY};
+act10 aparty3c_2w = {INIT_PATH, 0, HESTER_2w, WANDER, DX, DY};
+act10 aparty4c_2w = {INIT_PATH, 0, GARDENER_2w, WANDER, DX, DY};
+act10 aparty5c_2w = {INIT_PATH, 0, SNAKE_2w, WANDER, DX, DY};
+act10 aparty6c_2w = {INIT_PATH, 0, GENIE_2w, WANDER, DX, DY};
+act10 aparty7c_2w = {INIT_PATH, 0, HARRY_2w, AUTO, 0, 0};
+act10 aparty8c_2w = {INIT_PATH, 0, DOCTOR_2w, WANDER, DX, DY};
+act10 aparty9c_2w = {INIT_PATH, 0, COOK_2w, WANDER, DX, DY};
+act10 aridgard1_2w = {INIT_PATH, 0, GARDENER_2w, AUTO, 0, 0};
+act10 arobot3_2w = {INIT_PATH, 0, ROBOT_2w, AUTO, 0, 0};
+act10 arobot7_2w = {INIT_PATH, 4, DOCTOR_2w, CHASE, DX / 2, DY / 2};
+act10 ascr33a_2w = {INIT_PATH, 4, HERO, USER, 0, 0};
+act10 asonic9_2w = {INIT_PATH, 16, DOCTOR_2w, WANDER, DX, DY};
+act10 astick8_2w = {INIT_PATH, 16, HERO, USER, 0, 0};
+act10 abuga1a_2w = {INIT_PATH, 0, BUG1_2w, CHASE, DX * 2, DY * 2};
+act10 abuga1b_2w = {INIT_PATH, 7, BUG1_2w, WANDER2, DX, DY};
+act10 abuga2a_2w = {INIT_PATH, 0, BUG2_2w, CHASE, DX, DY};
+act10 abuga2b_2w = {INIT_PATH, 9, BUG2_2w, WANDER2, DX, DY};
+act10 abuga3a_2w = {INIT_PATH, 0, BUG3_2w, CHASE, DX * 2, DY * 2};
+act10 abuga3b_2w = {INIT_PATH, 6, BUG3_2w, WANDER2, DX, DY};
+act10 abuga4a_2w = {INIT_PATH, 0, BUG4_2w, CHASE, DX, DY};
+act10 abuga4b_2w = {INIT_PATH, 10, BUG4_2w, WANDER2, DX * 2, DY * 2};
+act10 abuga5a_2w = {INIT_PATH, 0, BUG5_2w, CHASE, DX, DY};
+act10 abuga5b_2w = {INIT_PATH, 4, BUG5_2w, WANDER2, DX, DY};
+act10 abugf1b_2w = {INIT_PATH, 10, BUG1_2w, WANDER2, DX, DY};
+act10 abugf2b_2w = {INIT_PATH, 12, BUG2_2w, WANDER2, DX, DY};
+act10 abugf3b_2w = {INIT_PATH, 5, BUG3_2w, WANDER2, DX, DY};
+act10 abugf4b_2w = {INIT_PATH, 10, BUG4_2w, WANDER2, DX * 2, DY * 2};
+act10 abugf5b_2w = {INIT_PATH, 5, BUG5_2w, WANDER2, DX, DY};
+act10 acyc2_2w = {INIT_PATH, 120, HERO, USER, 0, 0};
+act10 adisable_2w = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 afaint8_2w = {INIT_PATH, 30, HERO, USER, 0, 0};
+act10 amaid2_2w = {INIT_PATH, 18, MAID_2w, CHASE, DX, 0};
+act10 amaidc15_2w = {INIT_PATH, 30, HERO, USER, 0, 0};
+act10 amaidgo_2w = {INIT_PATH, 25, HERO, USER, 0, 0};
+act10 apeng4_2w = {INIT_PATH, 40, HERO, USER, 0, 0};
+act10 askip4_2w = {INIT_PATH, 0, HERO, USER, 0, 0};
+
+act11 abutchk_2w = {COND_R, 0, GARLIC_2w, 0, kALcantpush_2w, 0};
+act11 achkbite_2w = {COND_R, 0, SNAKE_2w, 0, kALnocure_2w, kALcure_2w};
+act11 achkc09_2w = {COND_R, 0, GARLIC_2w, 0, kALclue09_2w, 0};
+act11 achkcook_2w = {COND_R, 0, COOK_2w, 1, kALcook_2w, 0};
+act11 achkcookp_2w = {COND_R, 0, COOK_2w, 0, kALcookp_2w, 0};
+act11 achkcop_2w = {COND_R, 0, COP_2w, 0x1f, kALcop_2w, 0};
+act11 achkcop2_2w = {COND_R, 0, COP_2w, 0x1f, kALparty_2w, 0};
+act11 achkdoc_2w = {COND_R, 0, DOCTOR_2w, 0, kALsonic_2w, 0};
+act11 achkgive_2w = {COND_R, 0, CATNIP_2w, 1, kALgiveb3_2w, kALgiveb4_2w};
+act11 achkhero_2w = {COND_R, 0, HERO, 1, kALdone_2w, 0};
+act11 achkhr1_2w = {COND_R, 0, LETTER_2w, 0, kALhrgreet_2w, 0};
+act11 achkhr2_2w = {COND_R, 0, LETTER_2w, 3, 0, kALhprompt_2w};
+act11 achkhr3_2w = {COND_R, 0, LETTER_2w, 1, kALrephest_2w, 0};
+act11 achkken1_2w = {COND_R, 0, STICK_2w, 1, kALthrown_2w, kALdog1_2w};
+act11 achkken2_2w = {COND_R, 0, DYNAMITE_2w, 0, kALdyn1_2w, kALempty_2w};
+act11 achkkit_2w = {COND_R, 0, GENIE_2w, 1, kALscrok_2w, kALstuck_2w};
+act11 achkld1_2w = {COND_R, 0, MATCHES_2w, 1, kALsoggy_2w, kALmatok_2w};
+act11 achkmat2_2w = {COND_R, 0, MATCHES_2w, 0, kALdropmat_2w, 0};
+act11 achknasty_2w = {COND_R, 0, BOTTLE_2w, 0, kALnasty_2w, 0};
+act11 achkom_2w = {COND_R, 0, OLDMAN_2w, 0, kALomgag_2w, 0};
+act11 achkpanel_2w = {COND_R, 0, PANEL_2w, 0, kALpanel_2w, 0};
+act11 achkpaper1_2w = {COND_R, 0, PAPER_2w, 1, kALchkpap2_2w, kALridkey_2w};
+act11 achkpb1_2w = {COND_R, 0, TARDIS_2w, 0, kALcallp_2w, 0};
+act11 achkpb2_2w = {COND_R, 0, TARDIS_2w, 0, kALphonebox_2w, 0};
+act11 achkpb3_2w = {COND_R, 0, TARDIS_2w, 1, kALdial_2w, 0};
+act11 achkpb4_2w = {COND_R, 0, TARDIS_2w, 2, kALdialed_2w, 0};
+act11 achkphoto_2w = {COND_R, 0, ALBUM_2w, 0, kALphoto1_2w, kALempty_2w};
+act11 achkrobot_2w = {COND_R, 0, ROBOT_2w, 1, kALchkdoc_2w, 0};
+act11 achkrr1_2w = {COND_R, 0, WELL_2w, 1, kALchkrr2_2w, kALclimbup_2w};
+act11 achksnake_2w = {COND_R, 0, SNAKE_2w, 0, kALbite_2w, 0};
+act11 achktrap_2w = {COND_R, 0, GENIE_2w, 1, kALuptrap_2w, kALnotrap_2w};
+act11 achkwell_2w = {COND_R, 0, WELL_2w, 0, kALrr_2w, kALrg_2w};
+act11 achkwill_2w = {COND_R, 0, WILL_2w, 0, kALchksafe_2w, kALgotwill_2w};
+act11 agard1_2w = {COND_R, 0, GARLIC_2w, 0, kALgard1_2w, 0};
+act11 akeyhole_2w = {COND_R, 0, BOOK_2w, 0, kALkeyhole1_2w, kALkeyhole2_2w};
+act11 amatchk2_2w = {COND_R, 0, MATCHES_2w, 0, kALstrike_2w, kALsoggy_2w};
+act11 achkbed1_2w = {COND_R, 0, BOOK_2w, 0, kALbed1_2w, kALfaint_2w};
+act11 achkmaid_2w = {COND_R, 0, MAID_2w, 0, kALmaidx_2w, kALblah_2w};
+act11 achkstate0_2w = {COND_R, 0, BOOK_2w, 0, kALhugone_2w, kALchkstate1_2w};
+act11 achkstate1_2w = {COND_R, 0, BOOK_2w, 1, kALhole_2w, kALpengone_2w};
+
+act12 alookbrg_2w = {TEXT, 0, kSTLookBridge_2w};
+act12 astuck1_2w = {TEXT, 0, kSTDoorStuck_2w};
+act12 atalkg_2w = {TEXT, 0, kSTIgnore_2w};
+act12 aball4_2w = {TEXT, 2, kSTBalloon1_2w};
+act12 aball5_2w = {TEXT, 2, kSTBalloon2_2w};
+act12 aball6_2w = {TEXT, 2, kSTBalloon3_2w};
+act12 abanana1_2w = {TEXT, 0, kSTBanana1_2w};
+act12 abanana3_2w = {TEXT, 0, kSTBanana2_2w};
+act12 abell_2w = {TEXT, 0, kSTBell1_2w};
+act12 abell1_2w = {TEXT, 8, kSTMaid7_2w};
+act12 abite2_2w = {TEXT, 0, kSTSnake5_2w};
+act12 ablah_2w = {TEXT, 8, kSTBlah_2w};
+act12 aboom_2w = {TEXT, 0, kSTDyn4_2w};
+act12 acallp2_2w = {TEXT, 0, kSTCall1_2w};
+act12 acallp3_2w = {TEXT, 0, kSTCall2_2w};
+act12 acallp4_2w = {TEXT, 0, kSTCall3_2w};
+act12 acallp5_2w = {TEXT, 0, kSTCall4_2w};
+act12 acallp6_2w = {TEXT, 0, kSTCall5_2w};
+act12 acallp7_2w = {TEXT, 0, kSTCall6_2w};
+act12 acantpush_2w = {TEXT, 0, kSTPush1_2w};
+act12 acat1_2w = {TEXT, 0, kSTCat3_2w};
+act12 acat4_2w = {TEXT, 0, kSTMaid8_2w};
+act12 achasm1_2w = {TEXT, 12, kSTChasm1_2w};
+act12 acheat1_2w = {TEXT, 0, kSTScheat1_2w};
+act12 acheat2_2w = {TEXT, 0, kSTScheat2_2w};
+act12 aclimax1_2w = {TEXT, 0, kSTSclimax1_2w};
+act12 aclimax2_2w = {TEXT, 8, kSTSclimax2_2w};
+act12 aclimax3_2w = {TEXT, 80, kSTSclimax3_2w};
+act12 aclimax4_2w = {TEXT, 80, kSTSclimax4_2w};
+act12 aclimax5_2w = {TEXT, 80, kSTSclimax5_2w};
+act12 aclimax6_2w = {TEXT, 80, kSTSclimax6_2w};
+act12 aclue09a_2w = {TEXT, 0, kSTSclue09a_2w};
+act12 aclue09b_2w = {TEXT, 0, kSTSclue09b_2w};
+act12 aclue09c_2w = {TEXT, 0, kSTSclue09c_2w};
+act12 acomb1_2w = {TEXT, 0, kSTScomb1_2w};
+act12 acomb2_2w = {TEXT, 0, kSTScomb2_2w};
+act12 acook1_2w = {TEXT, 8, kSTCook1_2w};
+act12 acook2_2w = {TEXT, 8, kSTCook2_2w};
+act12 acook3_2w = {TEXT, 8, kSTCook3_2w};
+act12 acook4_2w = {TEXT, 24, kSTCook4_2w};
+act12 acook5_2w = {TEXT, 24, kSTCook5_2w};
+act12 adialed_2w = {TEXT, 0, kSTSdialed_2w};
+act12 adidnt1_2w = {TEXT, 0, kSTSdidnt1_2w};
+act12 adidnt2_2w = {TEXT, 0, kSTSdidnt2_2w};
+act12 adog1_2w = {TEXT, 0, kSTDyn2_2w};
+act12 adone1_2w = {TEXT, 10, kSTSdone1_2w};
+act12 adone13_2w = {TEXT, 50, kSTSdone5_2w};
+act12 adone14_2w = {TEXT, 50, kSTSdone6_2w};
+act12 adone15_2w = {TEXT, 50, kSTSdone7_2w};
+act12 adone2_2w = {TEXT, 10, kSTSdone2_2w};
+act12 adone3_2w = {TEXT, 10, kSTSdone3_2w};
+act12 adone4_2w = {TEXT, 10, kSTSdone4_2w};
+act12 adraught_2w = {TEXT, 5 * 60 * NORMAL_TPS, kSTDraught_2w};
+act12 adropdyn2_2w = {TEXT, 0, kSTDyn3_2w};
+act12 adumb12_2w = {TEXT, 0, kSTDumb2_2w};
+act12 adumb2_2w = {TEXT, 0, kSTDumb1_2w};
+act12 adyn1_2w = {TEXT, 0, kSTDyn1_2w};
+act12 aeatban_2w = {TEXT, 0, kSTSeatbanana_2w};
+act12 aeatgarl1_2w = {TEXT, 0, kSTSgarl1_2w};
+act12 aeatgarl2_2w = {TEXT, 0, kSTSgarl2_2w};
+act12 aexplainb_2w = {TEXT, 0, kSTSexplainb_2w};
+act12 aext1_2w = {TEXT, 0, kSTSrobot1_2w};
+act12 aext2_2w = {TEXT, 0, kSTSrobot2_2w};
+act12 aext3_2w = {TEXT, 0, kSTSrobot3_2w};
+act12 agard10_2w = {TEXT, 300, kSTSgard6_2w};
+act12 agard5_2w = {TEXT, 20, kSTSgard1_2w};
+act12 agard6_2w = {TEXT, 30, kSTSgard2_2w};
+act12 agard7_2w = {TEXT, 40, kSTSgard3_2w};
+act12 agard8_2w = {TEXT, 90, kSTSgard4_2w};
+act12 agard9_2w = {TEXT, 100, kSTSgard5_2w};
+act12 agenie1_2w = {TEXT, 0, kSTRub2_2w};
+act12 agiveb3_2w = {TEXT, 0, kSTCat2_2w};
+act12 aglook1_2w = {TEXT, 0, kSTGardInShed_2w};
+act12 aglook2_2w = {TEXT, 0, kSTGardShed_2w};
+act12 agotwill_2w = {TEXT, 0, kSTGotWill_2w};
+act12 ahdrink11_2w = {TEXT, 82, kSTHest4_2w};
+act12 ahdrink12_2w = {TEXT, 84, kSTSay1_2w};
+act12 ahdrink13_2w = {TEXT, 84, kSTSay2_2w};
+act12 ahdrink2_2w = {TEXT, 0, kSTHest1_2w};
+act12 ahdrink8_2w = {TEXT, 72, kSTHest2_2w};
+act12 ahdrink9_2w = {TEXT, 72, kSTHest3_2w};
+act12 ahest12_2w = {TEXT, 8, kSTHest6_2w};
+act12 ahest13_2w = {TEXT, 12, kSTHest7_2w};
+act12 ahest14_2w = {TEXT, 16, kSTHest8_2w};
+act12 ahest15_2w = {TEXT, 50, kSTHest9_2w};
+act12 ahestd2_2w = {TEXT, 0, kSTHest5_2w};
+act12 ahnod1_2w = {TEXT, 0, kSTNod1_2w};
+act12 ahnod2_2w = {TEXT, 0, kSTSay1_2w};
+act12 ahnod3_2w = {TEXT, 0, kSTSay2_2w};
+act12 akaboom1_2w = {TEXT, 0, kSTDyn5_2w};
+act12 amat5_2w = {TEXT, 0, kSTMatch4_2w};
+act12 amissed2_2w = {TEXT, 0, kSTFire1_2w};
+act12 amissed3_2w = {TEXT, 0, kSTFire2_2w};
+act12 amurd4_2w = {TEXT, 10, kSTArgue1_2w};
+act12 anobang_2w = {TEXT, 0, kSTDyn7_2w};
+act12 anobang2_2w = {TEXT, 0, kSTDyn6_2w};
+act12 anobell_2w = {TEXT, 8, kSTBell2_2w};
+act12 anogenie_2w = {TEXT, 0, kSTRub1_2w};
+act12 anoreply_2w = {TEXT, 0, kSTBrrr_2w};
+act12 anotrap_2w = {TEXT, 0, kSTTrap1_2w};
+act12 aom1_2w = {TEXT, 8, kSTSom1_2w};
+act12 aom10_2w = {TEXT, 50, kSTSom4_2w};
+act12 aom11_2w = {TEXT, 50, kSTSom5_2w};
+act12 aom12_2w = {TEXT, 50, kSTSom6_2w};
+act12 aom13_2w = {TEXT, 54, kSTSom7_2w};
+act12 aom14_2w = {TEXT, 54, kSTSom8_2w};
+act12 aom5_2w = {TEXT, 16, kSTSom2_2w};
+act12 aom6_2w = {TEXT, 20, kSTSom3_2w};
+act12 aom9_2w = {TEXT, 40, kSTSom3a_2w};
+act12 apen1_2w = {TEXT, 0, kSTSpen1_2w};
+act12 apen2_2w = {TEXT, 0, kSTSpen2_2w};
+act12 apen3_2w = {TEXT, 0, kSTSpen3_2w};
+act12 aphoto4_2w = {TEXT, 0, kSTSphoto_2w};
+act12 aphoto6_2w = {TEXT, 0, kSTSphoto1_2w};
+act12 apois1_2w = {TEXT, 0, kSTSnake1_2w};
+act12 apois2_2w = {TEXT, 0, kSTSnake2_2w};
+act12 apois3_2w = {TEXT, 0, kSTSnake3_2w};
+act12 apois4_2w = {TEXT, 0, kSTSnake4_2w};
+act12 aridkey2_2w = {TEXT, 0, kSTSridkey_2w};
+act12 arobot1_2w = {TEXT, 0, kSTFire3_2w};
+act12 arok_2w = {TEXT, 0, kSTWell1_2w};
+act12 arumbling_2w = {TEXT, 0, kSTRumble_2w};
+act12 arup_2w = {TEXT, 0, kSTDyn8_2w};
+act12 asafe1_2w = {TEXT, 0, kSTSsafe1_2w};
+act12 ascr31_2w = {TEXT, 0, kSTLock1_2w};
+act12 aserum1_2w = {TEXT, 0, kSTSserum1_2w};
+act12 aserum2_2w = {TEXT, 0, kSTSserum2_2w};
+act12 asilly_2w = {TEXT, 0, kSTDyn9_2w};
+act12 asniff_2w = {TEXT, 0, kSTCat1_2w};
+act12 asoggy_2w = {TEXT, 0, kSTMatch1_2w};
+act12 asonic1_2w = {TEXT, 0, kSTSsonic1_2w};
+act12 asonic2_2w = {TEXT, 0, kSTSsonic2_2w};
+act12 asonic3_2w = {TEXT, 0, kSTSsonic3_2w};
+act12 asonic4_2w = {TEXT, 0, kSTSsonic4_2w};
+act12 astick1_2w = {TEXT, 0, kSTWeee_2w};
+act12 astrike_2w = {TEXT, 0, kSTMatch2_2w};
+act12 astung_2w = {TEXT, 0, kSTStung_2w};
+act12 awarn_2w = {TEXT, 8, kSTSwarn_2w};
+act12 awarnz_2w = {TEXT, 8, kSTSwarnz_2w};
+act12 awho1_2w = {TEXT, 0, kSTTard1_2w};
+act12 awho2_2w = {TEXT, 0, kSTTard2_2w};
+act12 awill1_2w = {TEXT, 0, kSTSwill1_2w};
+act12 awill2_2w = {TEXT, 0, kSTSwill2_2w};
+act12 awill3_2w = {TEXT, 0, kSTSwill3_2w};
+act12 awill4_2w = {TEXT, 0, kSTSwill4_2w};
+act12 abell2_2w = {TEXT, 16, kSTMaid6_2w};
+act12 abug5a_2w = {TEXT, 0, kSTStingeroo_2w};
+act12 abug5b_2w = {TEXT, 0, kSTSbug5b_2w};
+act12 aclick_2w = {TEXT, 0, kSTClick_2w};
+act12 aempty_2w = {TEXT, 0, kSTEmpty_2w};
+act12 afaint1_2w = {TEXT, 5, kSTSfaint1_2w};
+act12 afaint10_2w = {TEXT, 35, kSTSfaint4_2w};
+act12 afaint5_2w = {TEXT, 20, kSTSfaint2_2w};
+act12 afaint9_2w = {TEXT, 35, kSTSfaint3_2w};
+act12 agone10_2w = {TEXT, 115, kSTSgone6_2w};
+act12 agone11_2w = {TEXT, 115, kSTSgone7_2w};
+act12 agone5_2w = {TEXT, 0, kSTSgone1_2w};
+act12 agone6_2w = {TEXT, 34, kSTSgone2_2w};
+act12 agone7_2w = {TEXT, 70, kSTSgone3_2w};
+act12 agone8_2w = {TEXT, 90, kSTSgone4_2w};
+act12 agone9_2w = {TEXT, 115, kSTSgone5_2w};
+act12 aharry3_2w = {TEXT, 4, kSTOrgan1_2w};
+act12 aharry4_2w = {TEXT, 4, kSTOrgan2_2w};
+act12 aharry5_2w = {TEXT, 4, kSTOrgan3_2w};
+act12 aharry7_2w = {TEXT, 8, kSTOrgan4_2w};
+act12 ahole_2w = {TEXT, 0, kSTFirst2_2w};
+act12 akeyhole1_2w = {TEXT, 0, kSTHole1_2w};
+act12 alie1_2w = {TEXT, 13, kSTTired_2w};
+act12 alie2_2w = {TEXT, 18, kSTTired2_2w};
+act12 amaid10_2w = {TEXT, 90 * NORMAL_TPS, kSTSmaid1_8_2w};
+act12 amaid11_2w = {TEXT, 99 * NORMAL_TPS, kSTSmaid1_9_2w};
+act12 amaid12_2w = {TEXT, 0, kSTSmaid1_10_2w};
+act12 amaid3_2w = {TEXT, 4, kSTSmaid1_1_2w};
+act12 amaid4_2w = {TEXT, 17, kSTSmaid1_2_2w};
+act12 amaid5_2w = {TEXT, 17, kSTSmaid1_3_2w};
+act12 amaid6_2w = {TEXT, 17, kSTSmaid1_4_2w};
+act12 amaid7_2w = {TEXT, 30, kSTSmaid1_5_2w};
+act12 amaid8_2w = {TEXT, 30 * NORMAL_TPS, kSTSmaid1_6_2w};
+act12 amaid9_2w = {TEXT, 60 * NORMAL_TPS, kSTSmaid1_7_2w};
+act12 amaidp3_2w = {TEXT, 8, kSTMaid1_2w};
+act12 amaidp4_2w = {TEXT, 8, kSTMaid2_2w};
+act12 amaidp5_2w = {TEXT, 8, kSTMaid3_2w};
+act12 amaidp7_2w = {TEXT, 12, kSTMaid4_2w};
+act12 amaidp8_2w = {TEXT, 12, kSTMaid5_2w};
+act12 anocarry_2w = {TEXT, 0, kSTNocarry_2w};
+act12 anopurps_2w = {TEXT, 0, kSTNopurps_2w};
+act12 aok_2w = {TEXT, 0, kSTOkgen_2w};
+act12 ascr21_2w = {TEXT, 0, kSTSfirst_2w};
+act12 astory_2w = {TEXT, STORYDELAY, kSTStory_2w};
+
+act13 ascr33b_2w = {SWAP_IMAGES, 4, HERO, PENNY_2w};
+act13 aswaphero_2w = {SWAP_IMAGES, 120, HERO, PENNY_2w};
+act13 askip1_2w = {SWAP_IMAGES, 0, HERO, PENNY_2w};
+
+act14 achkbell1_2w = {COND_SCR, 0, HERO, 31, kALbell1_2w, kALchkbell2_2w};
+act14 achkbell2_2w = {COND_SCR, 0, HERO, 32, kALbell2_2w, kALnobell_2w};
+act14 achkcat2_2w = {COND_SCR, 0, HERO, 32, kALbell2_2w, kALcat5_2w};
+act14 achkcat3_2w = {COND_SCR, 0, HERO, 31, kALcat6_2w, 0};
+act14 achkgun_2w = {COND_SCR, 0, HERO, 37, kALshot_2w, kALmissed_2w};
+act14 achklamp_2w = {COND_SCR, 0, HERO, 27, kALgenie_2w, kALnogenie_2w};
+act14 achkld2_2w = {COND_SCR, 0, HERO, 21, kALchkld3_2w, kALnobang_2w};
+act14 achkrr_2w = {COND_SCR, 0, HERO, 21, kALkaboom_2w, kALboom_2w};
+act14 adropdyn1_2w = {COND_SCR, 0, HERO, 21, kALdropdyn1_2w, 0};
+act14 adumbchk_2w = {COND_SCR, 0, HERO, 3, kALscr0306_2w, kALscr0603_2w};
+act14 agarchk_2w = {COND_SCR, 0, HERO, 9, kALridgard_2w, kALridgarl_2w};
+act14 agiveb1_2w = {COND_SCR, 0, HERO, 32, kALgiveb2_2w, kALnopurps_2w};
+act14 aglchk_2w = {COND_SCR, 0, GARDENER_2w, INSHED_2w, kALglook1_2w, kALglchk2_2w};
+act14 aglchk2_2w = {COND_SCR, 0, GARDENER_2w, SHED_2w, kALglook2_2w, 0};
+
+act15 aom7_2w = {AUTOPILOT, 20, HERO, OLDMAN_2w, DX, DY};
+act15 abugf1a_2w = {AUTOPILOT, 4, BUG1_2w, ZAPPER_2w, DX, DY};
+act15 abugf2a_2w = {AUTOPILOT, 6, BUG2_2w, ZAPPER_2w, DX, DY};
+act15 abugf3a_2w = {AUTOPILOT, 13, BUG3_2w, ZAPPER_2w, DX, DY};
+act15 abugf4a_2w = {AUTOPILOT, 5, BUG4_2w, ZAPPER_2w, DX, DY};
+act15 abugf5a_2w = {AUTOPILOT, 11, BUG5_2w, ZAPPER_2w, DX, DY};
+
+act16 aback4_2w = {INIT_OBJ_SEQ, 2, CAT_2w, 0};
+act16 abd11_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 abd2_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 abd21_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 aclosedoor1_2w = {INIT_OBJ_SEQ, DOORDELAY, DOOR1_2w, 0};
+act16 adone10_2w = {INIT_OBJ_SEQ, 10, HERO, _UP};
+act16 adone6_2w = {INIT_OBJ_SEQ, 0, HORACE_2w, LEFT};
+act16 adone9_2w = {INIT_OBJ_SEQ, 10, HORACE_2w, _UP};
+act16 adumb13_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 adumb3_2w = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 afuze1_2w = {INIT_OBJ_SEQ, 0, DYNAMITE_2w, 1};
+act16 agiveb5_2w = {INIT_OBJ_SEQ, 2, CAT_2w, 1};
+act16 ahall1_3_2w = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 ahall2_2a_2w = {INIT_OBJ_SEQ, 0, HERO, LEFT};
+act16 ahall3_1a_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 ahdrink4_2w = {INIT_OBJ_SEQ, 3, HESTER_2w, _UP};
+act16 ahdrink5_2w = {INIT_OBJ_SEQ, 70, HESTER_2w, DOWN};
+act16 ahest3_2w = {INIT_OBJ_SEQ, 0, HESTER_2w, RIGHT};
+act16 ahest5_2w = {INIT_OBJ_SEQ, 22, HESTER_2w, _UP};
+act16 ahest7_2w = {INIT_OBJ_SEQ, 24, HESTER_2w, LEFT};
+act16 ahest9_2w = {INIT_OBJ_SEQ, 45, HESTER_2w, DOWN};
+act16 ainshed2_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 akit2_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 amaidb1_2w = {INIT_OBJ_SEQ, 0, MAID_2w, RIGHT};
+act16 amaidbk2_2w = {INIT_OBJ_SEQ, 0, MAID_2w, LEFT};
+act16 amaidbk6_2w = {INIT_OBJ_SEQ, 10, MAID_2w, DOWN};
+act16 amurd1_2w = {INIT_OBJ_SEQ, 26, MURDER_2w, 1};
+act16 aom16_2w = {INIT_OBJ_SEQ, 60, OLDMAN_2w, 1};
+act16 apanel7_2w = {INIT_OBJ_SEQ, 5, HERO, DOWN};
+act16 apen5_2w = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 aridgard4_2w = {INIT_OBJ_SEQ, 4, GARDENER_2w, LEFT};
+act16 arobot2_2w = {INIT_OBJ_SEQ, 0, ROBOT_2w, 2};
+act16 ashed12_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 ashed2_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 ashed22_2w = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 astick4_2w = {INIT_OBJ_SEQ, 0, DOG_2w, 1};
+act16 avenus2_2w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 aclosedoor2_2w = {INIT_OBJ_SEQ, DOORDELAY, DOOR2_2w, 0};
+act16 aclosedoor3_2w = {INIT_OBJ_SEQ, DOORDELAY, DOOR3_2w, 0};
+act16 agone12_2w = {INIT_OBJ_SEQ, 125, HERO, DOWN};
+act16 agone13_2w = {INIT_OBJ_SEQ, 127, HERO, LEFT};
+act16 aharry2_2w = {INIT_OBJ_SEQ, 0, HARRY_2w, 1};
+act16 aheroseq1_2w = {INIT_OBJ_SEQ, 1, HERO, LEFT};
+act16 amaid1_2w = {INIT_OBJ_SEQ, 1, MAID_2w, DOWN};
+act16 amaidc13_2w = {INIT_OBJ_SEQ, 30, MAID_2w, DOWN};
+act16 amaidc4_2w = {INIT_OBJ_SEQ, 8, MAID_2w, RIGHT};
+act16 amaidc7_2w = {INIT_OBJ_SEQ, 16, MAID_2w, LEFT};
+act16 amaidp6_2w = {INIT_OBJ_SEQ, 10, MAID_2w, DOWN};
+act16 apenbseq1_2w = {INIT_OBJ_SEQ, 0, PENNY_2w, RIGHT};
+act16 apenbseq2_2w = {INIT_OBJ_SEQ, 25, PENNY_2w, _UP};
+act16 apenseq1_2w = {INIT_OBJ_SEQ, 0, PENNY_2w, RIGHT};
+act16 apenseq2_2w = {INIT_OBJ_SEQ, PENDELAY + 7, PENNY_2w, DOWN};
+act16 apenseq3_2w = {INIT_OBJ_SEQ, PENDELAY + 10, PENNY_2w, LEFT};
+act16 apenseq4_2w = {INIT_OBJ_SEQ, PENDELAY + 17, PENNY_2w, _UP};
+act16 apenseq5_2w = {INIT_OBJ_SEQ, PENDELAY + 42, PENNY_2w, RIGHT};
+act16 apenseq6_2w = {INIT_OBJ_SEQ, PENDELAY + 74, PENNY_2w, 2};
+
+act17 acopbit1_2w = {SET_STATE_BITS, 0, COP_2w, 1};
+act17 acopbit16_2w = {SET_STATE_BITS, 0, COP_2w, 16};
+act17 acopbit4_2w = {SET_STATE_BITS, 0, COP_2w, 4};
+act17 agatesopn_2w = {SET_STATE_BITS, 0, BUTTON_2w, 32};
+act17 aglighton2_2w = {SET_STATE_BITS, 0, BUTTON_2w, 2};
+act17 aphoto3_2w = {SET_STATE_BITS, 0, COP_2w, 2};
+act17 ashed23_2w = {SET_STATE_BITS, 0, BUTTON_2w, 16};
+act17 aslighton2_2w = {SET_STATE_BITS, 0, BUTTON_2w, 1};
+act17 astream12_2w = {SET_STATE_BITS, 0, BUTTON_2w, 4};
+act17 azapperon2_2w = {SET_STATE_BITS, 0, BUTTON_2w, 8};
+act17 acopbit8_2w = {SET_STATE_BITS, 0, COP_2w, 8};
+
+//all the act18 were defined as act17 with a type set to CLEAR_STATE_BITS
+act18 agatescls_2w = {CLEAR_STATE_BITS, 0, BUTTON_2w, 32};
+act18 aglightoff2_2w = {CLEAR_STATE_BITS, 0, BUTTON_2w, 2};
+act18 aslightoff2_2w = {CLEAR_STATE_BITS, 0, BUTTON_2w, 1};
+act18 azapperoff2_2w = {CLEAR_STATE_BITS, 0, BUTTON_2w, 8};
+
+act19 achkbugs_2w = {TEST_STATE_BITS, 0, BUTTON_2w, 8, kALbugflit_2w, kALbugattack_2w};
+act19 achkgates_2w = {TEST_STATE_BITS, 2, BUTTON_2w, 16, kALswgates_2w, kALrumbling_2w};
+act19 achkglight_2w = {TEST_STATE_BITS, 2, BUTTON_2w, 2, kALglightoff_2w, kALglighton_2w};
+act19 achkgo_2w = {TEST_STATE_BITS, 0, BUTTON_2w, 32, kALgoopen_2w, kALgoclosed_2w};
+act19 achkslight_2w = {TEST_STATE_BITS, 2, BUTTON_2w, 1, kALslightoff_2w, kALslighton_2w};
+act19 achksong_2w = {TEST_STATE_BITS, 0, COP_2w, 8, 0, kALsong4_2w};
+act19 achkzapper_2w = {TEST_STATE_BITS, 2, BUTTON_2w, 4, kALswzapper_2w, kALclick_2w};
+act19 aswgates_2w = {TEST_STATE_BITS, 2, BUTTON_2w, 32, kALgatescls_2w, kALgatesopn_2w};
+act19 aswzapper_2w = {TEST_STATE_BITS, 2, BUTTON_2w, 8, kALzapperoff_2w, kALzapperon_2w};
+
+act20 acure_2w = {DEL_EVENTS, 0, AGSCHEDULE};
+act20 aridpath_2w = {DEL_EVENTS, 5, INIT_PATH};
+act20 aridsched_2w = {DEL_EVENTS, 0, ASCHEDULE};
+act20 aridtests_2w = {DEL_EVENTS, 0, TEST_STATE_BITS};
+act20 aridtext_2w = {DEL_EVENTS, 5, TEXT};
+
+act21 afall5_2w = {GAMEOVER, 12};
+act21 adead5_2w = {GAMEOVER, 0};
+
+act23 adone16_2w = {EXIT, 54};
+
+act24 abonus10_2w = {BONUS, 0, 10};
+act24 abonus11_2w = {BONUS, 57, 11};
+act24 abonus12_2w = {BONUS, 0, 12};
+act24 abonus13_2w = {BONUS, 0, 13};
+act24 abonus14_2w = {BONUS, 0, 14};
+act24 abonus15_2w = {BONUS, 0, 15};
+act24 abonus16_2w = {BONUS, 0, 16};
+act24 abonus17_2w = {BONUS, 0, 17};
+act24 abonus18_2w = {BONUS, 0, 18};
+act24 abonus19_2w = {BONUS, 0, 19};
+act24 abonus2_2w = {BONUS, 0, 2};
+act24 abonus20_2w = {BONUS, 0, 20};
+act24 abonus21_2w = {BONUS, 0, 21};
+act24 abonus22_2w = {BONUS, 0, 22};
+act24 abonus24_2w = {BONUS, 0, 24};
+act24 abonus25_2w = {BONUS, 0, 25};
+act24 abonus26_2w = {BONUS, 0, 26};
+act24 abonus27_2w = {BONUS, 0, 27};
+act24 abonus30_2w = {BONUS, 0, 30};
+act24 abonus6_2w = {BONUS, 0, 6};
+act24 abonus7_2w = {BONUS, 0, 7};
+act24 abonus8_2w = {BONUS, 0, 8};
+act24 abonus9_2w = {BONUS, 0, 9};
+act24 abonus1_2w = {BONUS, 0, 1};
+act24 abonus23_2w = {BONUS, 8, 23};
+act24 abonus3_2w = {BONUS, 0, 3};
+
+act25 achkdrop_2w = {COND_BOX, 0, HERO, 196, 78, 283, 115, 0, kALdropdyn2_2w};
+act25 achkld3_2w = {COND_BOX, 0, DYNAMITE_2w, 196, 78, 283, 125, kALchkld4_2w, kALnobang2_2w};
+act25 achkph2_2w = {COND_BOX, 0, MAID_2w, 192, 134, 251, 149, kALphoto2_2w, kALphoto3_2w};
+
+act26 abark_2w = {SOUND, 4, BARK_2w};
+act26 afallsnd_2w = {SOUND, 0, CHASM_SCREAM_2w};
+act26 agatesnd_2w = {SOUND, 0, GATES_RUMBLE_2w};
+act26 agunshot_2w = {SOUND, 0, GUNSHOT_2w};
+act26 ahiss_2w = {SOUND, 0, HISS_2w};
+act26 amurdsnd_2w = {SOUND, 20, HORACE_SCREAM_2w};
+act26 asong_l_2w = {SOUND, 0, T_TRACK6};
+act26 asplash_2w = {SOUND, 0, DROP_MATCHES_2w};
+act26 aurgh_2w = {SOUND, 0, URGH_2w};
+act26 ading_2w = {SOUND, 0, DING_2w};
+act26 afinale_2w = {SOUND, 0, T_TRACK1};
+act26 ameow_2w = {SOUND, 0, MEOW_2w};
+act26 asong2a_2w = {SOUND, 0, GENIE_APPEAR_2w};
+act26 asong2dn_2w = {SOUND, 30, PANEL_DN_2w};
+act26 asong2up_2w = {SOUND, 10, PANEL_UP_2w};
+act26 asong5_2w = {SOUND, 0, BOOM_2w};
+act26 asong6_2w = {SOUND, 0, BALLOON_POP_2w};
+act26 abugsnd_2w = {SOUND, 0, STING_2w};
+act26 aclicksnd_2w = {SOUND, 0, CLICK_2w};
+act26 adoorsnd_2w = {SOUND, 0, DOOR_CREAK_2w};
+act26 ascream_2w = {SOUND, 0, SCREAM_2w};
+act26 asong2_2w = {SOUND, 0, GET_BOOK_2w};
+act26 asong4_2w = {SOUND, 0, T_HARRY_ORGAN_2w};
+act26 asong_r_2w = {SOUND, 0, PLANET_2w};
+
+act27 aphoto2_2w = {ADD_SCORE, 0, ALBUM_2w};
+act27 asafe5_2w = {ADD_SCORE, 0, WILL_2w};
+act27 asonic6_2w = {ADD_SCORE, 0, SCREW_2w};
+
+act28 abel4_2w = {SUB_SCORE, 0, BELL_2w};
+act28 amat6_2w = {SUB_SCORE, 0, MATCHES_2w};
+act28 asubban_2w = {SUB_SCORE, 0, BANANA_2w};
+act28 subgarlic_2w = {SUB_SCORE, 0, GARLIC_2w};
+
+act29 achkbel_2w = {COND_CARRY, 0, BELL_2w, kALcat2_2w, kALnocarry_2w};
+act29 achkcarry_2w = {COND_CARRY, 0, BELL_2w, kALcat3_2w, kALcat4_2w};
+act29 achkld4_2w = {COND_CARRY, 0, DYNAMITE_2w, kALnobang2_2w, kALbang1_2w};
+act29 achkmag_2w = {COND_CARRY, 0, MAGNIFY_2w, kALwill1_2w, kALwill2_2w};
+act29 achkmat1_2w = {COND_CARRY, 0, MATCHES_2w, kALchkmat2_2w, kALchkroute_2w};
+act29 achkpaper2_2w = {COND_CARRY, 0, PAPER_2w, kALridkey_2w, kALpencil_2w};
+act29 achkrr3_2w = {COND_CARRY, 0, DYNAMITE_2w, kALsilly_2w, kALclimbup_2w};
+act29 achksafe_2w = {COND_CARRY, 0, SCREW_2w, kALchkscrew_2w, kALsafepr_2w};
+
+act30 ainitmaze_2w = {INIT_MAZE, 0, 8, 50, 37, 260, 154, 140, 175, MAZE_SCREEN};
+
+act31 aexitmaze_2w = {EXIT_MAZE, 0};
+
+act32 apanel6_2w = {INIT_PRIORITY, 20, PANEL_2w, BACKGROUND};
+
+act33 acookp3_2w = {INIT_SCREEN, 0, COOKB_2w, 6};
+act33 afall3_2w = {INIT_SCREEN, 0, PENFALL_2w, 25};
+act33 amaidbk1_2w = {INIT_SCREEN, 0, MAID_2w, 31};
+act33 aparty1a_2w = {INIT_SCREEN, 0, COP_2w, 30};
+act33 aparty2a_2w = {INIT_SCREEN, 0, MAID_2w, 30};
+act33 aparty3a_2w = {INIT_SCREEN, 0, HESTER_2w, 30};
+act33 aparty4a_2w = {INIT_SCREEN, 0, GARDENER_2w, 30};
+act33 aparty5a_2w = {INIT_SCREEN, 0, SNAKE_2w, 30};
+act33 aparty6a_2w = {INIT_SCREEN, 0, GENIE_2w, 30};
+act33 aparty7a_2w = {INIT_SCREEN, 0, HARRY_2w, 30};
+act33 aparty8a_2w = {INIT_SCREEN, 0, DOCTOR_2w, 30};
+act33 aparty9a_2w = {INIT_SCREEN, 0, COOK_2w, 30};
+act33 ashed24_2w = {INIT_SCREEN, 0, GATELIGHT_2w, 11};
+act33 ashed25_2w = {INIT_SCREEN, 0, GATELIGHT_2w, 12};
+act33 astick10_2w = {INIT_SCREEN, 0, STICK_2w, -1};
+act33 amaidc11_2w = {INIT_SCREEN, 30, MAID_2w, 31};
+act33 amaidc2_2w = {INIT_SCREEN, 8, MAID_2w, 32};
+act33 amaidp1_2w = {INIT_SCREEN, 0, MAID_2w, 31};
+
+act34 abang1_2w = {AGSCHEDULE, 6 * NORMAL_TPS, kALbang2_2w};
+act34 abite3_2w = {AGSCHEDULE, 60 * NORMAL_TPS, kALpois1_2w};
+act34 abite4_2w = {AGSCHEDULE, 200 * NORMAL_TPS, kALpois2_2w};
+act34 abite5_2w = {AGSCHEDULE, 290 * NORMAL_TPS, kALpois3_2w};
+act34 abite6_2w = {AGSCHEDULE, 300 * NORMAL_TPS, kALpois4_2w};
+act34 acat3_2w = {AGSCHEDULE, 8 * NORMAL_TPS, kALchkcarry_2w};
+act34 akaboom2_2w = {AGSCHEDULE, 1, kALkaboom3_2w};
+act34 amaidb6_2w = {AGSCHEDULE, 8 * NORMAL_TPS, kALmaidbk_2w};
+
+act35 amap0_2w = {REMAPPAL, 0, _TLIGHTMAGENTA, _TLIGHTMAGENTA};
+act35 amap1_2w = {REMAPPAL, 0, _TLIGHTMAGENTA, _TBLACK};
+
+act36 achkcat1_2w = {COND_NOUN, 0, kNBell_2w, kALcat1_2w, kALnopurps_2w};
+act36 achkpencil_2w = {COND_NOUN, 0, kNKey_2w, kALchkpap1_2w, kALnopurps_2w};
+act36 achkscrew_2w = {COND_NOUN, 0, kNScrew_2w, kALsafe1_2w, kALsafepr_2w};
+
+act37 acookp2_2w = {SCREEN_STATE, 0, 6, 1};
+act37 asonic8_2w = {SCREEN_STATE, 0, RETUPMOC_2w, 1};
+act37 ascreen2_2w = {SCREEN_STATE, 0, 2, 1};
+act37 ascreen35_2w = {SCREEN_STATE, 0, 35, 1};
+
+act38 acooklips_2w = {INIT_LIPS, 10, LIPS_2w, COOKB_2w, LIPDX - 1, LIPDY + 1};
+act38 aomlips_2w = {INIT_LIPS, 41, LIPS_2w, OLDMAN_2w, 24, LIPDY};
+act38 alips_2w = {INIT_LIPS, 0, LIPS_2w, MAID_2w, LIPDX, LIPDY};
+act38 amaidlips_2w = {INIT_LIPS, 5, LIPS_2w, MAID_2w, LIPDX, LIPDY};
+
+act43 abprompt_2w = {YESNO, 0, kSTBananaPrompt_2w, kALeatban_2w, 0};
+act43 agarprompt_2w = {YESNO, 0, kSTGarlicPrompt_2w, kAL_eatgar_2w, 0};
+act43 ahestd3_2w = {YESNO, 0, kSTShest1_2w, kALhdrink_2w, kALnodrink_2w};
+
+act44 astopr_2w = {STOP_ROUTE, 0};
+
+act45 acheatchk_2w = {COND_ROUTE, 0, 3, kALstopr_2w, 0};
+act45 achkhr4_2w = {COND_ROUTE, 0, 0, kALlignpen_2w, 0};
+act45 achkroute_2w = {COND_ROUTE, 0, 0, kALlookbrg_2w, 0};
+act45 achkrx_2w = {COND_ROUTE, 0, 3, 0, kALchkmat1_2w};
+
+actListPtr AL11maze_2w[] = {&ainitmaze_2w, &amazexy_2w, &ascr11maze_2w, 0};
+actListPtr AL_eatgar_2w[] = {&agarchk_2w, 0};
+actListPtr ALballoon_2w[] = {&aball1_2w, &aball2_2w, &aball3_2w, &aball4_2w, &aball5_2w, &aball6_2w, &asong6_2w, 0};
+actListPtr ALbanana_2w[] = {&abonus18_2w, &abanana1_2w, &abanana2_2w, &abanana3_2w, &abanana4_2w, &abanana5_2w, &abanana6_2w, &abanana7_2w, &abanana8_2w, &abanana9_2w, &abanana10_2w, &abanana11_2w, &abanana12_2w, &abanana13_2w, &abanana14_2w, 0};
+actListPtr ALbang1_2w[] = {&abang1_2w, &afuze1_2w, &afuze2_2w, &afuze3_2w, 0};
+actListPtr ALbang2_2w[] = {&achkrr_2w, 0};
+actListPtr ALbed1_2w[] = {&apenscr_2w, &apenbxy1_2w, &apenbseq1_2w, &apenbstart_2w, &apenbvxy1_2w, &apenbvxy2_2w, &apenbseq2_2w, &apenbstop_2w, &apenbxy2_2w, &apenblie1_2w, &apenblie2_2w, &alie1_2w, &alie2_2w, 0};
+actListPtr ALbell1_2w[] = {&ading_2w, &abell_2w, &abell1_2w, 0};
+actListPtr ALbell2_2w[] = {&ading_2w, &abell_2w, &adisable_2w, &amaidc1_2w, &amaidc2_2w, &amaidc3_2w, &amaidc4_2w, &amaidc5_2w, &amaidc6_2w, &abell2_2w, &amaidc7_2w, &amaidc8_2w, &amaidc9_2w, &amaidc10_2w, &amaidc11_2w, &amaidc12_2w, &amaidc13_2w, &amaidc14_2w, &amaidc15_2w, 0};
+actListPtr ALbell_2w[] = {&achkbell1_2w, 0};
+actListPtr ALbite_2w[] = {&ahiss_2w, &abite1_2w, &abite2_2w, &achknasty_2w, 0};
+actListPtr ALblah_2w[] = {&ablah_2w, &arepblah_2w, 0};
+actListPtr ALboom_2w[] = {&asong5_2w, &aboom_2w, &abonus17_2w, 0};
+actListPtr ALbottle_2w[] = {&abonus10_2w, &achkbite_2w, 0};
+actListPtr ALbridge_2w[] = {&achkrx_2w, 0};
+actListPtr ALbugattack_2w[] = {&abuga1a_2w, &abuga1b_2w, &abuga1c_2w, &abuga2a_2w, &abuga2b_2w, &abuga2c_2w, &abuga3a_2w, &abuga3b_2w, &abuga3c_2w, &abuga4a_2w, &abuga4b_2w, &abuga4c_2w, &abuga5a_2w, &abuga5b_2w, &abuga5c_2w, &arepbuga_2w, 0};
+actListPtr ALbugflit_2w[] = {&abugf1a_2w, &abugf1b_2w, &abugf1c_2w, &abugf2a_2w, &abugf2b_2w, &abugf2c_2w, &abugf3a_2w, &abugf3b_2w, &abugf3c_2w, &abugf4a_2w, &abugf4b_2w, &abugf4c_2w, &abugf5a_2w, &abugf5b_2w, &abugf5c_2w, &arepbugf_2w, 0};
+actListPtr ALbugrep1_2w[] = {&abuga1a_2w, &abuga1b_2w, &abuga2a_2w, &abuga2b_2w, &abuga3a_2w, &abuga3b_2w, &abuga4a_2w, &abuga4b_2w, &abuga5a_2w, &abuga5b_2w, &arepbuga_2w, 0};
+actListPtr ALbugrep2_2w[] = {&abugf1a_2w, &abugf1b_2w, &abugf2a_2w, &abugf2b_2w, &abugf3a_2w, &abugf3b_2w, &abugf4a_2w, &abugf4b_2w, &abugf5a_2w, &abugf5b_2w, &arepbugf_2w, 0};
+actListPtr ALbugs_2w[] = {&adead1_2w, &adead2_2w, &adead3_2w, &abugsnd_2w, &abug5a_2w, &abug5b_2w, &adead4_2w, &adead5_2w, 0};
+actListPtr ALbugzapper_2w[] = {&abutchk_2w, &achkzapper_2w, 0};
+actListPtr ALcallp_2w[] = {&acallp1_2w, &acallp2_2w, &acallp3_2w, &acallp4_2w, &acallp5_2w, &acallp6_2w, &acallp7_2w, &abonus13_2w, 0};
+actListPtr ALcantpush_2w[] = {&acantpush_2w, &aridtests_2w, 0};
+actListPtr ALcat1_2w[] = {&achkbel_2w, 0};
+actListPtr ALcat2_2w[] = {&acat1_2w, &acat2_2w, 0};
+actListPtr ALcat3_2w[] = {&aback1_2w, &aback2_2w, &aback3_2w, &aback4_2w, 0};
+actListPtr ALcat4_2w[] = {&aback1_2w, &aback2_2w, &aback3_2w, &aback4_2w, &achkcat2_2w, 0};
+actListPtr ALcat5_2w[] = {&achkcat3_2w, 0};
+actListPtr ALcat6_2w[] = {&aridsched_2w, &ading_2w, &abell_2w, &acat4_2w, &amaidb1_2w, &amaidb2_2w, &amaidb3_2w, &amaidb4_2w, &amaidb5_2w, &amaidb6_2w, 0};
+actListPtr ALcatnip_2w[] = {&achkcat1_2w, 0};
+actListPtr ALchasm_2w[] = {&afallsnd_2w, &achasm1_2w, &astopr_2w, &adead1_2w, &afall1_2w, &afall2_2w, &afall3_2w, &afall4_2w, &adead4_2w, &afall5_2w, 0};
+actListPtr ALcheat_2w[] = {&acheat1_2w, &acheat2_2w, &abonus25_2w, &ascr33a_2w, &ascr33b_2w, &ascr33c_2w, &ascr33d_2w, 0};
+actListPtr ALchkbell2_2w[] = {&achkbell2_2w, 0};
+actListPtr ALchkc09_2w[] = {&achkc09_2w, 0};
+actListPtr ALchkcarry_2w[] = {&achkcarry_2w, 0}; // If hero picked up bell_2w, tough!
+actListPtr ALchkdoc_2w[] = {&achkdoc_2w, 0};
+actListPtr ALchkld3_2w[] = {&achkld3_2w, 0};
+actListPtr ALchkld4_2w[] = {&achkld4_2w, 0};
+actListPtr ALchkmat1_2w[] = {&achkmat1_2w, 0};
+actListPtr ALchkmat2_2w[] = {&achkmat2_2w, &astopr_2w, 0};
+actListPtr ALchkpap1_2w[] = {&achkpaper1_2w, &apushkey_2w, 0};
+actListPtr ALchkpap2_2w[] = {&achkpaper2_2w, 0};
+actListPtr ALchkroute_2w[] = {&achkroute_2w, 0};
+actListPtr ALchkrr2_2w[] = {&achkrr3_2w, 0};
+actListPtr ALchksafe_2w[] = {&achksafe_2w, 0};
+actListPtr ALchkscrew_2w[] = {&achkscrew_2w, 0};
+actListPtr ALchkstate1_2w[] = {&achkstate1_2w, 0};
+actListPtr ALclick_2w[] = {&aclicksnd_2w, &aclick_2w, 0};
+actListPtr ALclimax_2w[] = {&aclimax1_2w, &aclimax2_2w, &aclimax3_2w, &aclimax4_2w, &aclimax5_2w, &aclimax6_2w, &aclimax7_2w, 0};
+actListPtr ALclimbrope_2w[] = {&achkrr1_2w, 0};
+actListPtr ALclimbup_2w[] = {&arxy21_2w, &arup_2w, &arr21_2w, 0};
+actListPtr ALclimbwell_2w[] = {&abonus16_2w, &achkwell_2w, 0};
+actListPtr ALclue09_2w[] = {&aclue09a_2w, &aclue09b_2w, &aclue09c_2w, 0};
+actListPtr ALcomb1_2w[] = {&acomb1_2w, 0};
+actListPtr ALcomb2_2w[] = {&acomb2_2w, 0};
+actListPtr ALcook_2w[] = {&acooklips_2w, &aridcooklips_2w, &acook1_2w, &acook2_2w, &acook3_2w, &acook4_2w, &acook5_2w, &acook6_2w, &acopbit4_2w, &acook7_2w, &acook8_2w, &acook9_2w, 0};
+actListPtr ALcookp_2w[] = {&abonus22_2w, &acookp1_2w, &acookp2_2w, &acookp3_2w, 0};
+actListPtr ALcop_2w[] = {&acop1_2w, &acop2_2w, &acop3_2w, 0};
+actListPtr ALcure_2w[] = {&aserum1_2w, &aserum2_2w, &acure_2w, 0};
+actListPtr ALdial_2w[] = {&adial_2w, 0};
+actListPtr ALdialed_2w[] = {&adialed_2w, 0};
+actListPtr ALdidnt_2w[] = {&adidnt1_2w, &adidnt2_2w, &ascr33a_2w, &ascr33b_2w, &ascr33c_2w, &ascr33d_2w, 0};
+actListPtr ALdoctor_2w[] = {&achkrobot_2w, 0};
+actListPtr ALdog1_2w[] = {&adog1_2w, 0};
+actListPtr ALdone_2w[] = {&afinale_2w, &adisable_2w, &adone1_2w, &adone2_2w, &adone3_2w, &adone4_2w, &adone5_2w, &adone6_2w, &adone7_2w, &adone8_2w, &adone9_2w, &adone10_2w, &adone11_2w, &adone12_2w, &adone13_2w, &adone14_2w, &adone15_2w, &adone16_2w, 0};
+actListPtr ALdropdyn1_2w[] = {&achkdrop_2w, 0};
+actListPtr ALdropdyn2_2w[] = {&adropdyn2_2w, 0};
+actListPtr ALdropdynamite_2w[] = {&adropdyn1_2w, 0};
+actListPtr ALdropmat_2w[] = {&asplash_2w, &amat1_2w, &amat2_2w, &amat3_2w, &amat4_2w, &amat5_2w, &amat6_2w, 0};
+actListPtr ALdumb_2w[] = {&abonus6_2w, &adumbchk_2w, 0};
+actListPtr ALdyn1_2w[] = {&adyn1_2w, &adyn2_2w, 0};
+actListPtr ALeatban_2w[] = {&aridban_2w, &aeatban_2w, &asubban_2w, &adropban_2w, 0};
+actListPtr ALeatbanana_2w[] = {&abprompt_2w, 0};
+actListPtr ALempty_2w[] = {&aempty_2w,0};
+actListPtr ALexitmaze_2w[] = {&aexitmaze_2w, &aheroxy11_2w, &ascrmaze_2w, 0};
+actListPtr ALfaint_2w[] = {&afaint1_2w, &ascream_2w, &adisable_2w, &afaint2_2w, &afaint3_2w, &afaint4_2w, &afaint5_2w, &afaint6_2w, &afaint7_2w, &afaint8_2w, &afaint9_2w, &afaint10_2w, 0};
+actListPtr ALgard1_2w[] = {&agard2_2w, &agard3_2w, &agard4_2w, &agard5_2w, &agard6_2w, &agard7_2w, &agard8_2w, &agard9_2w, &agard10_2w, &agard11_2w, 0};
+actListPtr ALgarlic_2w[] = {&agarprompt_2w, 0};
+actListPtr ALgatelight_2w[] = {&abutchk_2w, &achkglight_2w, 0};
+actListPtr ALgatescls_2w[] = {&agatescls_2w, 0};
+actListPtr ALgatesopn_2w[] = {&abonus8_2w, &agatesopn_2w, 0};
+actListPtr ALgenie_2w[] = {&asong2a_2w, &abonus30_2w, &agenie1_2w, &agenie2_2w, &agenie3_2w, &agenie4_2w, 0};
+actListPtr ALgetbook_2w[] = {&achkstate0_2w, 0};
+actListPtr ALgetdynamite_2w[] = {&adynamite1_2w, 0};
+actListPtr ALgetgarlic_2w[] = {&agetgarlic_2w, 0};
+actListPtr ALgetmatch_2w[] = {&agetmatch_2w, 0};
+actListPtr ALgiveb2_2w[] = {&achkgive_2w, 0};
+actListPtr ALgiveb3_2w[] = {&ameow_2w, &agiveb3_2w, &agiveb4_2w, &agiveb5_2w, &agiveb6_2w, &agiveb7_2w, &abel1_2w, &abel2_2w, &abel3_2w, &abel4_2w, &acat3_2w, &abonus21_2w, 0};
+actListPtr ALgiveb4_2w[] = {&asniff_2w, 0};
+actListPtr ALgivebel_2w[] = {&agiveb1_2w, 0};
+actListPtr ALglchk2_2w[] = {&aglchk2_2w, 0};
+actListPtr ALglightoff_2w[] = {&aglightoff1_2w, &aglightoff2_2w, &aclicksnd_2w, &aclick_2w, 0};
+actListPtr ALglighton_2w[] = {&aglighton1_2w, &aglighton2_2w, &aclicksnd_2w, &aclick_2w, 0};
+actListPtr ALglook1_2w[] = {&aglook1_2w, 0};
+actListPtr ALglook2_2w[] = {&aglook2_2w, 0};
+actListPtr ALgoclosed_2w[] = {&ashed25_2w, &ascr0812_2w, 0};
+actListPtr ALgoopen_2w[] = {&ashed24_2w, &ascr0811_2w, 0};
+actListPtr ALgotwill_2w[] = {&agotwill_2w, 0};
+actListPtr ALgun_2w[] = {&achkgun_2w, 0};
+actListPtr ALharry_2w[] = {&aharry1_2w, &aharry2_2w, &aharry3_2w, &aharry4_2w, &aharry5_2w, &aharry6_2w, &aharry7_2w, &acopbit8_2w, &abonus23_2w, &asong_l_2w, &ascreen35_2w, 0};
+actListPtr ALhdrink_2w[] = {&ahdrink1_2w, &ahdrink2_2w, &ahdrink3_2w, &ahdrink4_2w, &ahdrink5_2w, &ahdrink6_2w, &ahdrink7_2w, &ahdrink8_2w, &ahdrink9_2w, &ahdrink10_2w, &ahdrink11_2w, &ahdrink12_2w, &ahdrink13_2w, 0};
+actListPtr ALheroxy01_2w[] = {&aheroxy01_2w, &aherostart_2w, &aheroseq1_2w, 0};
+actListPtr ALhfaint_2w[] = {&adisable_2w, &ahfaint1_2w, &ahfaint2_2w, &ahfaint3_2w, &ahfaint4_2w, &ahfaint5_2w, &ahfaint6_2w, 0};
+actListPtr ALhole_2w[] = {&ahole_2w, 0};
+actListPtr ALhprompt_2w[] = {&ahestd1_2w, &ahestd2_2w, &ahestd3_2w, 0};
+actListPtr ALhrgreet_2w[] = {&ahest1_2w, &ahest2_2w, &ahest3_2w, &ahest4_2w, &ahest5_2w, &ahest6_2w, &ahest7_2w, &ahest8_2w, &ahest9_2w, &ahest10_2w, &ahest11_2w, &ahest12_2w, &ahest13_2w, &ahest14_2w, &ahest15_2w, &ahest16_2w, 0};
+actListPtr ALhtable_2w[] = {&achkhr2_2w, &achkhr3_2w, &achkhr4_2w, &astopr_2w, 0};
+actListPtr ALhugone_2w[] = {&asetbk1_2w, &abkstart1_2w, &abkstart2_2w, &abkstop_2w, &aswaphero_2w, &ascreen2_2w, &abonus1_2w, &adisable_2w, &agone1_2w, &agone2_2w, &agone3_2w, &agone4_2w, &acyc2_2w, &agone5_2w, &asong2_2w, &agone6_2w, &agone7_2w, &agone8_2w, &agone9_2w, &agone10_2w, &agone11_2w, &agone12_2w, &agone13_2w, &agone14_2w, &agone15_2w, 0};
+actListPtr ALkaboom3_2w[] = {&adead1_2w, &adead2_2w, &aboomxy_2w, &adead3_2w, &adead4_2w, &adead5_2w, 0};
+actListPtr ALkaboom_2w[] = {&asong5_2w, &akaboom1_2w, &akaboom2_2w, &akaboom3_2w, 0};
+actListPtr ALkeyhole1_2w[] = {&akeyhole1_2w, 0};
+actListPtr ALkeyhole2_2w[] = {&aok_2w, &akeyhole3_2w, &akeyhole4_2w, &akeyhole5_2w, &akeyhole6_2w, &ascr0204_2w, 0};
+actListPtr ALkeyhole_2w[] = {&akeyhole_2w, 0};
+actListPtr ALlamp_2w[] = {&achklamp_2w, 0};
+actListPtr ALlightdynamite_2w[] = {&achkld1_2w, 0};
+actListPtr ALlignpen_2w[] = {&alignpen_2w, 0};
+actListPtr ALlookbrg_2w[] = {&alookbrg_2w, &astopr_2w, 0};
+actListPtr ALlookgard_2w[] = {&aglchk_2w, 0};
+actListPtr ALlookkennel_2w[] = {&achkken1_2w, 0};
+actListPtr ALmaid_2w[] = {&amaidlips_2w, &aridmaidlips_2w, &amaid1_2w, &amaid2_2w, &amaid3_2w, &amaid4_2w, &amaid5_2w, &amaid6_2w, &amaidgo_2w, &amaid7_2w, &amaid8_2w, &amaid9_2w, &amaid10_2w, &amaid11_2w, &arepmsg1_2w, 0};
+actListPtr ALmaidbk_2w[] = {&amaidbk1_2w, &amaidbk2_2w, &amaidbk3_2w, &amaidbk4_2w, &amaidbk5_2w, &amaidbk6_2w, &amaidbk7_2w, &amaidbk8_2w, 0};
+actListPtr ALmaidp_2w[] = {&achkmaid_2w, 0};
+actListPtr ALmaidx_2w[] = {&amaidp1_2w, &amaidp2_2w, &amaidp3_2w, &amaidp4_2w, &amaidp5_2w, &amaidp6_2w, &amaidp7_2w, &amaidp8_2w, &amaidp9_2w, &arepblah_2w, 0};
+actListPtr ALmap0_2w[] = {&amap0_2w, 0};
+actListPtr ALmap1_2w[] = {&amap1_2w, 0};
+actListPtr ALmatok_2w[] = {&achkld2_2w, 0};
+actListPtr ALmissed_2w[] = {&agunshot_2w, &amissed1_2w, &amissed2_2w, &amissed3_2w, 0};
+actListPtr ALnasty_2w[] = {&abite3_2w, &abite4_2w, &abite5_2w, &abite6_2w, 0};
+actListPtr ALnobang2_2w[] = {&anobang2_2w, 0};
+actListPtr ALnobang_2w[] = {&anobang_2w, 0};
+actListPtr ALnobell_2w[] = {&ading_2w, &abell_2w, &anobell_2w, 0};
+actListPtr ALnocarry_2w[] = {&anocarry_2w, 0};
+actListPtr ALnocure_2w[] = {&aserum1_2w, 0};
+actListPtr ALnodrink_2w[] = {&ahnod1_2w, &ahnod2_2w, &ahnod3_2w, 0};
+actListPtr ALnogenie_2w[] = {&anogenie_2w, 0};
+actListPtr ALnopurps_2w[] = {&anopurps_2w,0};
+actListPtr ALnoreply_2w[] = {&anoreply_2w, 0};
+actListPtr ALnotrap_2w[] = {&anotrap_2w, 0};
+actListPtr ALomgag_2w[] = {&aomlips_2w, &aomridlip_2w, &aom1_2w, &aom2_2w, &aom3_2w, &aom4_2w, &aom5_2w, &aom6_2w, &aom7_2w, &aom8_2w, &aom9_2w, &aom10_2w, &aom11_2w, &aom12_2w, &aom13_2w, &aom14_2w, &aom15_2w, &aom16_2w, &aom17_2w, &aom18_2w, &aom19_2w, &aom20_2w, &abonus11_2w, 0};
+actListPtr ALopendoor1_2w[] = {&astophero_2w, &adoorsnd_2w, &amaidstop1_2w, &amaidstop2_2w, &aopendoor1_2w, &ast12_2w, &aheroxy12_2w, &aclosedoor1_2w, &ascr12_2w, 0};
+actListPtr ALopendoor2_2w[] = {&astophero_2w, &adoorsnd_2w, &aopendoor2_2w, &ast3435_2w, &aheroxy3435_2w, &aclosedoor2_2w, &ascr3435_2w, 0};
+actListPtr ALopendoor3_2w[] = {&astophero_2w, &adoorsnd_2w, &aopendoor3_2w, &ast3436_2w, &aheroxy3436_2w, &aclosedoor3_2w, &ascr3436_2w, 0};
+actListPtr ALpanel_2w[] = {&asong2up_2w, &asong2dn_2w, &adisable_2w, &apanel1_2w, &apanel2_2w, &apanel3_2w, &apanel4_2w, &apanel5_2w, &apanel6_2w, &apanel7_2w, &apanel8_2w, 0};
+actListPtr ALparty_2w[] = {&adisable_2w, &aparty1a_2w, &aparty1b_2w, &aparty1c_2w, &aparty2a_2w, &aparty2b_2w, &aparty2c_2w, &aparty3a_2w, &aparty3b_2w, &aparty3c_2w, &aparty4a_2w, &aparty4b_2w, &aparty4c_2w, &aparty5a_2w, &aparty5b_2w, &aparty5c_2w, &aparty6a_2w, &aparty6b_2w, &aparty6c_2w, &aparty7a_2w, &aparty7b_2w, &aparty7c_2w, &aparty8a_2w, &aparty8b_2w, &aparty8c_2w, &aparty9a_2w, &aparty9b_2w, &aparty9c_2w, &aclimax_2w, 0};
+actListPtr ALpencil_2w[] = {&apen1_2w, &apen2_2w, &apen3_2w, &apen4_2w, &apen5_2w, &abonus27_2w, &afinito_2w, &ascr3334_2w, 0};
+actListPtr ALpengone_2w[] = {&abonus3_2w, &abkstart1_2w, &abkstart2_2w, &abkstop_2w, &asong2_2w, &adisable_2w, &apeng1_2w, &apeng2_2w, &apeng3_2w, &apeng4_2w, &ascr0203_2w, 0};
+actListPtr ALpenny1_2w[] = {&apenxy_2w, &apenseq1_2w, &apenseq2_2w, &apenseq3_2w, &apenseq4_2w, &apenstart_2w, &apenvxy1_2w, &apenvxy2_2w, &apenvxy3_2w, &apenvxy4_2w, &apenseq5_2w, &apenseq6_2w, &apenstop_2w, 0};
+actListPtr ALphone_2w[] = {&achkpb2_2w, &achkpb3_2w, &achkpb4_2w, 0};
+actListPtr ALphonebox_2w[] = {&achkpb1_2w, 0};
+actListPtr ALphoto1_2w[] = {&achkph2_2w, 0};
+actListPtr ALphoto2_2w[] = {&aphoto6_2w, 0};
+actListPtr ALphoto3_2w[] = {&aphoto1_2w, &aphoto2_2w, &aphoto3_2w, &aphoto4_2w, &aphoto5_2w, &agotalbum_2w, 0};
+actListPtr ALphoto_2w[] = {&achkphoto_2w, 0};
+actListPtr ALpois1_2w[] = {&apois1_2w, 0};
+actListPtr ALpois2_2w[] = {&apois2_2w, 0};
+actListPtr ALpois3_2w[] = {&apois3_2w, 0};
+actListPtr ALpois4_2w[] = {&apois4_2w, &aurgh_2w, &adead1_2w, &adead2_2w, &adead3_2w, &adead4_2w, &adead5_2w, 0};
+actListPtr ALpushpaper_2w[] = {&abonus26_2w, &apaper1_2w, &apaper2_2w, &apaper3_2w, &apaper4_2w, 0};
+actListPtr ALpushpencil_2w[] = {&achkpencil_2w, 0};
+actListPtr ALreadlet_2w[] = {&abonus24_2w, &acopbit16_2w, 0};
+actListPtr ALrephest_2w[] = {&arepblah_2w, 0};
+actListPtr ALrepmsg1_2w[] = {&amaid12_2w, &arepmsg1_2w, 0};
+actListPtr ALrg_2w[] = {&arxy_2w, &arok_2w, &arg_2w, 0};
+actListPtr ALridgard_2w[] = {&adropgarl_2w, &aridgarl_2w, &aeatgarl2_2w, &aridgard1_2w, &aridgard2_2w, &aridgard3_2w, &aridgard4_2w, &aridgard5_2w, &aridpath_2w, &aridtext_2w, &aridgard6_2w, &abonus7_2w, &agarl1_2w, &aschedbut_2w, 0};
+actListPtr ALridgarl_2w[] = {&adropgarl_2w, &aridgarl_2w, &aeatgarl1_2w, &subgarlic_2w, 0};
+actListPtr ALridkey_2w[] = {&aridkey1_2w, &aridkey2_2w, 0};
+actListPtr ALrobot_2w[] = {&adead1_2w, &ascream_2w, &adead2_2w, &adead3_2w, &adead4_2w, &aext1_2w, &aext2_2w, &aext3_2w, &adead5_2w, 0};
+actListPtr ALrr_2w[] = {&arxy_2w, &arok_2w, &arr_2w, 0};
+actListPtr ALrumbling_2w[] = {&agatesnd_2w, &arumbling_2w, 0};
+actListPtr ALsafe1_2w[] = {&abonus19_2w, &asafe1_2w, &asafe2_2w, &asafe3_2w, &asafe4_2w, &asafe5_2w, 0};
+actListPtr ALsafe_2w[] = {&achkwill_2w, 0};
+actListPtr ALsafepr_2w[] = {&asafepr_2w, 0};
+actListPtr ALschedbut_2w[] = {&aexplainb_2w, 0};
+actListPtr ALscr0201_2w[] = {&ascr21_2w, 0};
+actListPtr ALscr02_2w[] = {&achkbed1_2w, 0};
+actListPtr ALscr0301_2w[] = {&ascr31_2w, 0};
+actListPtr ALscr0305_2w[] = {&abed2_1_2w, &ascr0305_2w, 0};
+actListPtr ALscr0306_2w[] = {&adumb1_2w, &adumb2_2w, &adumb3_2w, &ascr0306_2w, 0};
+actListPtr ALscr03_2w[] = {&achkpanel_2w, 0};
+actListPtr ALscr04_2w[] = {&abonus2_2w, &amurdsnd_2w, &amurd1_2w, &amurd2_2w, &amurd3_2w, &amurd4_2w, &ascr0402_2w, 0};
+actListPtr ALscr0503_2w[] = {&abed3_1_2w, &ascr0503_2w, 0};
+actListPtr ALscr0603_2w[] = {&adumb11_2w, &adumb12_2w, &adumb13_2w, &ascr0603_2w, 0};
+actListPtr ALscr0607_2w[] = {&akit1_2w, &akit2_2w, &ascr0607_2w, 0};
+actListPtr ALscr0631_2w[] = {&achkkit_2w, 0};
+actListPtr ALscr06_2w[] = {&achkcook_2w, 0};
+actListPtr ALscr0706_2w[] = {&abd1_2w, &abd2_2w, &ascr0706_2w, 0};
+actListPtr ALscr0708_2w[] = {&abd20_2w, &abd21_2w, &ascr0708_2w, 0};
+actListPtr ALscr0710_2w[] = {&abd10_2w, &abd11_2w, &ascr0710_2w, 0};
+actListPtr ALscr0807_2w[] = {&ashed1_2w, &ashed2_2w, &ascr0807_2w, 0};
+actListPtr ALscr0809_2w[] = {&ashed11_2w, &ashed12_2w, &ascr0809_2w, 0};
+actListPtr ALscr0908_2w[] = {&ainshed1_2w, &ainshed2_2w, &ascr0908_2w, 0};
+actListPtr ALscr09_2w[] = {&agard1_2w, &aclue09_2w, 0};
+actListPtr ALscr1007_2w[] = {&avenus1_2w, &avenus2_2w, &ascr1007_2w, 0};
+actListPtr ALscr10_2w[] = {&awarn_2w, 0};
+actListPtr ALscr1108_2w[] = {&agates1_2w, &ascr1108_2w, 0};
+actListPtr ALscr1113_2w[] = {&agates11_2w, &ascr1113_2w, 0};
+actListPtr ALscr1314_2w[] = {&astream11_2w, &astream12_2w, &ascr1314_2w, 0};
+actListPtr ALscr1413_2w[] = {&azap1_2w, &ascr1413_2w, 0};
+actListPtr ALscr1415_2w[] = {&azap11_2w, &ascr1415_2w, 0};
+actListPtr ALscr14_2w[] = {&achkbugs_2w, &awarnz_2w, 0};
+actListPtr ALscr1514_2w[] = {&amush1_2w, &ascr1514_2w, 0};
+actListPtr ALscr1516_2w[] = {&amush21_2w, &ascr1516_2w, 0};
+actListPtr ALscr1517_2w[] = {&amush11_2w, &ascr1517_2w, 0};
+actListPtr ALscr15_2w[] = {&achkom_2w, 0};
+actListPtr ALscr1615_2w[] = {&awell1_2w, &ascr1615_2w, 0};
+actListPtr ALscr1715_2w[] = {&asnake1_2w, &ascr1715_2w, 0};
+actListPtr ALscr1718_2w[] = {&asnake11_2w, &ascr1718_2w, 0};
+actListPtr ALscr1720_2w[] = {&asnake21_2w, &ascr1720_2w, 0};
+actListPtr ALscr1817_2w[] = {&aphone1_2w, &ascr1817_2w, 0};
+actListPtr ALscr1819c_2w[] = {&aphone11c_2w, &ascr1819_2w, 0};
+actListPtr ALscr1819l_2w[] = {&aphone11l_2w, &ascr1819_2w, 0};
+actListPtr ALscr1819r_2w[] = {&aphone11r_2w, &ascr1819_2w, 0};
+actListPtr ALscr1918c_2w[] = {&aphone11c_2w, &ascr1918_2w, 0};
+actListPtr ALscr1918l_2w[] = {&aphone11l_2w, &ascr1918_2w, 0};
+actListPtr ALscr1918r_2w[] = {&aphone11r_2w, &ascr1918_2w, 0};
+actListPtr ALscr2017_2w[] = {&akennel1_2w, &ascr2017_2w, 0};
+actListPtr ALscr2223_2w[] = {&arockg1_2w, &ascr2223_2w, 0};
+actListPtr ALscr2322_2w[] = {&athree1_2w, &ascr2322_2w, 0};
+actListPtr ALscr2324_2w[] = {&athree11_2w, &ascr2324_2w, 0};
+actListPtr ALscr2325_2w[] = {&athree21_2w, &ascr2325_2w, 0};
+actListPtr ALscr2326_2w[] = {&athree31_2w, &ascr2326_2w, 0};
+actListPtr ALscr2423_2w[] = {&alamp1_2w, &ascr2423_2w, 0};
+actListPtr ALscr2523_2w[] = {&achasm25_2w, &ascr2523_2w, 0};
+actListPtr ALscr25_2w[] = {&acheatchk_2w, &arepchk_2w, 0};
+actListPtr ALscr2623_2w[] = {&apass1_2w, &ascr2623_2w, 0};
+actListPtr ALscr2627_2w[] = {&apass11_2w, &ascr2627_2w, 0};
+actListPtr ALscr2726_2w[] = {&aladder1_2w, &ascr2726_2w, 0};
+actListPtr ALscr2827_2w[] = {&atrap1_2w, &ascr2827_2w, 0};
+actListPtr ALscr2829_2w[] = {&atrap2_2w, &ascr2829_2w, 0};
+actListPtr ALscr2928_2w[] = {&ahall2_1_2w, &ascr2928_2w, 0};
+actListPtr ALscr2930_2w[] = {&ahall2_2_2w, &ahall2_2a_2w, &ascr2930_2w, 0};
+actListPtr ALscr2931_2w[] = {&ahall2_3_2w, &ascr2931_2w, 0};
+actListPtr ALscr2934_2w[] = {&ahall2_4_2w, &ascr2934_2w, 0};
+actListPtr ALscr2938_2w[] = {&ahall2_5_2w, &ascr2938_2w, 0};
+actListPtr ALscr29_2w[] = {&achkcop_2w, 0};
+actListPtr ALscr3029_2w[] = {&alounge1_2w, &ascr3029_2w, 0};
+actListPtr ALscr30_2w[] = {&achkcop2_2w, 0};
+actListPtr ALscr3106_2w[] = {&adoorsnd_2w, &achkcookp_2w, &aparlor3_2w, &ascr3106_2w, 0};
+actListPtr ALscr3129_2w[] = {&aparlor2_2w, &ascr3129_2w, 0};
+actListPtr ALscr3132_2w[] = {&aparlor1_2w, &ascr3132_2w, 0};
+actListPtr ALscr3231_2w[] = {&acatroom1_2w, &ascr3231_2w, 0};
+actListPtr ALscr33_2w[] = {&adraught_2w, &adrop33a_2w, &adrop33b_2w, &adrop33c_2w, &adrop33d_2w, &adrop33e_2w, &adrop33f_2w, &adrop33g_2w, &adrop33h_2w, &adrop33i_2w, &adrop33j_2w, 0};
+actListPtr ALscr3429_2w[] = {&ahall3_2_2w, &ascr3429_2w, 0};
+actListPtr ALscr3438_2w[] = {&ahall3_1_2w, &ahall3_1a_2w, &ascr3438_2w, 0};
+actListPtr ALscr34_2w[] = {&achkhero_2w, 0};
+actListPtr ALscr3534_2w[] = {&asong_l_2w, &aorgan1_2w, &ascr3534_2w, 0};
+actListPtr ALscr35_2w[] = {&achksong_2w, 0};
+actListPtr ALscr3634_2w[] = {&ahestroom1_2w, &ascr3634_2w, 0};
+actListPtr ALscr36_2w[] = {&achkhr1_2w, 0};
+actListPtr ALscr3718_2w[] = {&aretupxy_2w, &ascr3718_2w, 0};
+actListPtr ALscr3829_2w[] = {&ahall1_1_2w, &ascr3829_2w, 0};
+actListPtr ALscr3834_2w[] = {&ahall1_2_2w, &ahall1_3_2w, &ascr3834_2w, 0};
+actListPtr ALscrgate1_2w[] = {&ashed21_2w, &ashed22_2w, &ashed23_2w, &achkgo_2w, 0};
+actListPtr ALscrgate2_2w[] = {&astream1_2w, &achkgo_2w, 0};
+actListPtr ALscrok_2w[] = {&adoorsnd_2w, &akit11_2w, &ascr0631_2w, 0};
+actListPtr ALshedlight_2w[] = {&abutchk_2w, &achkslight_2w, 0};
+actListPtr ALshot_2w[] = {&agunshot_2w, &aridsched_2w, &amissed1_2w, &amissed2_2w, &amissed3_2w, &arobot1_2w, &arobot2_2w, &arobot3_2w, &arobot4_2w, &arobot5_2w, &arobot6_2w, &arobot7_2w, &abonus15_2w, 0};
+actListPtr ALsilly_2w[] = {&asilly_2w, 0};
+actListPtr ALslightoff_2w[] = {&aclicksnd_2w, &aslightoff1_2w, &aslightoff2_2w, 0};
+actListPtr ALslighton_2w[] = {&aclicksnd_2w, &aslighton1_2w, &aslighton2_2w, 0};
+actListPtr ALsnake_2w[] = {&achksnake_2w, 0};
+actListPtr ALsoggy_2w[] = {&asoggy_2w, 0};
+actListPtr ALsong3_2w[] = {&asong_r_2w, 0};
+actListPtr ALsong4_2w[] = {&asong4_2w, 0};
+actListPtr ALsonic_2w[] = {&asonic1_2w, &asonic2_2w, &asonic3_2w, &asonic4_2w, &asonic5_2w, &asonic6_2w, &asonic7_2w, &asonic8_2w, &asonic9_2w, 0};
+actListPtr ALstopr_2w[] = {&astopr_2w,0};
+actListPtr ALstrike_2w[] = {&astrike_2w, 0};
+actListPtr ALstrikematch_2w[] = {&amatchk2_2w, 0};
+actListPtr ALstuck_2w[] = {&astuck1_2w, 0};
+actListPtr ALswgates_2w[] = {&aswgates_2w, &agatesnd_2w, &arumbling_2w, 0};
+actListPtr ALswzapper_2w[] = {&aswzapper_2w, &aclicksnd_2w, &aclick_2w, 0};
+actListPtr ALtakepaper_2w[] = {&apaper5_2w, 0};
+actListPtr ALtalkgard_2w[] = {&atalkg_2w, 0};
+actListPtr ALthrown_2w[] = {&achkken2_2w, 0};
+actListPtr ALthrowstick_2w[] = {&abark_2w, &astick1_2w, &adisable_2w, &astick2_2w, &astick3_2w, &astick4_2w, &astick5_2w, &astick6_2w, &astick7_2w, &astick8_2w, &astick9_2w, &astick10_2w, &abonus12_2w, 0};
+actListPtr ALtrap_2w[] = {&achktrap_2w, 0};
+actListPtr ALuptrap_2w[] = {&auptrap1_2w, &auptrap2_2w, 0};
+actListPtr ALvenus_2w[] = {&ascream_2w, &astung_2w, &adead1_2w, &adead2_2w, &adead3_2w, &adead4_2w, &adead5_2w, 0};
+actListPtr ALwho_2w[] = {&abonus14_2w, &awho1_2w, &awho2_2w, &awho3_2w, &awho4_2w, &ascr1837_2w, 0};
+actListPtr ALwill1_2w[] = {&awill1_2w, &awill2_2w, &acopbit1_2w, &abonus20_2w, 0};
+actListPtr ALwill2_2w[] = {&awill3_2w, &awill4_2w, 0};
+actListPtr ALwill_2w[] = {&achkmag_2w, 0};
+actListPtr ALworkgates_2w[] = {&abutchk_2w, &achkgates_2w, 0};
+actListPtr ALzapperoff_2w[] = {&azapperoff1_2w, &azapperoff2_2w, 0};
+actListPtr ALzapperon_2w[] = {&abonus9_2w, &azapperon1_2w, &azapperon2_2w, 0};
+actListPtr ALscr01Story_2w[] = {&astory_2w, &ascr01_2w, 0};
+actListPtr ALscr01NoStory_2w[] = {&askip1_2w, &askip2_2w, &askip3_2w, &askip4_2w, &askip5_2w, 0};
+
+// Special action list for maze
+act2 aheroxy_2w = {INIT_OBJXY, 0, HERO, 0, 0};
+//act5 astophero_2w = {INIT_OBJVXY, 0, HERO, 0, 0};
+act1 aherostop_2w = {START_OBJ, 0, HERO, 0, NOT_CYCLING};
+act8 anewscr_2w = {NEW_SCREEN, 0, 0};
+actListPtr ALnewscr_2w[] = {&aheroxy_2w, &astophero_2w, &aherostop_2w, &anewscr_2w, 0};
+
+actList actListArr_2w[] = {
+ ALDummy, AL11maze_2w, AL_eatgar_2w, ALballoon_2w, ALbanana_2w,
+ ALbang1_2w, ALbang2_2w, ALbed1_2w, ALbell1_2w, ALbell2_2w,
+ ALbell_2w, ALbite_2w, ALblah_2w, ALboom_2w, ALbottle_2w,
+ ALbridge_2w, ALbugattack_2w, ALbugflit_2w, ALbugrep1_2w, ALbugrep2_2w,
+ ALbugs_2w, ALbugzapper_2w, ALcallp_2w, ALcantpush_2w, ALcat1_2w,
+ ALcat2_2w, ALcat3_2w, ALcat4_2w, ALcat5_2w, ALcat6_2w,
+ ALcatnip_2w, ALchasm_2w, ALcheat_2w, ALchkbell2_2w, ALchkc09_2w,
+ ALchkcarry_2w, ALchkdoc_2w, ALchkld3_2w, ALchkld4_2w, ALchkmat1_2w,
+ ALchkmat2_2w, ALchkpap1_2w, ALchkpap2_2w, ALchkroute_2w, ALchkrr2_2w,
+ ALchksafe_2w, ALchkscrew_2w, ALchkstate1_2w, ALclick_2w, ALclimax_2w,
+ ALclimbrope_2w, ALclimbup_2w, ALclimbwell_2w, ALclue09_2w, ALcomb1_2w,
+ ALcomb2_2w, ALcook_2w, ALcookp_2w, ALcop_2w, ALcure_2w,
+ ALdial_2w, ALdialed_2w, ALdidnt_2w, ALdoctor_2w, ALdog1_2w,
+ ALdone_2w, ALdropdyn1_2w, ALdropdyn2_2w, ALdropdynamite_2w, ALdropmat_2w,
+ ALdumb_2w, ALdyn1_2w, ALeatban_2w, ALeatbanana_2w, ALempty_2w,
+ ALexitmaze_2w, ALfaint_2w, ALgard1_2w, ALgarlic_2w, ALgatelight_2w,
+ ALgatescls_2w, ALgatesopn_2w, ALgenie_2w, ALgetbook_2w, ALgetdynamite_2w,
+ ALgetgarlic_2w, ALgetmatch_2w, ALgiveb2_2w, ALgiveb3_2w, ALgiveb4_2w,
+ ALgivebel_2w, ALglchk2_2w, ALglightoff_2w, ALglighton_2w, ALglook1_2w,
+ ALglook2_2w, ALgoclosed_2w, ALgoopen_2w, ALgotwill_2w, ALgun_2w,
+ ALharry_2w, ALhdrink_2w, ALheroxy01_2w, ALhfaint_2w, ALhole_2w,
+ ALhprompt_2w, ALhrgreet_2w, ALhtable_2w, ALhugone_2w, ALkaboom3_2w,
+ ALkaboom_2w, ALkeyhole1_2w, ALkeyhole2_2w, ALkeyhole_2w, ALlamp_2w,
+ ALlightdynamite_2w, ALlignpen_2w, ALlookbrg_2w, ALlookgard_2w, ALlookkennel_2w,
+ ALmaid_2w, ALmaidbk_2w, ALmaidp_2w, ALmaidx_2w, ALmap0_2w,
+ ALmap1_2w, ALmatok_2w, ALmissed_2w, ALnasty_2w, ALnobang2_2w,
+ ALnobang_2w, ALnobell_2w, ALnocarry_2w, ALnocure_2w, ALnodrink_2w,
+ ALnogenie_2w, ALnopurps_2w, ALnoreply_2w, ALnotrap_2w, ALomgag_2w,
+ ALopendoor1_2w, ALopendoor2_2w, ALopendoor3_2w, ALpanel_2w, ALparty_2w,
+ ALpencil_2w, ALpengone_2w, ALpenny1_2w, ALphone_2w, ALphonebox_2w,
+ ALphoto1_2w, ALphoto2_2w, ALphoto3_2w, ALphoto_2w, ALpois1_2w,
+ ALpois2_2w, ALpois3_2w, ALpois4_2w, ALpushpaper_2w, ALpushpencil_2w,
+ ALreadlet_2w, ALrephest_2w, ALrepmsg1_2w, ALrg_2w, ALridgard_2w,
+ ALridgarl_2w, ALridkey_2w, ALrobot_2w, ALrr_2w, ALrumbling_2w,
+ ALsafe1_2w, ALsafe_2w, ALsafepr_2w, ALschedbut_2w, ALscr0201_2w,
+ ALscr02_2w, ALscr0301_2w, ALscr0305_2w, ALscr0306_2w, ALscr03_2w,
+ ALscr04_2w, ALscr0503_2w, ALscr0603_2w, ALscr0607_2w, ALscr0631_2w,
+ ALscr06_2w, ALscr0706_2w, ALscr0708_2w, ALscr0710_2w, ALscr0807_2w,
+ ALscr0809_2w, ALscr0908_2w, ALscr09_2w, ALscr1007_2w, ALscr10_2w,
+ ALscr1108_2w, ALscr1113_2w, ALscr1314_2w, ALscr1413_2w, ALscr1415_2w,
+ ALscr14_2w, ALscr1514_2w, ALscr1516_2w, ALscr1517_2w, ALscr15_2w,
+ ALscr1615_2w, ALscr1715_2w, ALscr1718_2w, ALscr1720_2w, ALscr1817_2w,
+ ALscr1819c_2w, ALscr1819l_2w, ALscr1819r_2w, ALscr1918c_2w, ALscr1918l_2w,
+ ALscr1918r_2w, ALscr2017_2w, ALscr2223_2w, ALscr2322_2w, ALscr2324_2w,
+ ALscr2325_2w, ALscr2326_2w, ALscr2423_2w, ALscr2523_2w, ALscr25_2w,
+ ALscr2623_2w, ALscr2627_2w, ALscr2726_2w, ALscr2827_2w, ALscr2829_2w,
+ ALscr2928_2w, ALscr2930_2w, ALscr2931_2w, ALscr2934_2w, ALscr2938_2w,
+ ALscr29_2w, ALscr3029_2w, ALscr30_2w, ALscr3106_2w, ALscr3129_2w,
+ ALscr3132_2w, ALscr3231_2w, ALscr33_2w, ALscr3429_2w, ALscr3438_2w,
+ ALscr34_2w, ALscr3534_2w, ALscr35_2w, ALscr3634_2w, ALscr36_2w,
+ ALscr3718_2w, ALscr3829_2w, ALscr3834_2w, ALscrgate1_2w, ALscrgate2_2w,
+ ALscrok_2w, ALshedlight_2w, ALshot_2w, ALsilly_2w, ALslightoff_2w,
+ ALslighton_2w, ALsnake_2w, ALsoggy_2w, ALsong3_2w, ALsong4_2w,
+ ALsonic_2w, ALstopr_2w, ALstrike_2w, ALstrikematch_2w, ALstuck_2w,
+ ALswgates_2w, ALswzapper_2w, ALtakepaper_2w, ALtalkgard_2w, ALthrown_2w,
+ ALthrowstick_2w, ALtrap_2w, ALuptrap_2w, ALvenus_2w, ALwho_2w,
+ ALwill1_2w, ALwill2_2w, ALwill_2w, ALworkgates_2w, ALzapperoff_2w,
+ ALzapperon_2w, ALnewscr_2w, ALscr01Story_2w, ALscr01NoStory_2w
+};
+
+// Hugo 3 Win
+act0 adarttest_3w = {ASCHEDULE, 0, kALdartsched_3w};
+act0 arepblink_3w = {ASCHEDULE, 60, kALeleblink_3w};
+act0 arepeathorizon_3w = {ASCHEDULE, 2, kALhorizon_3w};
+act0 arepeatmouse_3w = {ASCHEDULE, 4, kALmouse_3w};
+act0 arepflash_3w = {ASCHEDULE, 10, kALflash_3w};
+
+act1 aappear1_3w = {START_OBJ, 1, HERO, 0, NOT_CYCLING};
+act1 abridge3_3w = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 acamp2a_3w = {START_OBJ, 0, NAT2_3w, 0, CYCLE_FORWARD};
+act1 acamp2b_3w = {START_OBJ, 0, NATG_3w, 0, CYCLE_FORWARD};
+act1 acamp8a_3w = {START_OBJ, 34, NAT2_3w, 0, NOT_CYCLING};
+act1 acamp8b_3w = {START_OBJ, 34, NATG_3w, 0, NOT_CYCLING};
+act1 acrash14_3w = {START_OBJ, 20, PENNY_3w, 0, CYCLE_FORWARD};
+act1 acrash19_3w = {START_OBJ, 42, HERO, 0, CYCLE_FORWARD};
+act1 acrash22_3w = {START_OBJ, 50, HERO, 0, INVISIBLE};
+act1 acrash9_3w = {START_OBJ, 5, HERO, 0, NOT_CYCLING};
+act1 adead1_3w = {START_OBJ, 0, HERO, 0, INVISIBLE};
+act1 adead3_3w = {START_OBJ, 0, PENNYLIE_3w, 0, NOT_CYCLING};
+act1 adropord2_3w = {START_OBJ, 0, CHEESE_3w, 0, NOT_CYCLING};
+act1 aenter5_3w = {START_OBJ, 4, MOUSE_3w, 0, INVISIBLE};
+act1 aenter6_3w = {START_OBJ, 4, CHEESE_3w, 0, INVISIBLE};
+act1 aenter8_3w = {START_OBJ, 4, CAGE_3w, 0, CYCLE_FORWARD};
+act1 aex4_3w = {START_OBJ, 0, GHOST_3w, 0, INVISIBLE};
+act1 afind2_3w = {START_OBJ, 0, CRYSTAL_3w, 0, NOT_CYCLING};
+act1 afindb3_3w = {START_OBJ, 0, BOOK_3w, 0, NOT_CYCLING};
+act1 aflask5_3w = {START_OBJ, 0, HERO, 0, INVISIBLE};
+act1 agot10_3w = {START_OBJ, 60, DOCTOR_3w, 0, CYCLE_FORWARD};
+act1 agot1a_3w = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 agot1b_3w = {START_OBJ, 0, DOCTOR_3w, 0, CYCLE_FORWARD};
+act1 ahelp3_3w = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 amission12_3w = {START_OBJ, 10, NATG_3w, 0, NOT_CYCLING};
+act1 amission15_3w = {START_OBJ, 29, LIPS_3w, 0, INVISIBLE};
+act1 amission18_3w = {START_OBJ, 34, HERO, 0, NOT_CYCLING};
+act1 amission25_3w = {START_OBJ, 60, SPIDER_3w, 0, INVISIBLE};
+act1 amission4_3w = {START_OBJ, 0, NATG_3w, 0, CYCLE_FORWARD};
+act1 amission5_3w = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 aold1a_3w = {START_OBJ, 0, MOUTH_3w, 0, NOT_CYCLING};
+act1 aold1b_3w = {START_OBJ, 20, MOUTH_3w, 0, CYCLE_FORWARD};
+act1 aold6a_3w = {START_OBJ, 0, MOUTH_3w, 0, NOT_CYCLING};
+act1 aold6g_3w = {START_OBJ, 22, HERO, 0, NOT_CYCLING};
+act1 aplantfix_3w = {START_OBJ, 0, PLANT1_3w, 0, NOT_CYCLING};
+act1 aprod1_3w = {START_OBJ, 0, DOCTOR_3w, 0, CYCLE_FORWARD};
+act1 aprod6_3w = {START_OBJ, 24, DOCTOR_3w, 0, CYCLE_FORWARD};
+act1 areturn2_3w = {START_OBJ, 0, NATG_3w, 0, NOT_CYCLING};
+act1 ascare15_3w = {START_OBJ, 0, ELEPHANT_3w, 0, CYCLE_FORWARD};
+act1 ascare16_3w = {START_OBJ, 64, ELEPHANT_3w, 0, INVISIBLE};
+act1 ascare4_3w = {START_OBJ, 0, E_EYES_3w, 0, INVISIBLE};
+act1 ascare6_3w = {START_OBJ, 0, MOUSE_3w, 0, CYCLE_FORWARD};
+act1 astick4_3w = {START_OBJ, 16, DOCTOR_3w, 0, INVISIBLE};
+act1 astick6_3w = {START_OBJ, 17, DOCLIE_3w, 0, CYCLE_FORWARD};
+act1 aswing1_3w = {START_OBJ, 0, HERO, 0, INVISIBLE};
+act1 aswing3_3w = {START_OBJ, 1, HERO, 0, CYCLE_FORWARD};
+act1 aswing8_3w = {START_OBJ, 15, HERO, 0, NOT_CYCLING};
+act1 atakecage1_3w = {START_OBJ, 0, CAGE_3w, 0, INVISIBLE};
+act1 atakecheese2_3w = {START_OBJ, 0, CHEESE_3w, 0, INVISIBLE};
+act1 avine2_3w = {START_OBJ, 0, BLOCK1_3w, 0, INVISIBLE};
+act1 avine3_3w = {START_OBJ, 0, BLOCK2_3w, 0, INVISIBLE};
+act1 avine4_3w = {START_OBJ, 0, BLOCK3_3w, 0, INVISIBLE};
+act1 avine5_3w = {START_OBJ, 0, BLOCK4_3w, 0, INVISIBLE};
+act1 aweb19_3w = {START_OBJ, 110, LIPS_3w, 0, INVISIBLE};
+act1 aweb21_3w = {START_OBJ, 115, PENNY_3w, 0, INVISIBLE};
+act1 aweb22_3w = {START_OBJ, 116, PENNYLIE_3w, 0, NOT_CYCLING};
+act1 aweb4_3w = {START_OBJ, 0, PENNY_3w, 0, CYCLE_FORWARD};
+act1 aweb7_3w = {START_OBJ, 38, PENNY_3w, 0, NOT_CYCLING};
+act1 awink1_3w = {START_OBJ, 8, O_EYE_3w, 1, CYCLE_FORWARD};
+act1 awink2_3w = {START_OBJ, 16, O_EYE_3w, 1, CYCLE_BACKWARD};
+act1 awink3_3w = {START_OBJ, 19, O_EYE_3w, 0, INVISIBLE};
+act1 aappear_3w = {START_OBJ, 0, HERO, 0, NOT_CYCLING};
+act1 adisappear_3w = {START_OBJ, 0, HERO, 0, INVISIBLE};
+
+act2 acamp0b_3w = {INIT_OBJXY, 0, NATG_3w, 128, 101};
+act2 acamp3a_3w = {INIT_OBJXY, 0, NAT2_3w, 17, 97};
+act2 acamp3b_3w = {INIT_OBJXY, 0, NATG_3w, 28, 101};
+act2 adoc4_3w = {INIT_OBJXY, 0, DOCTOR_3w, 70, 110};
+act2 adropcheese2_3w = {INIT_OBJXY, 0, CHEESE_3w, 158, 142};
+act2 aexit1_3w = {INIT_OBJXY, 0, HERO, 170, 110};
+act2 agot5a_3w = {INIT_OBJXY, 40, HERO, 239, 104};
+act2 ahole4a_3w = {INIT_OBJXY, 10, MOUSE_3w, 280, 135};
+act2 ahole4b_3w = {INIT_OBJXY, 10, MOUSE_3w, 200, 135};
+act2 aleft2_3w = {INIT_OBJXY, 0, HERO, 218, 106};
+act2 aleft4_3w = {INIT_OBJXY, 15, HERO, 53, 133};
+act2 amission3_3w = {INIT_OBJXY, 0, NATG_3w, 30, 120};
+act2 aold6f_3w = {INIT_OBJXY, 0, HERO, 289, 91};
+act2 aplane1_3w = {INIT_OBJXY, 0, HERO, 170, 50};
+act2 areturn4_3w = {INIT_OBJXY, 0, NATG_3w, 85, 115};
+act2 aright2_3w = {INIT_OBJXY, 0, HERO, 77, 106};
+act2 aright4_3w = {INIT_OBJXY, 15, HERO, 243, 133};
+act2 astick5_3w = {INIT_OBJXY, 17, DOCLIE_3w, 238, 133};
+act2 aweb2_3w = {INIT_OBJXY, 0, PENNY_3w, 270, 133};
+act2 aweb26_3w = {INIT_OBJXY, 0, HERO, 174, 107};
+act2 axy_brg_clftop_3w = {INIT_OBJXY, 0, HERO, 280, 30};
+act2 axy_brg_path_3w = {INIT_OBJXY, 0, HERO, 16, 91};
+act2 axy_camp_hut_3w = {INIT_OBJXY, 0, HERO, 27, 133};
+act2 axy_camp_village_c_3w = {INIT_OBJXY, 0, HERO, 100, 143};
+act2 axy_camp_village_l_3w = {INIT_OBJXY, 0, HERO, 45, 145};
+act2 axy_cave_turn_3w = {INIT_OBJXY, 0, HERO, 22, 136};
+act2 axy_cave_wfall_3w = {INIT_OBJXY, 0, HERO, 287, 140};
+act2 axy_clf_clftop_3w = {INIT_OBJXY, 0, HERO, 269, 130};
+act2 axy_clf_wfall_3w = {INIT_OBJXY, 0, HERO, 28, 140};
+act2 axy_clftop_brg_3w = {INIT_OBJXY, 0, HERO, 28, 91};
+act2 axy_clftop_clf_3w = {INIT_OBJXY, 0, HERO, 28, 140};
+act2 axy_clftop_slope_3w = {INIT_OBJXY, 0, HERO, 28, 120};
+act2 axy_crash_web_3w = {INIT_OBJXY, 0, HERO, 280, 133};
+act2 axy_garden_wbase_3w = {INIT_OBJXY, 0, HERO, 24, 114};
+act2 axy_hut_camp_3w = {INIT_OBJXY, 0, HERO, 280, 121};
+act2 axy_hut_in_3w = {INIT_OBJXY, 0, HERO, 155, 141};
+act2 axy_hut_out_3w = {INIT_OBJXY, 0, HERO, 148, 108};
+act2 axy_hut_village_c_3w = {INIT_OBJXY, 0, HERO, 207, 143};
+act2 axy_hut_village_r_3w = {INIT_OBJXY, 0, HERO, 207, 143};
+act2 axy_path_brg_3w = {INIT_OBJXY, 0, HERO, 289, 91};
+act2 axy_path_stream_3w = {INIT_OBJXY, 0, HERO, 289, 133};
+act2 axy_path_village_3w = {INIT_OBJXY, 0, HERO, 25, 143};
+act2 axy_path_web_3w = {INIT_OBJXY, 0, HERO, 25, 140};
+act2 axy_slope_clftop_3w = {INIT_OBJXY, 0, HERO, 280, 92};
+act2 axy_slope_stream_3w = {INIT_OBJXY, 0, HERO, 28, 133};
+act2 axy_stream_path_3w = {INIT_OBJXY, 0, HERO, 27, 140};
+act2 axy_stream_slope_3w = {INIT_OBJXY, 0, HERO, 275, 90};
+act2 axy_turn_cave_3w = {INIT_OBJXY, 0, HERO, 272, 140};
+act2 axy_turn_village_3w = {INIT_OBJXY, 0, HERO, 283, 143};
+act2 axy_village_camp_l_3w = {INIT_OBJXY, 0, HERO, 64, 130};
+act2 axy_village_camp_r_3w = {INIT_OBJXY, 0, HERO, 280, 130};
+act2 axy_village_path_3w = {INIT_OBJXY, 0, HERO, 280, 140};
+act2 axy_village_turn_3w = {INIT_OBJXY, 0, HERO, 27, 87};
+act2 axy_wbase_garden_3w = {INIT_OBJXY, 0, HERO, 272, 133};
+act2 axy_wbase_wfall_3w = {INIT_OBJXY, 0, HERO, 254, 114};
+act2 axy_web_crash_3w = {INIT_OBJXY, 0, HERO, 28, 140};
+act2 axy_web_path_3w = {INIT_OBJXY, 0, HERO, 280, 140};
+act2 axy_wfall_cave_3w = {INIT_OBJXY, 0, HERO, 27, 140};
+act2 axy_wfall_clf_3w = {INIT_OBJXY, 0, HERO, 280, 140};
+act2 axy_wfallb_wbase_3w = {INIT_OBJXY, 0, HERO, 273, 114};
+
+act5 abridge2_3w = {INIT_OBJVXY, 0, HERO, -DX, 0};
+act5 acamp4a_3w = {INIT_OBJVXY, 0, NAT2_3w, 4, 0};
+act5 acamp4b_3w = {INIT_OBJVXY, 0, NATG_3w, 3, 0};
+act5 acamp6a_3w = {INIT_OBJVXY, 33, NAT2_3w, 0, 0};
+act5 acamp7a_3w = {INIT_OBJVXY, 34, NATG_3w, 0, 0};
+act5 aclose1_3w = {INIT_OBJVXY, 0, CDOOR_3w, DX, 0};
+act5 aclose2_3w = {INIT_OBJVXY, 6, CDOOR_3w, 0, 0};
+act5 acrash17_3w = {INIT_OBJVXY, 23, PENNY_3w, -DX, 0};
+act5 acrash20_3w = {INIT_OBJVXY, 42, HERO, 0, -1};
+act5 acrash21_3w = {INIT_OBJVXY, 50, HERO, 0, 0};
+act5 acrash4_3w = {INIT_OBJVXY, 1, PENNY_3w, 0, DY};
+act5 acrash5_3w = {INIT_OBJVXY, 1, HERO, 0, DY};
+act5 acrash6_3w = {INIT_OBJVXY, 4, PENNY_3w, DX, 0};
+act5 acrash7_3w = {INIT_OBJVXY, 4, HERO, 0, 0};
+act5 adead4_3w = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 aenter4_3w = {INIT_OBJVXY, 0, MOUSE_3w, -DX, 0};
+act5 aex3_3w = {INIT_OBJVXY, 0, GHOST_3w, 0, 0};
+act5 agot12_3w = {INIT_OBJVXY, 60, DOCTOR_3w, -DX, 0};
+act5 agot2b_3w = {INIT_OBJVXY, 26, HERO, 0, 0};
+act5 agot3b_3w = {INIT_OBJVXY, 28, DOCTOR_3w, 0, -DX};
+act5 agot4_3w = {INIT_OBJVXY, 22, CDOOR_3w, -DX, 0};
+act5 agot5_3w = {INIT_OBJVXY, 36, HERO, 0, -DX};
+act5 agot7_3w = {INIT_OBJVXY, 36, CDOOR_3w, DX, 0};
+act5 agot8_3w = {INIT_OBJVXY, 42, CDOOR_3w, 0, 0};
+act5 ahelp4_3w = {INIT_OBJVXY, 0, HERO, 0, DY};
+act5 ahelp6_3w = {INIT_OBJVXY, 8, HERO, -DX * 2, 0};
+act5 ahole3a_3w = {INIT_OBJVXY, 0, MOUSE_3w, DX, 0};
+act5 ahole3b_3w = {INIT_OBJVXY, 0, MOUSE_3w, -DX, 0};
+act5 aleft3_3w = {INIT_OBJVXY, 0, HERO, -DX * 2, 0};
+act5 amission11_3w = {INIT_OBJVXY, 10, NATG_3w, 0, 0};
+act5 amission17_3w = {INIT_OBJVXY, 36, HERO, 0, 0};
+act5 amission6_3w = {INIT_OBJVXY, 0, NATG_3w, DX, -1};
+act5 amission7_3w = {INIT_OBJVXY, 0, SPIDER_3w, 0, -1};
+act5 amission8_3w = {INIT_OBJVXY, 0, HERO, -DX, 0};
+act5 amission9_3w = {INIT_OBJVXY, 6, HERO, -DX, -1};
+act5 aopen1_3w = {INIT_OBJVXY, 0, CDOOR_3w, -DX, 0};
+act5 aprod3_3w = {INIT_OBJVXY, 2, DOCTOR_3w, DX * 4, 0};
+act5 aprod8_3w = {INIT_OBJVXY, 26, DOCTOR_3w, -DX, 0};
+act5 areturn3_3w = {INIT_OBJVXY, 0, NATG_3w, 0, 0};
+act5 aright3_3w = {INIT_OBJVXY, 0, HERO, DX * 2, 0};
+act5 ascare11_3w = {INIT_OBJVXY, 18, MOUSE_3w, DX * 4, -DY};
+act5 ascare14_3w = {INIT_OBJVXY, 0, ELEPHANT_3w, -3, 0};
+act5 ascare9_3w = {INIT_OBJVXY, 0, MOUSE_3w, -DX * 4, 0};
+act5 aswing6_3w = {INIT_OBJVXY, 15, HERO, 0, 0};
+act5 aweb11_3w = {INIT_OBJVXY, 50, SPIDER_3w, 0, 1};
+act5 aweb12_3w = {INIT_OBJVXY, 75, SPIDER_3w, 0, -4};
+act5 aweb13_3w = {INIT_OBJVXY, 80, SPIDER_3w, 0, 2};
+act5 aweb14_3w = {INIT_OBJVXY, 105, SPIDER_3w, 0, 0};
+act5 aweb5_3w = {INIT_OBJVXY, 0, PENNY_3w, -DX, -1};
+act5 aweb9_3w = {INIT_OBJVXY, 40, PENNY_3w, 0, 0};
+act5 astophero_3w = {INIT_OBJVXY, 0, HERO, 0, 0};
+
+act6 acheese1_3w = {INIT_CARRY, 0, CHEESE_3w, false};
+act6 adropord3_3w = {INIT_CARRY, 0, CHEESE_3w, false};
+act6 agive6_3w = {INIT_CARRY, 0, BLOWPIPE_3w, true};
+act6 agive7_3w = {INIT_CARRY, 0, BOUILLON_3w, false};
+act6 atakecage2_3w = {INIT_CARRY, 0, CAGE_3w, true};
+act6 atakecb3_3w = {INIT_CARRY, 0, CRYSTAL_3w, false};
+act6 atakecheese3_3w = {INIT_CARRY, 0, CHEESE_3w, true};
+
+act7 adead2_3w = {INIT_HF_COORD, 0, PENNYLIE_3w};
+act7 adropord1_3w = {INIT_HF_COORD, 0, CHEESE_3w};
+act7 afind1_3w = {INIT_HF_COORD, 0, CRYSTAL_3w};
+act7 afindb2_3w = {INIT_HF_COORD, 0, BOOK_3w};
+act7 ascare5_3w = {INIT_HF_COORD, 0, MOUSE_3w};
+
+act8 acrash23_3w = {NEW_SCREEN, 50, WEB_3w};
+act8 aexit3_3w = {NEW_SCREEN, 0, CRASH_3w};
+act8 aflask6_3w = {NEW_SCREEN, 0, SUNSET_3w};
+act8 aold6i_3w = {NEW_SCREEN, 22, BRIDGE2_3w};
+act8 aplane3_3w = {NEW_SCREEN, 0, PLANE_3w};
+act8 areturn_3w = {NEW_SCREEN, 1, CAVE_3w};
+act8 ascr_brg_clftop_3w = {NEW_SCREEN, 0, CLIFFTOP_3w};
+act8 ascr_brg_path_3w = {NEW_SCREEN, 0, PATH_UL_3w};
+act8 ascr_camp_hut_3w = {NEW_SCREEN, 0, HUT_OUT_3w};
+act8 ascr_camp_village_c_3w = {NEW_SCREEN, 0, VILLAGE_3w};
+act8 ascr_camp_village_l_3w = {NEW_SCREEN, 0, VILLAGE_3w};
+act8 ascr_cave_man_3w = {NEW_SCREEN, 0, OLDMAN_3w};
+act8 ascr_cave_turn_3w = {NEW_SCREEN, 0, TURN_3w};
+act8 ascr_clf_clftop_3w = {NEW_SCREEN, 0, CLIFFTOP_3w};
+act8 ascr_clf_wfall_3w = {NEW_SCREEN, 0, WFALL_3w};
+act8 ascr_clf_wnofall_3w = {NEW_SCREEN, 0, WFALL_B_3w};
+act8 ascr_clftop_brg_3w = {NEW_SCREEN, 0, BRIDGE2_3w};
+act8 ascr_clftop_clf_3w = {NEW_SCREEN, 0, CLIFF_3w};
+act8 ascr_clftop_slope_3w = {NEW_SCREEN, 0, SLOPE_3w};
+act8 ascr_crash_web_3w = {NEW_SCREEN, 0, WEB_3w};
+act8 ascr_garden_wbase_3w = {NEW_SCREEN, 0, WBASE_3w};
+act8 ascr_hut_camp_3w = {NEW_SCREEN, 0, CAMP_3w};
+act8 ascr_hut_in_3w = {NEW_SCREEN, 0, HUT_IN_3w};
+act8 ascr_hut_out_3w = {NEW_SCREEN, 0, HUT_OUT_3w};
+act8 ascr_hut_village_c_3w = {NEW_SCREEN, 0, VILLAGE_3w};
+act8 ascr_hut_village_r_3w = {NEW_SCREEN, 0, VILLAGE_3w};
+act8 ascr_path_brg1_3w = {NEW_SCREEN, 0, BRIDGE_3w};
+act8 ascr_path_brg2_3w = {NEW_SCREEN, 0, BRIDGE2_3w};
+act8 ascr_path_village_3w = {NEW_SCREEN, 0, VILLAGE_3w};
+act8 ascr_path_web_3w = {NEW_SCREEN, 0, WEB_3w};
+act8 ascr_slope_clftop_3w = {NEW_SCREEN, 0, CLIFFTOP_3w};
+act8 ascr_slope_stream1_3w = {NEW_SCREEN, 0, STREAM_3w};
+act8 ascr_slope_stream2_3w = {NEW_SCREEN, 0, STREAM2_3w};
+act8 ascr_stream_path_3w = {NEW_SCREEN, 0, PATH_3w};
+act8 ascr_stream_slope_3w = {NEW_SCREEN, 0, SLOPE_3w};
+act8 ascr_turn_cave_3w = {NEW_SCREEN, 0, CAVE_3w};
+act8 ascr_turn_village_3w = {NEW_SCREEN, 0, VILLAGE_3w};
+act8 ascr_village_camp_l_3w = {NEW_SCREEN, 0, CAMP_3w};
+act8 ascr_village_camp_r_3w = {NEW_SCREEN, 0, CAMP_3w};
+act8 ascr_village_path_3w = {NEW_SCREEN, 0, PATH_3w};
+act8 ascr_village_turn_3w = {NEW_SCREEN, 0, TURN_3w};
+act8 ascr_wbase_garden_3w = {NEW_SCREEN, 0, GARDEN_3w};
+act8 ascr_wbase_wfall_3w = {NEW_SCREEN, 0, WFALL_3w};
+act8 ascr_web_crash_3w = {NEW_SCREEN, 0, CRASH_3w};
+act8 ascr_web_path_3w = {NEW_SCREEN, 0, PATH_UL_3w};
+act8 ascr_wfall_cave_3w = {NEW_SCREEN, 0, CAVE_3w};
+act8 ascr_wfall_clf_3w = {NEW_SCREEN, 0, CLIFF_3w};
+act8 ascr_wfallb_wbase_3w = {NEW_SCREEN, 0, WBASE_3w};
+act8 aweb23_3w = {NEW_SCREEN, 117, CRASH_3w};
+
+act9 abrg_msg2_3w = {INIT_OBJSTATE, 0, VINE_3w, 1};
+act9 acageempty_3w = {INIT_OBJSTATE, 0, CAGE_3w, 0};
+act9 acamp0a_3w = {INIT_OBJSTATE, 4, NAT2_3w, 0};
+act9 acom0b_3w = {INIT_OBJSTATE, 0, NAT1_3w, 1};
+act9 acom1b_3w = {INIT_OBJSTATE, 0, NAT1_3w, 2};
+act9 acom2b_3w = {INIT_OBJSTATE, 0, NAT1_3w, 3};
+act9 acom3b_3w = {INIT_OBJSTATE, 0, NAT1_3w, 4};
+act9 acom4b_3w = {INIT_OBJSTATE, 0, NAT1_3w, 5};
+act9 acom5b_3w = {INIT_OBJSTATE, 0, NAT1_3w, 6};
+act9 acom6b_3w = {INIT_OBJSTATE, 0, NAT1_3w, 7};
+act9 acom7b_3w = {INIT_OBJSTATE, 0, NAT1_3w, 8};
+act9 acom8b_3w = {INIT_OBJSTATE, 0, NAT1_3w, 9};
+act9 adart1_3w = {INIT_OBJSTATE, 0, BLOWPIPE_3w, 1};
+act9 adn_3w = {INIT_OBJSTATE, 0, HERO, 0};
+act9 adrink_3w = {INIT_OBJSTATE, 0, FLASK_3w, 0};
+act9 adropcheese3_3w = {INIT_OBJSTATE, 0, CHEESE_3w, 1};
+act9 aelewoken_3w = {INIT_OBJSTATE, 0, ELEPHANT_3w, 0};
+act9 aemptyflask_3w = {INIT_OBJSTATE, 0, FLASK_3w, 0};
+act9 aendaction_3w = {INIT_OBJSTATE, DARTTIME + 30, E_EYES_3w, 0};
+act9 aenter1_3w = {INIT_OBJSTATE, 0, MOUSE_3w, 2};
+act9 aenter9_3w = {INIT_OBJSTATE, 0, CAGE_3w, 1};
+act9 aex7_3w = {INIT_OBJSTATE, 0, GHOST_3w, 1};
+act9 aex9_3w = {INIT_OBJSTATE, 0, VINE3_3w, 1};
+act9 afillmagic3_3w = {INIT_OBJSTATE, 0, FLASK_3w, 2};
+act9 afillord2_3w = {INIT_OBJSTATE, 0, FLASK_3w, 1};
+act9 afindb1_3w = {INIT_OBJSTATE, 0, BOOK_3w, 1};
+act9 agive3_3w = {INIT_OBJSTATE, 0, NAT1_3w, 10};
+act9 agot1_3w = {INIT_OBJSTATE, 0, DOCTOR_3w, 1};
+act9 ahelp2_3w = {INIT_OBJSTATE, 0, HERO, 1};
+act9 ahole5a_3w = {INIT_OBJSTATE, 0, MOUSE_3w, 1};
+act9 ahole5b_3w = {INIT_OBJSTATE, 0, MOUSE_3w, 0};
+act9 amakeclay2_3w = {INIT_OBJSTATE, 0, CLAY_3w, 1};
+act9 amission1_3w = {INIT_OBJSTATE, 0, PENNY_3w, 2};
+act9 amousefree_3w = {INIT_OBJSTATE, 0, MOUSE_3w, 3};
+act9 aoldstate_3w = {INIT_OBJSTATE, 0, MOUTH_3w, 1};
+act9 aopen2_3w = {INIT_OBJSTATE, 0, CDOOR_3w, 1};
+act9 apause0_3w = {INIT_OBJSTATE, 3 * NORMAL_TPS, NAT2_3w, 0};
+act9 apause1_3w = {INIT_OBJSTATE, 0, NAT2_3w, 1};
+act9 astartaction_3w = {INIT_OBJSTATE, 0, E_EYES_3w, 1};
+act9 astick3_3w = {INIT_OBJSTATE, 0, DOCTOR_3w, 2};
+act9 atakecheese1_3w = {INIT_OBJSTATE, 0, CHEESE_3w, 0};
+act9 aup_3w = {INIT_OBJSTATE, 0, HERO, 1};
+act9 avine7_3w = {INIT_OBJSTATE, 0, BLOCK1_3w, 1};
+act9 aweb1_3w = {INIT_OBJSTATE, 0, PENNY_3w, 1};
+
+act10 acamp1a_3w = {INIT_PATH, 0, NAT2_3w, AUTO, 0, 0};
+act10 acamp1b_3w = {INIT_PATH, 0, NATG_3w, AUTO, 0, 0};
+act10 acamp9a_3w = {INIT_PATH, 60, NATG_3w, CHASE, DX / 2, DY / 2};
+act10 acamp9b_3w = {INIT_PATH, 55, NAT2_3w, WANDER, DX, 2};
+act10 achase1_3w = {INIT_PATH, 0, NATG_3w, AUTO, 0, 0};
+act10 achase2_3w = {INIT_PATH, 8, NATG_3w, CHASE, DX / 2, DY / 2};
+act10 adoc2_3w = {INIT_PATH, 0, DOCTOR_3w, CHASE, DX, DY};
+act10 aenter3_3w = {INIT_PATH, 0, MOUSE_3w, AUTO, 0, 0};
+act10 aex2_3w = {INIT_PATH, 0, GHOST_3w, AUTO, 0, 0};
+act10 agot6_3w = {INIT_PATH, 40, HERO, USER, 0, 0};
+act10 ahole1_3w = {INIT_PATH, 0, MOUSE_3w, AUTO, 0, 0};
+act10 ahole6_3w = {INIT_PATH, 30, MOUSE_3w, WANDER2, DX, 0};
+act10 aold6h_3w = {INIT_PATH, 22, HERO, USER, 0, 0};
+act10 areturn1_3w = {INIT_PATH, 0, NATG_3w, AUTO, 0, 0};
+act10 ascare12_3w = {INIT_PATH, 34, MOUSE_3w, WANDER2, DX * 4, DY};
+act10 ascare7_3w = {INIT_PATH, 0, MOUSE_3w, AUTO, 0, 0};
+act10 aswing5_3w = {INIT_PATH, 20, HERO, USER, 0, 0};
+act10 adisable_3w = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 aenable_3w = {INIT_PATH, 0, HERO, USER, 0, 0};
+act10 aquiet_3w = {INIT_PATH, 0, HERO, QUIET, 0, 0};
+
+act11 aactiontest1_3w = {COND_R, 0, E_EYES_3w, 1, 0, kALoktoleave1_3w};
+act11 aactiontest2_3w = {COND_R, 0, E_EYES_3w, 1, 0, kALoktoleave2_3w};
+act11 ablktest_3w = {COND_R, 0, BLOCK1_3w, 0, kALblk1_3w, 0};
+act11 abrgmsgtest_3w = {COND_R, 0, VINE_3w, 0, kALbrg_clftop_msg_3w, kALbrg_clftop1_3w};
+act11 abrgtest_3w = {COND_R, 0, VINE_3w, 0, kALbrg_ok_3w, kALbrg_down_3w};
+act11 abridgetest_3w = {COND_R, 0, BLOCK1_3w, 0, kALbridge_3w, 0};
+act11 acagetest_3w = {COND_R, 0, MOUSE_3w, 2, 0, kALpostest_3w};
+act11 acagetest1_3w = {COND_R, 0, MOUSE_3w, 2, kALcagetest2_3w, kALok_3w};
+act11 acagetest5_3w = {COND_R, 0, MOUSE_3w, 2, kALcageprompt_3w, kALmousegone_3w};
+act11 acamptest_3w = {COND_R, 0, NAT1_3w, 0, kALcampers_3w, kALchase_3w};
+act11 acavetest_3w = {COND_R, 0, GHOST_3w, 0, kALspirit_3w, kALcave_man_3w};
+act11 acrashtest1_3w = {COND_R, 0, PENNY_3w, 0, kALcrashed_3w, kALcrashtest2_3w};
+act11 acrashtest2_3w = {COND_R, 0, PENNY_3w, 1, kALcryhelp_3w, 0};
+act11 adartedtest_3w = {COND_R, 0, BLOWPIPE_3w, 0, kALdodart_3w, kALdarted_3w};
+act11 adoctest_3w = {COND_R, 0, DOCTOR_3w, 0, kALdoc_3w, 0};
+act11 adrinktest_3w = {COND_R, 0, FLASK_3w, 0, kALdrinkno_3w, kALdrinkyes_3w};
+act11 aeletest1_3w = {COND_R, 0, ELEPHANT_3w, 1, kALele_sleep_3w, kALeletest2_3w};
+act11 aeletest2_3w = {COND_R, 0, ELEPHANT_3w, 0, kALeleblink_3w, 0};
+act11 aemptytest1_3w = {COND_R, 0, FLASK_3w, 2, kALemptymagic_3w, kALemptytest2_3w};
+act11 aemptytest2_3w = {COND_R, 0, FLASK_3w, 1, kALemptyord_3w, kALdrinkno_3w};
+act11 aentertest1_3w = {COND_R, 0, CHEESE_3w, 1, kALentertest2_3w, 0};
+act11 aentertest2_3w = {COND_R, 0, MOUSE_3w, 0, kALentertest3_3w, 0};
+act11 aexotest1_3w = {COND_R, 0, GHOST_3w, 0, kALexotest2_3w, kALexordone_3w};
+act11 afindbtest_3w = {COND_R, 0, BOOK_3w, 0, kALfindit_3w, 0};
+act11 aflasktest2_3w = {COND_R, 0, FLASK_3w, 2, kALremedy_3w, kALflasktest3_3w};
+act11 aflasktest3_3w = {COND_R, 0, FLASK_3w, 1, kALnoremedy_3w, kALrefuseflask_3w};
+act11 agettest2_3w = {COND_R, 0, DOCTOR_3w, 0, kALgot_3w, 0};
+act11 agivetest_3w = {COND_R, 0, NAT1_3w, 10, kALrefuse_3w, kALgive_3w};
+act11 ahoriz1_3w = {COND_R, 0, HERO, 0, kALup_3w, 0};
+act11 ahoriz2_3w = {COND_R, 0, HERO, 1, kALdn_3w, 0};
+act11 anat0_3w = {COND_R, 0, NAT1_3w, 0, kALcom0_3w, kALnat1_3w};
+act11 anat1_3w = {COND_R, 0, NAT1_3w, 1, kALcom1_3w, kALnat2_3w};
+act11 anat2_3w = {COND_R, 0, NAT1_3w, 2, kALcom2_3w, kALnat3_3w};
+act11 anat3_3w = {COND_R, 0, NAT1_3w, 3, kALcom3_3w, kALnat4_3w};
+act11 anat4_3w = {COND_R, 0, NAT1_3w, 4, kALcom4_3w, kALnat5_3w};
+act11 anat5_3w = {COND_R, 0, NAT1_3w, 5, kALcom5_3w, kALnat6_3w};
+act11 anat6_3w = {COND_R, 0, NAT1_3w, 6, kALcom6_3w, kALnat7_3w};
+act11 anat7_3w = {COND_R, 0, NAT1_3w, 7, kALcom7_3w, kALnat8_3w};
+act11 anat8_3w = {COND_R, 0, NAT1_3w, 8, kALcom8_3w, 0};
+act11 aold5_3w = {COND_R, 0, FLASK_3w, 2, kALold6_3w, kALwrong_3w};
+act11 aoldmantest_3w = {COND_R, 0, MOUTH_3w, 0, kALoldfirst_3w, kALoldsubseq_3w};
+act11 aopentest_3w = {COND_R, 0, DOCTOR_3w, 1, kALprod_3w, kALopencdoor_3w};
+act11 apausetest_3w = {COND_R, 0, NAT2_3w, 1, 0, kALcomment_3w};
+act11 apostest_3w = {COND_R, 0, MOUSE_3w, 0, kALmousel_3w, kALmouser_3w};
+act11 aspirittest_3w = {COND_R, 0, GHOST_3w, 0, kALwarn_3w, 0};
+act11 asticktest1_3w = {COND_R, 0, DOCTOR_3w, 2, kALstuckpin_3w, kALsticktest2_3w};
+act11 asticktest2_3w = {COND_R, 0, CLAY_3w, 1, kALstickpin_3w, kALnostickpin_3w};
+act11 ataketest1_3w = {COND_R, 0, MOUSE_3w, 2, kALtakeit_3w, kALcanttake_3w};
+act11 ataketest2_3w = {COND_R, 0, MOUSE_3w, 3, kALtakeit_3w, kALtaketest1_3w};
+act11 atalktest1_3w = {COND_R, 0, NAT1_3w, 9, kALnat9_3w, kALnative_3w};
+act11 atdtest_3w = {COND_R, 0, DOCTOR_3w, 2, kALtalkdoc2_3w, kALtalkdoc1_3w};
+act11 atiptest_3w = {COND_R, 60 * NORMAL_TPS, BLOCK1_3w, 0, kALbtipprompt_3w, 0};
+act11 auntietest_3w = {COND_R, 0, BLOCK1_3w, 0, kALnottied_3w, kALuntie_3w};
+act11 avinetest_3w = {COND_R, 0, BLOCK1_3w, 0, kALtievine_3w, kALtied_3w};
+act11 awebtest1_3w = {COND_R, 0, PENNY_3w, 0, kALspider_3w, kALwebtest2_3w};
+act11 awebtest2_3w = {COND_R, 0, PENNY_3w, 1, kALmission_3w, kALreturn_3w};
+
+act12 ablk1_3w = {TEXT, 0, kSTBlk1_3w};
+act12 abook1_3w = {TEXT, 0, kSTBook1_3w};
+act12 abtip_3w = {TEXT, 0, kSTBridgetip_3w};
+act12 acanttake_3w = {TEXT, 0, kSTCanttake_3w};
+act12 acheese2_3w = {TEXT, 0, kSTYummy_3w};
+act12 acubestip_3w = {TEXT, 0, kSTCubestip_3w};
+act12 adammedtip_3w = {TEXT, 0, kSTDammedtip_3w};
+act12 adart0_3w = {TEXT, 0, kSTDartElephant_3w};
+act12 adarted_3w = {TEXT, 0, kSTDarted_3w};
+act12 adrinkno_3w = {TEXT, 0, kSTDrinkno_3w};
+act12 adrinkyes_3w = {TEXT, 0, kSTDrinkyes_3w};
+act12 adropcheese4_3w = {TEXT, 0, kSTDropCheese_3w};
+act12 aemptymagic_3w = {TEXT, 0, kSTEmptymagic_3w};
+act12 aemptyord_3w = {TEXT, 0, kSTEmptyord_3w};
+act12 aex5_3w = {TEXT, 0, kSTExor1_3w};
+act12 aex6_3w = {TEXT, 0, kSTExor2_3w};
+act12 aexordone_3w = {TEXT, 0, kSTExordone_3w};
+act12 afillmagic2_3w = {TEXT, 0, kSTFillmagic_3w};
+act12 afillord1_3w = {TEXT, 0, kSTFillord_3w};
+act12 afindb4_3w = {TEXT, 2, kSTFoundbook_3w};
+act12 ago1_3w = {TEXT, 0, kSTMousefree_3w};
+act12 alookfall_3w = {TEXT, 0, kSTLookwfall1_3w};
+act12 alooknofall_3w = {TEXT, 0, kSTLookwfall2_3w};
+act12 amagictip_3w = {TEXT, 0, kSTMagictip_3w};
+act12 amakeclay3_3w = {TEXT, 0, kSTMakeeffigy_3w};
+act12 amodeltip_3w = {TEXT, 0, kSTModeltip_3w};
+act12 amousegone_3w = {TEXT, 0, kSTMousegone_3w};
+act12 amousetip_3w = {TEXT, 0, kSTMousetip_3w};
+act12 anoblow_3w = {TEXT, 0, kSTNoblow_3w};
+act12 anoclay_3w = {TEXT, 0, kSTNoclay_3w};
+act12 anofill_3w = {TEXT, 0, kSTNofill_3w};
+act12 anomake_3w = {TEXT, 0, kSTNomake_3w};
+act12 anoremedy1_3w = {TEXT, 0, kSTNoremedy_3w};
+act12 anospell_3w = {TEXT, 0, kSTNospell_3w};
+act12 anostick_3w = {TEXT, 0, kSTNostick_3w};
+act12 anostickpin_3w = {TEXT, 0, kSTNostickpin_3w};
+act12 anotakecb_3w = {TEXT, 0, kSTOldmannotake_3w};
+act12 anotip_3w = {TEXT, 0, kSTNotip_3w};
+act12 anottied_3w = {TEXT, 0, kSTNottied_3w};
+act12 aold7_3w = {TEXT, 0, kSTAllwrong_3w};
+act12 aoldmantip_3w = {TEXT, 0, kSTOldmantip_3w};
+act12 aplanetip_3w = {TEXT, 0, kSTPlanetip_3w};
+act12 aputitdown_3w = {TEXT, 0, kSTPutitdown_3w};
+act12 arefuse_3w = {TEXT, 0, kSTRefuse_3w};
+act12 arefuseflask_3w = {TEXT, 0, kSTRefuseflask_3w};
+act12 aremedytip_3w = {TEXT, 0, kSTRemedytip_3w};
+act12 arub_3w = {TEXT, 0, kSTRubcrystal_3w};
+act12 asteps1_3w = {TEXT, 0, kSTStep1_3w};
+act12 astick2_3w = {TEXT, 0, kSTStickpin_3w};
+act12 asticktip_3w = {TEXT, 0, kSTSticktip_3w};
+act12 astuckpin_3w = {TEXT, 0, kSTStuckpin_3w};
+act12 aswingtip_3w = {TEXT, 0, kSTSwingtip_3w};
+act12 atakecb2_3w = {TEXT, 0, kSTOldmantakeball_3w};
+act12 atalkdoc1_3w = {TEXT, 0, kSTTalkdoc_3w};
+act12 atalkdoc2_3w = {TEXT, 0, kSTTalkdoc2_3w};
+act12 atalkdoc3_3w = {TEXT, 0, kSTTalkdoc3_3w};
+act12 atalkweb_3w = {TEXT, 0, kSTTalkweb_3w};
+act12 athing_3w = {TEXT, 0, kSTVillagething_3w};
+act12 atied_3w = {TEXT, 0, kSTTiedvine_3w};
+act12 auntie_3w = {TEXT, 0, kSTUntievine_3w};
+act12 avine6_3w = {TEXT, 0, kSTBlk2_3w};
+act12 awarn_3w = {TEXT, 0, kSTCavewarn_3w};
+act12 awaterfalling_3w = {TEXT, 0, kSTWaterfalling_3w};
+act12 awrong1_3w = {TEXT, 0, kSTWrong_3w};
+act12 aclick_3w = {TEXT, 0, kSTClick_3w};
+act12 aempty_3w = {TEXT, 0, kSTEmpty1_3w};
+act12 agotit_3w = {TEXT, 0, kSTGotit_3w};
+act12 anocarry_3w = {TEXT, 0, kSTNocarry_3w};
+act12 anopurps_3w = {TEXT, 0, kSTNopurps_3w};
+act12 anothanks_3w = {TEXT, 0, kSTNothanks_3w};
+act12 aok_3w = {TEXT, 0, kSTOkgen_3w};
+act12 astalk_3w = {TEXT, 0, kSTStalk_3w};
+
+act13 acrash1_3w = {SWAP_IMAGES, 0, HERO, HERO_OLD_3w};
+act13 aswing2_3w = {SWAP_IMAGES, 2, HERO, SWINGER_3w};
+act13 aswing7_3w = {SWAP_IMAGES, 15, HERO, SWINGER_3w};
+act13 aweb24_3w = {SWAP_IMAGES, 0, HERO, HERO_OLD_3w};
+act13 aweb25_3w = {SWAP_IMAGES, 0, HERO, WHERO_3w};
+act13 aweehero_3w = {SWAP_IMAGES, 0, HERO, WHERO_3w};
+
+act14 acagetest3_3w = {COND_SCR, 0, CAGE_3w, PATH_3w, kALcagetest4_3w, kALmousego_3w};
+act14 adocscrtest_3w = {COND_SCR, 0, HERO, HUT_IN_3w, kALtdtest_3w, kALtalkdoc3_3w};
+act14 adroptest1_3w = {COND_SCR, 0, HERO, HUT_IN_3w, kALdropincage_3w, kALnocarry_3w};
+act14 aexotest2_3w = {COND_SCR, 0, HERO, CAVE_3w, kALexor_3w, kALnospell_3w};
+act14 afilltest1_3w = {COND_SCR, 0, HERO, GARDEN_3w, kALfillmagic_3w, kALfilltest2_3w};
+act14 afilltest2_3w = {COND_SCR, 0, HERO, STREAM_3w, kALfillord_3w, kALfilltest3_3w};
+act14 afilltest3_3w = {COND_SCR, 0, HERO, WFALL_3w, kALfillord_3w, kALnofill_3w};
+act14 aflasktest1_3w = {COND_SCR, 0, HERO, WEB_3w, kALflasktest2_3w, kAL_nothanks_3w};
+act14 agettest1_3w = {COND_SCR, 0, DOCTOR_3w, HUT_IN_3w, kALgettest2_3w, 0};
+act14 agivetest1_3w = {COND_SCR, 0, HERO, CAMP_3w, kALgivetest_3w, kALnothanks_3w};
+act14 amaketest_3w = {COND_SCR, 0, HERO, HUT_IN_3w, kALmakeit_3w, kALnomake_3w};
+act14 apath2test_3w = {COND_SCR, 0, HERO, PATH_3w, kALdartedtest_3w, kALnoblow_3w};
+act14 atalktest2_3w = {COND_SCR, 0, HERO, CAMP_3w, kALtalktest1_3w, kALstalk_3w};
+act14 atalktest3_3w = {COND_SCR, 0, HERO, WEB_3w, kALtalkweb_3w, kALtalktest2_3w};
+
+act15 agot2_3w = {AUTOPILOT, 3, HERO, CDOOR_3w, DX, DY};
+act15 agot2a_3w = {AUTOPILOT, 22, HERO, CDOOR_3w, DX, DY};
+act15 agot3_3w = {AUTOPILOT, 0, DOCTOR_3w, CDOOR_3w, DX, DY};
+act15 agot3a_3w = {AUTOPILOT, 20, DOCTOR_3w, CDOOR_3w, DX, DY};
+
+act16 abridge1_3w = {INIT_OBJ_SEQ, 0, HERO, LEFT};
+act16 acamp5a_3w = {INIT_OBJ_SEQ, 1, NAT2_3w, RIGHT};
+act16 acamp5b_3w = {INIT_OBJ_SEQ, 1, NATG_3w, RIGHT};
+act16 acamp6b_3w = {INIT_OBJ_SEQ, 36, NAT2_3w, DOWN};
+act16 acamp7b_3w = {INIT_OBJ_SEQ, 40, NATG_3w, 2};
+act16 acrash10_3w = {INIT_OBJ_SEQ, 8, HERO, LEFT};
+act16 acrash15_3w = {INIT_OBJ_SEQ, 21, PENNY_3w, DOWN};
+act16 acrash16_3w = {INIT_OBJ_SEQ, 22, PENNY_3w, LEFT};
+act16 acrash18_3w = {INIT_OBJ_SEQ, 40, HERO, _UP};
+act16 acrash2_3w = {INIT_OBJ_SEQ, 1, PENNY_3w, DOWN};
+act16 acrash3_3w = {INIT_OBJ_SEQ, 1, HERO, DOWN};
+act16 acrash8_3w = {INIT_OBJ_SEQ, 4, PENNY_3w, RIGHT};
+act16 adart6_3w = {INIT_OBJ_SEQ, DARTTIME - 1, E_EYES_3w, 1};
+act16 adoc1_3w = {INIT_OBJ_SEQ, 0, HERO, _UP};
+act16 aeleblink1_3w = {INIT_OBJ_SEQ, 41, E_EYES_3w, 1};
+act16 aeleblink2_3w = {INIT_OBJ_SEQ, 42, E_EYES_3w, 0};
+act16 aeleblink3_3w = {INIT_OBJ_SEQ, 43, E_EYES_3w, 1};
+act16 aeleblink4_3w = {INIT_OBJ_SEQ, 44, E_EYES_3w, 0};
+act16 aenter7_3w = {INIT_OBJ_SEQ, 4, CAGE_3w, 1};
+act16 agot11_3w = {INIT_OBJ_SEQ, 58, DOCTOR_3w, LEFT};
+act16 ahelp5_3w = {INIT_OBJ_SEQ, 8, HERO, LEFT};
+act16 ahole2a_3w = {INIT_OBJ_SEQ, 0, MOUSE_3w, 0};
+act16 ahole2b_3w = {INIT_OBJ_SEQ, 0, MOUSE_3w, 1};
+act16 aleft1_3w = {INIT_OBJ_SEQ, 0, HERO, LEFT};
+act16 amission13_3w = {INIT_OBJ_SEQ, 10, NATG_3w, DOWN};
+act16 amission19_3w = {INIT_OBJ_SEQ, 48, NATG_3w, RIGHT};
+act16 aprod2_3w = {INIT_OBJ_SEQ, 1, DOCTOR_3w, RIGHT};
+act16 aprod7_3w = {INIT_OBJ_SEQ, 25, DOCTOR_3w, LEFT};
+act16 aright1_3w = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 ascare10_3w = {INIT_OBJ_SEQ, 18, MOUSE_3w, 0};
+act16 ascare2_3w = {INIT_OBJ_SEQ, 0, CAGE_3w, 0};
+act16 ascare3_3w = {INIT_OBJ_SEQ, 0, ELEPHANT_3w, 1};
+act16 ascare8_3w = {INIT_OBJ_SEQ, 0, MOUSE_3w, 1};
+act16 aweb16_3w = {INIT_OBJ_SEQ, 105, PENNY_3w, RIGHT};
+act16 aweb27_3w = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 aweb8_3w = {INIT_OBJ_SEQ, 41, PENNY_3w, DOWN};
+
+act17 adart3_3w = {SET_STATE_BITS, DARTTIME, ELEPHANT_3w, 1};
+act17 ascare1_3w = {SET_STATE_BITS, 0, ELEPHANT_3w, 2};
+
+act19 abittest_3w = {TEST_STATE_BITS, 0, ELEPHANT_3w, 1, kALsleepy_3w, kALscared_3w};
+act19 acagetest4_3w = {TEST_STATE_BITS, 0, ELEPHANT_3w, 1, kALasleep_3w, kALscare_3w};
+act19 adarttest1_3w = {TEST_STATE_BITS, DARTTIME, ELEPHANT_3w, 3, kALdammed_3w, kALbittest_3w};
+act19 alookwfalltest_3w = {TEST_STATE_BITS, 0, ELEPHANT_3w, 3, kALlooknofall_3w, kALlookfall_3w};
+act19 astreamtest_3w = {TEST_STATE_BITS, 0, ELEPHANT_3w, 3, kALstream2_3w, kALstream1_3w};
+act19 awfalltest_3w = {TEST_STATE_BITS, 0, ELEPHANT_3w, 3, kALwaternofall_3w, kALwaterfall_3w};
+
+act20 adart4_3w = {DEL_EVENTS, DARTTIME, ASCHEDULE};
+act20 adart5_3w = {DEL_EVENTS, DARTTIME, INIT_OBJ_SEQ};
+act20 aold6e_3w = {DEL_EVENTS, 0, ASCHEDULE};
+act20 aridtest_3w = {DEL_EVENTS, 0, TEST_STATE_BITS};
+
+act21 adead5_3w = {GAMEOVER, 0};
+
+act23 asunset4_3w = {EXIT, 80};
+
+act24 adammed1_3w = {BONUS, 0, 11};
+act24 adart2_3w = {BONUS, DARTTIME, 10};
+act24 adropcheese1_3w = {BONUS, 0, 6};
+act24 aenter0_3w = {BONUS, 0, 7};
+act24 aex1_3w = {BONUS, 0, 15};
+act24 afillmagic1_3w = {BONUS, 0, 8};
+act24 aflask1_3w = {BONUS, 0, 1};
+act24 agive2_3w = {BONUS, 0, 14};
+act24 amakeclay1_3w = {BONUS, 0, 4};
+act24 aold6b_3w = {BONUS, 0, 12};
+act24 ascarebonus_3w = {BONUS, 0, 9};
+act24 astick1_3w = {BONUS, 0, 5};
+act24 aswing0_3w = {BONUS, 0, 3};
+act24 atakecb1_3w = {BONUS, 0, 16};
+act24 atakencheese_3w = {BONUS, 0, 13};
+act24 avine1_3w = {BONUS, 0, 2};
+
+act25 aentertest3_3w = {COND_BOX, 1, MOUSE_3w, 156, 133, 163, 148, kALtrapped_3w, 0};
+act25 ahorizpos_3w = {COND_BOX, 0, HERO, 0, 0, 320, 151, kALhorizup_3w, kALhorizdn_3w};
+act25 amousel_3w = {COND_BOX, 0, HERO, 0, 0, 254, 199, kALholel_3w, 0};
+act25 amouser_3w = {COND_BOX, 0, HERO, 255, 0, 319, 199, kALholer_3w, 0};
+act25 aswing4_3w = {COND_BOX, 1, HERO, 0, 0, 160, 200, kALright_3w, kALleft_3w};
+
+act26 aexplode_3w = {SOUND, 0, BOOM_3w};
+act26 afinale_3w = {SOUND, 0, T_TRACK1};
+act26 aweb17a_3w = {SOUND, 108, SCREAM_3w};
+act26 aballsong_3w = {SOUND, 0, MAGIC_3w};
+act26 aentersnd_3w = {SOUND, 0, SQUEAK_3w};
+act26 aex5a_3w = {SOUND, 0, WHOOSH_3w};
+act26 afillsong_3w = {SOUND, 0, MAGIC_3w};
+act26 ahey_3w = {SOUND, 0, HEY_3w};
+act26 anelesong_3w = {SOUND, 5, NELLIE_3w};
+act26 aoldsnd_3w = {SOUND, 20, WHOOSH_3w};
+act26 aprodsong_3w = {SOUND, 20, POINK_3w};
+act26 aspidersong_3w = {SOUND, 105, CHOMP_3w};
+act26 asticksong_3w = {SOUND, 0, ARGH_3w};
+act26 aswingsong_3w = {SOUND, 0, YODEL_3w};
+act26 atiesong_3w = {SOUND, 0, MAGIC_3w};
+
+act27 aaddcheese_3w = {ADD_SCORE, 0, CHEESE_3w};
+act27 agive1_3w = {ADD_SCORE, 0, BLOWPIPE_3w};
+act27 atakecage3_3w = {ADD_SCORE, 0, CAGE_3w};
+
+act28 asubcheese_3w = {SUB_SCORE, 0, CHEESE_3w};
+
+act29 acagetest2_3w = {COND_CARRY, 0, CAGE_3w, kALputitdown_3w, kALcagetest3_3w};
+act29 acbtest_3w = {COND_CARRY, 0, CRYSTAL_3w, kALtakecb_3w, kALnotakecb_3w};
+act29 adroptest3_3w = {COND_CARRY, 0, CHEESE_3w, kALdroptest2_3w, kALnocarry_3w};
+act29 aold4_3w = {COND_CARRY, 0, FLASK_3w, kALold5_3w, kALwrong_3w};
+act29 areadtest1_3w = {COND_CARRY, 0, BELL_3w, kALreadtest2_3w, kALreadord_3w};
+act29 areadtest2_3w = {COND_CARRY, 0, CANDLE_3w, kALexorcise_3w, kALreadord_3w};
+act29 asticktest4_3w = {COND_CARRY, 0, CLAY_3w, kALsticktest1_3w, kALnoclay_3w};
+act29 atakechstest_3w = {COND_CARRY, 0, CHEESE_3w, 0, kALtakechs_3w};
+act29 ataketest3_3w = {COND_CARRY, 0, CAGE_3w, 0, kALtaketest2_3w};
+
+act33 acamp0c_3w = {INIT_SCREEN, 0, NATG_3w, CAMP_3w};
+act33 adoc3_3w = {INIT_SCREEN, 0, DOCTOR_3w, HUT_IN_3w};
+act33 amission2_3w = {INIT_SCREEN, 0, NATG_3w, WEB_3w};
+act33 areturn5_3w = {INIT_SCREEN, 0, NATG_3w, WEB_3w};
+act33 aweb3_3w = {INIT_SCREEN, 0, PENNY_3w, WEB_3w};
+
+act35 amap1_3w = {REMAPPAL, 0, _TLIGHTMAGENTA, _TBLACK};
+act35 amap4a_3w = {REMAPPAL, 0, _TGRAY, _TBLACK};
+act35 amap4b_3w = {REMAPPAL, 1, _TGRAY, _TGRAY};
+act35 amap4c_3w = {REMAPPAL, 2, _TGRAY, _TBLACK};
+act35 amap4d_3w = {REMAPPAL, 3, _TGRAY, _TGRAY};
+
+act36 adroptest2_3w = {COND_NOUN, 0, kNCage_3w, kALcagetest_3w, kALdropord_3w};
+act36 asticktest3_3w = {COND_NOUN, 0, kNClay_3w, kALsticktest4_3w, kALnostick_3w};
+
+act37 aex8_3w = {SCREEN_STATE, 0, CAVE_3w, 1};
+act37 ascare17_3w = {SCREEN_STATE, 64, PATH_3w, 1};
+act37 astick7_3w = {SCREEN_STATE, 17, HUT_IN_3w, 1};
+
+act38 amission14_3w = {INIT_LIPS, 20, LIPS_3w, NATG_3w, 4, LIPDY + 1};
+act38 aweb18_3w = {INIT_LIPS, 108, LIPS_3w, PENNY_3w, LIPDX, LIPDY};
+act38 alips_3w = {INIT_LIPS, 0, LIPS_3w, PENNY_3w, LIPDX, LIPDY};
+
+act39 amission23_3w = {INIT_STORY_MODE, 50, false};
+act39 astory_mode_3w = {INIT_STORY_MODE, 0, true};
+
+// All the act40 were defined as act12 with a type set to WARN
+act40 aasleep_3w = {WARN, 30, kSTAsleep_3w};
+act40 abrg_msg1_3w = {WARN, 0, kSTBridgedown_3w};
+act40 acom0a_3w = {WARN, 0, kSTCom0_3w};
+act40 acom1a_3w = {WARN, 0, kSTCom1_3w};
+act40 acom2a_3w = {WARN, 0, kSTCom2_3w};
+act40 acom3a_3w = {WARN, 0, kSTCom3_3w};
+act40 acom4a_3w = {WARN, 0, kSTCom4_3w};
+act40 acom5a_3w = {WARN, 0, kSTCom5_3w};
+act40 acom6a_3w = {WARN, 0, kSTCom6_3w};
+act40 acom7a_3w = {WARN, 0, kSTCom7_3w};
+act40 acom8a_3w = {WARN, 0, kSTCom8_3w};
+act40 acom9_3w = {WARN, 0, kSTCom9_3w};
+act40 acrash11_3w = {WARN, 20, kSTPenny1_3w};
+act40 acrash12_3w = {WARN, 20, kSTPenny2_3w};
+act40 acrash13_3w = {WARN, 34, kSTPenny3_3w};
+act40 adammed2_3w = {WARN, 0, kSTDammed_3w};
+act40 aelewaking_3w = {WARN, 0, kSTElewaking_3w};
+act40 aenter2_3w = {WARN, 0, kSTMouse1_3w};
+act40 aflask2_3w = {WARN, 0, kSTEnd1_3w};
+act40 aflask3_3w = {WARN, 0, kSTEnd2_3w};
+act40 aflask4_3w = {WARN, 0, kSTEnd3_3w};
+act40 agive4_3w = {WARN, 0, kSTGiveb1_3w};
+act40 agive5_3w = {WARN, 0, kSTGiveb2_3w};
+act40 agot1c_3w = {WARN, 1, kSTGot1_3w};
+act40 agot9_3w = {WARN, 54, kSTGot2_3w};
+act40 ahelp1_3w = {WARN, 2, kSTHelp1_3w};
+act40 amission10_3w = {WARN, 5, kSTMission1_3w};
+act40 amission16_3w = {WARN, 30, kSTMission2_3w};
+act40 amission20_3w = {WARN, 50, kSTMission3_3w};
+act40 amission21_3w = {WARN, 50, kSTMission4_3w};
+act40 amission22_3w = {WARN, 50, kSTMission5_3w};
+act40 amission24_3w = {WARN, 60, kSTMission6_3w};
+act40 aold0a_3w = {WARN, 40, kSTOldman0a_3w};
+act40 aold0b_3w = {WARN, 40, kSTOldman0b_3w};
+act40 aold6c_3w = {WARN, 0, kSTOldman4_3w};
+act40 aold6d_3w = {WARN, 0, kSTOldman5_3w};
+act40 aprod4_3w = {WARN, 8, kSTProd1_3w};
+act40 aprod5_3w = {WARN, 20, kSTProd2_3w};
+act40 ascare13_3w = {WARN, 12, kSTScare1_3w};
+act40 ascared_3w = {WARN, 0, kSTScared_3w};
+act40 asleepy_3w = {WARN, 0, kSTSleepy_3w};
+act40 asunset1_3w = {WARN, 20, kSTAdios1_3w};
+act40 asunset2_3w = {WARN, 50, kSTAdios2_3w};
+act40 asunset3_3w = {WARN, 70, kSTAdios3_3w};
+act40 aweb10_3w = {WARN, 50, kSTPenny5_3w};
+act40 aweb15_3w = {WARN, 105, kSTSpider1_3w};
+act40 aweb17_3w = {WARN, 108, kSTSpider2_3w};
+act40 aweb20_3w = {WARN, 110, kSTSpider3_3w};
+act40 aweb6_3w = {WARN, 25, kSTPenny4_3w};
+
+act41 ac1_3w = {COND_BONUS, 0, 3, kALac2_3w, kALswingtip_3w};
+act41 ac2_3w = {COND_BONUS, 0, 13, kALac3_3w, kALplanetip_3w};
+act41 ac3_3w = {COND_BONUS, 0, 4, kALac4_3w, kALmodeltip_3w};
+act41 ac4_3w = {COND_BONUS, 0, 5, kALac5_3w, kALsticktip_3w};
+act41 ac5_3w = {COND_BONUS, 0, 7, kALac6_3w, kALmousetip_3w};
+act41 ac6_3w = {COND_BONUS, 0, 14, kALac7_3w, kALcubestip_3w};
+act41 ac7_3w = {COND_BONUS, 0, 11, kALac8_3w, kALdammedtip_3w};
+act41 ac8_3w = {COND_BONUS, 0, 8, kALac9_3w, kALmagictip_3w};
+act41 ac9_3w = {COND_BONUS, 0, 12, kALremedytip_3w, kALoldmantip_3w};
+
+act42 atakecage4_3w = {TEXT_TAKE, 0, CAGE_3w};
+act42 atakecheese4_3w = {TEXT_TAKE, 0, CHEESE_3w};
+
+act43 abtipprompt_3w = {YESNO, 0, kSTBridgeprompt_3w, kALbtip_3w, kALnotip_3w};
+act43 acageprompt_3w = {YESNO, 0, kSTCagePrompt_3w, kALcagetest3_3w, 0};
+act43 acheeseprompt_3w = {YESNO, 0, kSTCheesePrompt_3w, kALeatit_3w, 0};
+act43 aold1c_3w = {YESNO, 60, kSTOldman1_3w, kALwrong_3w, kALold2_3w};
+act43 aold2_3w = {YESNO, 0, kSTOldman2_3w, kALwrong_3w, kALold3_3w};
+act43 aold3_3w = {YESNO, 0, kSTOldman3_3w, kALold4_3w, kALold7_3w};
+
+act46 aexit2_3w = {INIT_JUMPEXIT, 0, false};
+act46 aplane2_3w = {INIT_JUMPEXIT, 0, true};
+
+actListPtr ALac2_3w[] = {&ac2_3w, 0};
+actListPtr ALac3_3w[] = {&ac3_3w, 0};
+actListPtr ALac4_3w[] = {&ac4_3w, 0};
+actListPtr ALac5_3w[] = {&ac5_3w, 0};
+actListPtr ALac6_3w[] = {&ac6_3w, 0};
+actListPtr ALac7_3w[] = {&ac7_3w, 0};
+actListPtr ALac8_3w[] = {&ac8_3w, 0};
+actListPtr ALac9_3w[] = {&ac9_3w, 0};
+actListPtr ALasleep_3w[] = {&astartaction_3w, &aasleep_3w, &amousefree_3w, &acageempty_3w, &ascare2_3w, &ascare5_3w, &ascare6_3w, &ascare7_3w, &ascare8_3w, &ascare9_3w, &ascare10_3w, &ascare11_3w, &ascare12_3w, &ascare17_3w, &aendaction_3w, 0};
+actListPtr ALbittest_3w[] = {&abittest_3w, 0};
+actListPtr ALblk1_3w[] = {&ablk1_3w, 0};
+actListPtr ALblk_3w[] = {&ablktest_3w, 0};
+actListPtr ALbrg_clftop1_3w[] = {&axy_brg_clftop_3w, &ascr_brg_clftop_3w, 0};
+actListPtr ALbrg_clftop_3w[] = {&abrgmsgtest_3w, 0};
+actListPtr ALbrg_clftop_msg_3w[] = {&aexplode_3w, &abrg_msg1_3w, &abrg_msg2_3w, &axy_brg_clftop_3w, &ascr_brg_clftop_3w, 0};
+actListPtr ALbrg_down_3w[] = {&ascr_path_brg2_3w, 0};
+actListPtr ALbrg_ok_3w[] = {&ascr_path_brg1_3w, 0};
+actListPtr ALbrg_path_3w[] = {&axy_brg_path_3w, &ascr_brg_path_3w, 0};
+actListPtr ALbridge_3w[] = {&abridge1_3w, &abridge2_3w, &abridge3_3w, 0};
+actListPtr ALbridgetest_3w[] = {&abridgetest_3w, 0};
+actListPtr ALbridgetip_3w[] = {&atiptest_3w, 0};
+actListPtr ALbtip_3w[] = {&abtip_3w, 0};
+actListPtr ALbtipprompt_3w[] = {&abtipprompt_3w, 0};
+actListPtr ALcageprompt_3w[] = {&acageprompt_3w, 0};
+actListPtr ALcagetest2_3w[] = {&acagetest2_3w, 0};
+actListPtr ALcagetest3_3w[] = {&acagetest3_3w, 0};
+actListPtr ALcagetest4_3w[] = {&acagetest4_3w, 0};
+actListPtr ALcagetest_3w[] = {&adroptest1_3w, 0};
+actListPtr ALcamp_3w[] = {&acamp0a_3w, &acamp0b_3w, &acamp0c_3w, &acamptest_3w, 0};
+actListPtr ALcamp_hut_3w[] = {&axy_camp_hut_3w, &ascr_camp_hut_3w, 0};
+actListPtr ALcamp_village_c_3w[] = {&aweehero_3w, &axy_camp_village_c_3w, &ascr_camp_village_c_3w, 0}; // exit center
+actListPtr ALcamp_village_l_3w[] = {&aweehero_3w, &axy_camp_village_l_3w, &ascr_camp_village_l_3w, 0}; // exit left
+actListPtr ALcampers_3w[] = {&acamp1a_3w, &acamp1b_3w, &acamp2a_3w, &acamp2b_3w, &acamp3a_3w, &acamp3b_3w, &acamp4a_3w, &acamp4b_3w, &acamp5a_3w, &acamp5b_3w, &acamp6a_3w, &acamp6b_3w, &acamp7a_3w, &acamp7b_3w, &acamp8a_3w, &acamp8b_3w, &acamp9a_3w, &acamp9b_3w, 0};
+actListPtr ALcanttake_3w[] = {&acanttake_3w, 0};
+actListPtr ALcave_man_3w[] = {&adisappear_3w, &adisable_3w, &ascr_cave_man_3w, 0};
+actListPtr ALcave_oldman_3w[] = {&acavetest_3w, 0};
+actListPtr ALcave_turn_3w[] = {&axy_cave_turn_3w, &ascr_cave_turn_3w, 0};
+actListPtr ALcave_wfall_3w[] = {&axy_cave_wfall_3w, &awfalltest_3w, 0};
+actListPtr ALchase_3w[] = {&achase1_3w, &achase2_3w, 0};
+actListPtr ALclf_clftop_3w[] = {&axy_clf_clftop_3w, &ascr_clf_clftop_3w, 0};
+actListPtr ALclf_wfall_3w[] = {&axy_clf_wfall_3w, &awfalltest_3w, 0};
+actListPtr ALclftop_brg_3w[] = {&axy_clftop_brg_3w, &ascr_clftop_brg_3w, 0};
+actListPtr ALclftop_clf_3w[] = {&axy_clftop_clf_3w, &ascr_clftop_clf_3w, 0};
+actListPtr ALclftop_slope_3w[] = {&axy_clftop_slope_3w, &ascr_clftop_slope_3w, 0};
+actListPtr ALclosedoor_3w[] = {&aclose1_3w, &aclose2_3w, 0};
+actListPtr ALcom0_3w[] = {&acom0a_3w, &acom0b_3w, 0};
+actListPtr ALcom1_3w[] = {&acom1a_3w, &acom1b_3w, 0};
+actListPtr ALcom2_3w[] = {&acom2a_3w, &acom2b_3w, 0};
+actListPtr ALcom3_3w[] = {&acom3a_3w, &acom3b_3w, 0};
+actListPtr ALcom4_3w[] = {&acom4a_3w, &acom4b_3w, 0};
+actListPtr ALcom5_3w[] = {&acom5a_3w, &acom5b_3w, 0};
+actListPtr ALcom6_3w[] = {&acom6a_3w, &acom6b_3w, 0};
+actListPtr ALcom7_3w[] = {&acom7a_3w, &acom7b_3w, 0};
+actListPtr ALcom8_3w[] = {&acom8a_3w, &acom8b_3w, 0};
+actListPtr ALcomment_3w[] = {&anat0_3w, &apause0_3w, &apause1_3w, 0};
+actListPtr ALcrash_web_3w[] = {&axy_crash_web_3w, &ascr_crash_web_3w, 0};
+actListPtr ALcrashed_3w[] = {&astory_mode_3w, &aexplode_3w, &acrash1_3w, &acrash2_3w, &acrash3_3w, &acrash4_3w, &acrash5_3w, &acrash6_3w, &acrash7_3w, &acrash8_3w, &acrash9_3w, &acrash10_3w, &acrash11_3w, &acrash12_3w, &acrash13_3w, &acrash14_3w, &acrash15_3w, &acrash16_3w, &acrash17_3w, &acrash18_3w, &acrash19_3w, &acrash20_3w, &acrash21_3w, &acrash22_3w, &acrash23_3w, 0};
+actListPtr ALcrashtest2_3w[] = {&acrashtest2_3w, 0};
+actListPtr ALcryhelp_3w[] = {&aweehero_3w, &ahelp1_3w, &ahelp2_3w, &ahelp3_3w, &ahelp4_3w, &ahelp5_3w, &ahelp6_3w, 0};
+actListPtr ALcrystal_3w[] = {&arub_3w, &ac1_3w, 0};
+actListPtr ALcubestip_3w[] = {&acubestip_3w, 0};
+actListPtr ALdammed_3w[] = {&adammed1_3w, &adammed2_3w, 0};
+actListPtr ALdammedtip_3w[] = {&adammedtip_3w, 0};
+actListPtr ALdart_3w[] = {&apath2test_3w, 0};
+actListPtr ALdarted_3w[] = {&adarted_3w, 0};
+actListPtr ALdartedtest_3w[] = {&adartedtest_3w, 0};
+actListPtr ALdartsched_3w[] = {&adarttest1_3w, 0};
+actListPtr ALdn_3w[] = {&aweehero_3w, &adn_3w, 0};
+actListPtr ALdoc_3w[] = {&aquiet_3w, &astophero_3w, &adoc1_3w, &adoc2_3w, &adoc3_3w, &adoc4_3w, 0};
+actListPtr ALdocgot_3w[] = {&agettest1_3w, 0};
+actListPtr ALdodart_3w[] = {&astartaction_3w, &adart0_3w, &adart1_3w, &adart2_3w, &adart3_3w, &adart4_3w, &adart5_3w, &adart6_3w, &aridtest_3w, &adarttest_3w, &aendaction_3w, 0};
+actListPtr ALdrink_3w[] = {&adrinktest_3w, 0};
+actListPtr ALdrinkno_3w[] = {&adrinkno_3w, 0};
+actListPtr ALdrinkyes_3w[] = {&adrinkyes_3w, &adrink_3w, 0};
+actListPtr ALdropcheese_3w[] = {&adroptest3_3w, 0};
+actListPtr ALdropincage_3w[] = {&asubcheese_3w, &adropcheese4_3w, &adropord2_3w, &adropord3_3w, &adropcheese1_3w, &adropcheese2_3w, &adropcheese3_3w, 0};
+actListPtr ALdropord_3w[] = {&asubcheese_3w, &aok_3w, &adropord1_3w, &adropord2_3w, &adropord3_3w, 0};
+actListPtr ALdroptest2_3w[] = {&adroptest2_3w, 0};
+actListPtr ALeatcheese_3w[] = {&acheeseprompt_3w, 0};
+actListPtr ALeatit_3w[] = {&asubcheese_3w, &acheese1_3w, &acheese2_3w, 0};
+actListPtr ALele_sleep_3w[] = {&aeleblink1_3w, 0};
+actListPtr ALeleblink_3w[] = {&arepblink_3w, &aeleblink1_3w, &aeleblink2_3w, &aeleblink3_3w, &aeleblink4_3w, 0};
+actListPtr ALeletest2_3w[] = {&aeletest2_3w, 0};
+actListPtr AL_empty_3w[] = {&aemptytest1_3w, 0};
+actListPtr ALemptymagic_3w[] = {&aemptyflask_3w, &aemptymagic_3w, 0};
+actListPtr ALemptyord_3w[] = {&aemptyflask_3w, &aemptyord_3w, 0};
+actListPtr ALemptytest2_3w[] = {&aemptytest2_3w, 0};
+actListPtr ALentertest2_3w[] = {&aentertest2_3w, 0};
+actListPtr ALentertest3_3w[] = {&aentertest3_3w, 0};
+actListPtr ALexit_3w[] = {&aappear_3w, &aenable_3w, &aexit1_3w, &aexit2_3w, &aexit3_3w, 0};
+actListPtr ALexor_3w[] = {&aex1_3w, &aex2_3w, &aex3_3w, &aex4_3w, &aex5_3w, &aex5a_3w, &aex6_3w, &aex7_3w, &aex8_3w, &aex9_3w, 0};
+actListPtr ALexorcise_3w[] = {&aexotest1_3w, 0};
+actListPtr ALexordone_3w[] = {&aexordone_3w, 0};
+actListPtr ALexotest2_3w[] = {&aexotest2_3w, 0};
+actListPtr ALfill_3w[] = {&afilltest1_3w, 0};
+actListPtr ALfillmagic_3w[] = {&afillsong_3w, &afillmagic1_3w, &afillmagic2_3w, &afillmagic3_3w, 0};
+actListPtr ALfillord_3w[] = {&afillord1_3w, &afillord2_3w, 0};
+actListPtr ALfilltest2_3w[] = {&afilltest2_3w, 0};
+actListPtr ALfilltest3_3w[] = {&afilltest3_3w, 0};
+actListPtr ALfindbook_3w[] = {&afindbtest_3w, 0};
+actListPtr ALfindcrystal_3w[] = {&aballsong_3w, &afind1_3w, &afind2_3w, 0};
+actListPtr ALfindit_3w[] = {&afindb1_3w, &afindb2_3w, &afindb3_3w, &afindb4_3w, 0};
+actListPtr ALflash_3w[] = {&arepflash_3w, &amap4a_3w, &amap4b_3w, &amap4c_3w, &amap4d_3w, 0};
+actListPtr ALflask_3w[] = {&aflasktest1_3w, 0};
+actListPtr ALflasktest2_3w[] = {&aflasktest2_3w, 0};
+actListPtr ALflasktest3_3w[] = {&aflasktest3_3w, 0};
+actListPtr ALgarden_wbase_3w[] = {&axy_garden_wbase_3w, &ascr_garden_wbase_3w, 0};
+actListPtr ALgettest2_3w[] = {&agettest2_3w, 0};
+actListPtr ALgive_3w[] = {&agive1_3w, &agive2_3w, &agive3_3w, &agive4_3w, &agive5_3w, &agive6_3w, &agive7_3w, 0};
+actListPtr ALgiveb_3w[] = {&agivetest1_3w, 0};
+actListPtr ALgivetest_3w[] = {&agivetest_3w, 0};
+actListPtr ALgot_3w[] = {&agot1_3w, &agot1a_3w, &agot1b_3w, &agot1c_3w, &agot2_3w, &agot3_3w, &agot2a_3w, &agot3a_3w, &agot2b_3w, &agot3b_3w, &agot4_3w, &agot5_3w, &agot5a_3w, &agot6_3w, &agot7_3w, &agot8_3w, &agot9_3w, &agot10_3w, &agot11_3w, &agot12_3w, 0};
+actListPtr ALholel_3w[] = {&ahole1_3w, &ahole2a_3w, &ahole3a_3w, &ahole4a_3w, &ahole5a_3w, &ahole6_3w, 0};
+actListPtr ALholer_3w[] = {&ahole1_3w, &ahole2b_3w, &ahole3b_3w, &ahole4b_3w, &ahole5b_3w, &ahole6_3w, 0};
+actListPtr ALhorizdn_3w[] = {&ahoriz2_3w, 0};
+actListPtr ALhorizon_3w[] = {&ahorizpos_3w, &arepeathorizon_3w, 0};
+actListPtr ALhorizup_3w[] = {&ahoriz1_3w, 0};
+actListPtr ALhut_camp_3w[] = {&axy_hut_camp_3w, &ascr_hut_camp_3w, 0};
+actListPtr ALhut_enter_3w[] = {&axy_hut_in_3w, &ascr_hut_in_3w, 0};
+actListPtr ALhut_in_3w[] = {&adoctest_3w, 0};
+actListPtr ALhut_out_3w[] = {&axy_hut_out_3w, &ascr_hut_out_3w, 0};
+actListPtr ALhut_village_c_3w[] = {&aweehero_3w, &axy_hut_village_c_3w, &ascr_hut_village_c_3w, 0};
+actListPtr ALhut_village_r_3w[] = {&aweehero_3w, &axy_hut_village_r_3w, &ascr_hut_village_r_3w, 0};
+actListPtr ALleft_3w[] = {&aleft1_3w, &aleft2_3w, &aleft3_3w, &aleft4_3w, 0};
+actListPtr ALlookfall_3w[] = {&alookfall_3w, 0};
+actListPtr ALlooknofall_3w[] = {&alooknofall_3w, 0};
+actListPtr ALlookwfall_3w[] = {&alookwfalltest_3w, 0};
+actListPtr ALmagictip_3w[] = {&amagictip_3w, 0};
+actListPtr ALmakeclay_3w[] = {&amaketest_3w, 0};
+actListPtr ALmakeit_3w[] = {&amakeclay1_3w, &amakeclay2_3w, &amakeclay3_3w, 0};
+actListPtr ALmission_3w[] = {&amission1_3w, &amission2_3w, &amission3_3w, &amission4_3w, &amission5_3w, &amission6_3w, &amission7_3w, &amission8_3w, &amission9_3w, &amission10_3w, &amission11_3w, &amission12_3w, &amission13_3w, &amission14_3w, &amission15_3w, &amission16_3w, &amission17_3w, &amission18_3w, &amission19_3w, &amission20_3w, &amission21_3w, &amission22_3w, &amission23_3w, &amission24_3w, &amission25_3w, 0};
+actListPtr ALmodeltip_3w[] = {&amodeltip_3w, 0};
+actListPtr ALmouse_3w[] = {&acagetest_3w, &aentertest1_3w, &arepeatmouse_3w, 0};
+actListPtr ALmousego_3w[] = {&ago1_3w, &amousefree_3w, &acageempty_3w, &ascare2_3w, 0};
+actListPtr ALmousegone_3w[] = {&amousegone_3w, 0};
+actListPtr ALmousel_3w[] = {&amousel_3w, 0};
+actListPtr ALmouser_3w[] = {&amouser_3w, 0};
+actListPtr ALmousetip_3w[] = {&amousetip_3w, 0};
+actListPtr ALnat1_3w[] = {&anat1_3w, 0};
+actListPtr ALnat2_3w[] = {&anat2_3w, 0};
+actListPtr ALnat3_3w[] = {&anat3_3w, 0};
+actListPtr ALnat4_3w[] = {&anat4_3w, 0};
+actListPtr ALnat5_3w[] = {&anat5_3w, 0};
+actListPtr ALnat6_3w[] = {&anat6_3w, 0};
+actListPtr ALnat7_3w[] = {&anat7_3w, 0};
+actListPtr ALnat8_3w[] = {&anat8_3w, 0};
+actListPtr ALnat9_3w[] = {&acom9_3w, 0};
+actListPtr ALnative_3w[] = {&apausetest_3w, 0};
+actListPtr ALnoblow_3w[] = {&anoblow_3w, 0};
+actListPtr ALnoclay_3w[] = {&anoclay_3w, 0};
+actListPtr ALnofill_3w[] = {&anofill_3w, 0};
+actListPtr ALnomake_3w[] = {&anomake_3w, 0};
+actListPtr ALnoremedy_3w[] = {&anoremedy1_3w, 0};
+actListPtr ALnospell_3w[] = {&anospell_3w, 0};
+actListPtr ALnostick_3w[] = {&anostick_3w, 0};
+actListPtr ALnostickpin_3w[] = {&anostickpin_3w, 0};
+actListPtr ALnotakecb_3w[] = {&anotakecb_3w, 0};
+actListPtr AL_nothanks_3w[] = {&anothanks_3w, 0};
+actListPtr ALnotip_3w[] = {&anotip_3w, 0};
+actListPtr ALnottied_3w[] = {&anottied_3w, 0};
+actListPtr ALoktoleave1_3w[] = {&aweehero_3w, &axy_path_village_3w, &ascr_path_village_3w, 0};
+actListPtr ALoktoleave2_3w[] = {&axy_path_stream_3w, &astreamtest_3w, 0};
+actListPtr ALold2_3w[] = {&aold2_3w, 0};
+actListPtr ALold3_3w[] = {&aold3_3w, 0};
+actListPtr ALold4_3w[] = {&aold4_3w, 0};
+actListPtr ALold5_3w[] = {&aold5_3w, 0};
+actListPtr ALold6_3w[] = {&aold6a_3w, &aold6b_3w, &aold6c_3w, &aold6d_3w, &aold6e_3w, &acbtest_3w, &awink1_3w, &awink2_3w, &awink3_3w, &aold6f_3w, &aoldsnd_3w, &aold6g_3w, &aold6h_3w, &aold6i_3w, 0};
+actListPtr ALold7_3w[] = {&aappear1_3w, &aenable_3w, &aold7_3w, &amap4b_3w, &areturn_3w, 0};
+actListPtr ALoldfirst_3w[] = {&aoldstate_3w, &aold0a_3w, &aold1a_3w, &aold1b_3w, &aold1c_3w, 0};
+actListPtr ALoldman_3w[] = {&aoldmantest_3w, 0};
+actListPtr ALoldmantip_3w[] = {&aoldmantip_3w, 0};
+actListPtr ALoldsubseq_3w[] = {&aoldstate_3w, &aold0b_3w, &aold1a_3w, &aold1b_3w, &aold1c_3w, 0};
+actListPtr ALopencage_3w[] = {&acagetest1_3w, 0};
+actListPtr ALopencdoor_3w[] = {&aopen1_3w, &aopen2_3w, 0};
+actListPtr ALopendoor_3w[] = {&aopentest_3w, 0};
+actListPtr ALpath_3w[] = {&aeletest1_3w, 0};
+actListPtr ALpath_brg_3w[] = {&axy_path_brg_3w, &abrgtest_3w, 0};
+actListPtr ALpath_stream_3w[] = {&aactiontest2_3w, 0};
+actListPtr ALpath_village_3w[] = {&aactiontest1_3w, 0};
+actListPtr ALpath_web_3w[] = {&axy_path_web_3w, &ascr_path_web_3w, 0};
+actListPtr ALplane_3w[] = {&adisappear_3w, &adisable_3w, &aplane1_3w, &aplane2_3w, &aplane3_3w, 0};
+actListPtr ALplanetip_3w[] = {&aplanetip_3w, 0};
+actListPtr ALpostest_3w[] = {&apostest_3w, 0};
+actListPtr ALprod_3w[] = {&ahey_3w, &aprod1_3w, &aprod2_3w, &aprod3_3w, &aprod4_3w, &aprodsong_3w, &aprod5_3w, &aprod6_3w, &aprod7_3w, &aprod8_3w, 0};
+actListPtr ALputitdown_3w[] = {&aputitdown_3w, 0};
+actListPtr ALreadbook_3w[] = {&areadtest1_3w, 0};
+actListPtr ALreadord_3w[] = {&abook1_3w, 0};
+actListPtr ALreadtest2_3w[] = {&areadtest2_3w, 0};
+actListPtr ALrefuse_3w[] = {&arefuse_3w, 0};
+actListPtr ALrefuseflask_3w[] = {&arefuseflask_3w, 0};
+actListPtr ALremedy_3w[] = {&afinale_3w, &aflask1_3w, &aflask2_3w, &aflask3_3w, &aflask4_3w, &aflask5_3w, &astophero_3w, &adisable_3w, &aflask6_3w, 0};
+actListPtr ALremedytip_3w[] = {&aremedytip_3w, 0};
+actListPtr ALreturn_3w[] = {&areturn1_3w, &areturn2_3w, &areturn3_3w, &areturn4_3w, &areturn5_3w, 0};
+actListPtr ALright_3w[] = {&aright1_3w, &aright2_3w, &aright3_3w, &aright4_3w, 0};
+actListPtr ALscare_3w[] = {&astartaction_3w, &ascarebonus_3w, &anelesong_3w, &amousefree_3w, &acageempty_3w, &ascare1_3w, &ascare2_3w, &ascare3_3w, &ascare4_3w, &ascare5_3w, &ascare6_3w, &ascare7_3w, &ascare8_3w, &ascare9_3w, &ascare10_3w, &ascare11_3w, &ascare12_3w, &ascare13_3w, &ascare14_3w, &ascare15_3w, &ascare16_3w, &ascare17_3w, &aridtest_3w, &adarttest_3w, &aendaction_3w, 0};
+actListPtr ALscared_3w[] = {&ascared_3w, 0};
+actListPtr ALsleepy_3w[] = {&asleepy_3w, 0};
+actListPtr ALslope_clftop_3w[] = {&axy_slope_clftop_3w, &ascr_slope_clftop_3w, 0};
+actListPtr ALslope_stream_3w[] = {&axy_slope_stream_3w, &astreamtest_3w, 0};
+actListPtr ALspider_3w[] = {&aplantfix_3w, &aspidersong_3w, &amap1_3w, &aweb1_3w, &aweb2_3w, &aweb3_3w, &aweb4_3w, &aweb5_3w, &aweb6_3w, &aweb7_3w, &aweb8_3w, &aweb9_3w, &aweb10_3w, &aweb11_3w, &aweb12_3w, &aweb13_3w, &aweb14_3w, &aweb15_3w, &aweb16_3w, &aweb17a_3w, &aweb17_3w, &aweb18_3w, &aweb19_3w, &aweb20_3w, &aweb21_3w, &aweb22_3w, &aweb23_3w, &aweb24_3w, &aweb25_3w, &aweb26_3w, &aweb27_3w, 0};
+actListPtr ALspirit_3w[] = {&aspirittest_3w, 0};
+actListPtr ALsteps_3w[] = {&asteps1_3w, 0};
+actListPtr ALstick_3w[] = {&asticktest3_3w, 0};
+actListPtr ALstickpin_3w[] = {&asticksong_3w, &aprod1_3w, &aprod2_3w, &aprod3_3w, &astick1_3w, &astick2_3w, &astick3_3w, &astick4_3w, &astick5_3w, &astick6_3w, &astick7_3w, 0};
+actListPtr ALsticktest1_3w[] = {&asticktest1_3w, 0};
+actListPtr ALsticktest2_3w[] = {&asticktest2_3w, 0};
+actListPtr ALsticktest4_3w[] = {&asticktest4_3w, 0};
+actListPtr ALsticktip_3w[] = {&asticktip_3w, 0};
+actListPtr ALstream1_3w[] = {&ascr_slope_stream1_3w, 0};
+actListPtr ALstream2_3w[] = {&ascr_slope_stream2_3w, 0};
+actListPtr ALstream_path_3w[] = {&axy_stream_path_3w, &ascr_stream_path_3w, 0};
+actListPtr ALstream_slope_3w[] = {&axy_stream_slope_3w, &ascr_stream_slope_3w, 0};
+actListPtr ALstuckpin_3w[] = {&astuckpin_3w, 0};
+actListPtr ALsunset_3w[] = {&asunset1_3w, &asunset2_3w, &asunset3_3w, &asunset4_3w, 0};
+actListPtr ALswing_3w[] = {&aquiet_3w, &aswingsong_3w, &aswing0_3w, &aswing1_3w, &aswing2_3w, &aswing3_3w, &aswing4_3w, &aswing5_3w, &aswing6_3w, &aswing7_3w, &aswing8_3w, 0};
+actListPtr ALswingtip_3w[] = {&aswingtip_3w, 0};
+actListPtr ALtakecage_3w[] = {&ataketest3_3w, 0};
+actListPtr ALtakecb_3w[] = {&atakecb1_3w, &atakecb2_3w, &atakecb3_3w, 0};
+actListPtr ALtakecheese_3w[] = {&atakechstest_3w, 0};
+actListPtr ALtakechs_3w[] = {&aaddcheese_3w, &atakecheese4_3w, &atakencheese_3w, &atakecheese1_3w, &atakecheese2_3w, &atakecheese3_3w, 0};
+actListPtr ALtakeit_3w[] = {&atakecage4_3w, &atakecage1_3w, &atakecage2_3w, &atakecage3_3w, 0};
+actListPtr ALtaketest1_3w[] = {&ataketest1_3w, 0};
+actListPtr ALtaketest2_3w[] = {&ataketest2_3w, 0};
+actListPtr ALtalkdoc1_3w[] = {&atalkdoc1_3w, 0};
+actListPtr ALtalkdoc2_3w[] = {&atalkdoc2_3w, 0};
+actListPtr ALtalkdoc3_3w[] = {&atalkdoc3_3w, 0};
+actListPtr ALtalkdoc_3w[] = {&adocscrtest_3w, 0};
+actListPtr ALtalknat_3w[] = {&atalktest3_3w, 0};
+actListPtr ALtalktest1_3w[] = {&atalktest1_3w, 0};
+actListPtr ALtalktest2_3w[] = {&atalktest2_3w, 0};
+actListPtr ALtalkweb_3w[] = {&atalkweb_3w, 0};
+actListPtr ALtdtest_3w[] = {&atdtest_3w, 0};
+actListPtr ALtied_3w[] = {&atied_3w, 0};
+actListPtr ALtievine_3w[] = {&atiesong_3w, &avine1_3w, &avine2_3w, &avine3_3w, &avine4_3w, &avine5_3w, &avine6_3w, &avine7_3w, 0};
+actListPtr ALtrapped_3w[] = {&aaddcheese_3w, &aenter0_3w, &aenter1_3w, &aentersnd_3w, &aenter2_3w, &aenter3_3w, &aenter4_3w, &aenter5_3w, &aenter6_3w, &aenter7_3w, &aenter8_3w, &aenter9_3w, 0};
+actListPtr ALturn_cave_3w[] = {&axy_turn_cave_3w, &ascr_turn_cave_3w, 0};
+actListPtr ALturn_village_3w[] = {&aweehero_3w, &axy_turn_village_3w, &ascr_turn_village_3w, 0};
+actListPtr ALuntie_3w[] = {&auntie_3w, 0};
+actListPtr ALuntie_vine_3w[] = {&auntietest_3w, 0};
+actListPtr ALup_3w[] = {&aweehero_3w, &aup_3w, 0};
+actListPtr ALusecage_3w[] = {&acagetest5_3w, 0};
+actListPtr ALvillage_camp_l_3w[] = {&aweehero_3w, &axy_village_camp_l_3w, &ascr_village_camp_l_3w, 0};
+actListPtr ALvillage_camp_r_3w[] = {&aweehero_3w, &axy_village_camp_r_3w, &ascr_village_camp_r_3w, 0};
+actListPtr ALvillage_path_3w[] = {&aweehero_3w, &axy_village_path_3w, &ascr_village_path_3w, 0};
+actListPtr ALvillage_thing_3w[] = {&athing_3w, 0};
+actListPtr ALvillage_turn_3w[] = {&aweehero_3w, &axy_village_turn_3w, &ascr_village_turn_3w, 0};
+actListPtr ALvine_3w[] = {&avinetest_3w, 0};
+actListPtr ALwarn_3w[] = {&awarn_3w, 0};
+actListPtr ALwaterfall_3w[] = {&ascr_clf_wfall_3w, 0};
+actListPtr ALwaternofall_3w[] = {&ascr_clf_wnofall_3w, 0};
+actListPtr ALwbase_garden_3w[] = {&axy_wbase_garden_3w, &ascr_wbase_garden_3w, 0};
+actListPtr ALwbase_wfall_3w[] = {&aelewaking_3w, &aelewoken_3w, &axy_wbase_wfall_3w, &ascr_wbase_wfall_3w, 0};
+actListPtr ALweb_3w[] = {&awebtest1_3w, 0};
+actListPtr ALweb_crash_3w[] = {&axy_web_crash_3w, &ascr_web_crash_3w, 0};
+actListPtr ALweb_path_3w[] = {&axy_web_path_3w, &ascr_web_path_3w, 0};
+actListPtr ALwebtest2_3w[] = {&awebtest2_3w, 0};
+actListPtr ALwfall_cave_3w[] = {&axy_wfall_cave_3w, &ascr_wfall_cave_3w, 0};
+actListPtr ALwfall_clf_3w[] = {&axy_wfall_clf_3w, &ascr_wfall_clf_3w, 0};
+actListPtr ALwfall_wbase_3w[] = {&awaterfalling_3w, 0};
+actListPtr ALwfallb_cave_3w[] = {&axy_wfall_cave_3w, &ascr_wfall_cave_3w, 0};
+actListPtr ALwfallb_clf_3w[] = {&axy_wfall_clf_3w, &ascr_wfall_clf_3w, 0};
+actListPtr ALwfallb_wbase_3w[] = {&axy_wfallb_wbase_3w, &ascr_wfallb_wbase_3w, 0};
+actListPtr ALwrong_3w[] = {&aappear1_3w, &aenable_3w, &awrong1_3w, &amap4b_3w, &areturn_3w, 0};
+actListPtr ALempty_3w[] = {&aempty_3w, 0};
+actListPtr ALgotit_3w[] = {&agotit_3w, 0};
+actListPtr ALnocarry_3w[] = {&anocarry_3w, 0};
+actListPtr ALnopurps_3w[] = {&anopurps_3w, 0};
+actListPtr ALnothanks_3w[] = {&anothanks_3w, 0};
+actListPtr ALok_3w[] = {&aok_3w, 0};
+actListPtr ALstalk_3w[] = {&astalk_3w, 0};
+actListPtr ALcrashStory_3w[] = {&acrashtest1_3w, 0};
+actListPtr ALcrashNoStory_3w[] = {&amap1_3w, &acrashtest1_3w, 0};
+
+actList actListArr_3w[] = {
+ ALDummy, ALac2_3w, ALac3_3w, ALac4_3w, ALac5_3w,
+ ALac6_3w, ALac7_3w, ALac8_3w, ALac9_3w, ALasleep_3w,
+ ALbittest_3w, ALblk1_3w, ALblk_3w, ALbrg_clftop1_3w, ALbrg_clftop_3w,
+ ALbrg_clftop_msg_3w, ALbrg_down_3w, ALbrg_ok_3w, ALbrg_path_3w, ALbridge_3w,
+ ALbridgetest_3w, ALbridgetip_3w, ALbtip_3w, ALbtipprompt_3w, ALcageprompt_3w,
+ ALcagetest2_3w, ALcagetest3_3w, ALcagetest4_3w, ALcagetest_3w, ALcamp_3w,
+ ALcamp_hut_3w, ALcamp_village_c_3w, ALcamp_village_l_3w, ALcampers_3w, ALcanttake_3w,
+ ALcave_man_3w, ALcave_oldman_3w, ALcave_turn_3w, ALcave_wfall_3w, ALchase_3w,
+ ALclf_clftop_3w, ALclf_wfall_3w, ALclftop_brg_3w, ALclftop_clf_3w, ALclftop_slope_3w,
+ ALclosedoor_3w, ALcom0_3w, ALcom1_3w, ALcom2_3w, ALcom3_3w,
+ ALcom4_3w, ALcom5_3w, ALcom6_3w, ALcom7_3w, ALcom8_3w,
+ ALcomment_3w, ALcrash_web_3w, ALcrashed_3w, ALcrashtest2_3w, ALcryhelp_3w,
+ ALcrystal_3w, ALcubestip_3w, ALdammed_3w, ALdammedtip_3w, ALdart_3w,
+ ALdarted_3w, ALdartedtest_3w, ALdartsched_3w, ALdn_3w, ALdoc_3w,
+ ALdocgot_3w, ALdodart_3w, ALdrink_3w, ALdrinkno_3w, ALdrinkyes_3w,
+ ALdropcheese_3w, ALdropincage_3w, ALdropord_3w, ALdroptest2_3w, ALeatcheese_3w,
+ ALeatit_3w, ALele_sleep_3w, ALeleblink_3w, ALeletest2_3w, ALempty_3w,
+ ALemptymagic_3w, ALemptyord_3w, ALemptytest2_3w, ALentertest2_3w, ALentertest3_3w,
+ ALexit_3w, ALexor_3w, ALexorcise_3w, ALexordone_3w, ALexotest2_3w,
+ ALfill_3w, ALfillmagic_3w, ALfillord_3w, ALfilltest2_3w, ALfilltest3_3w,
+ ALfindbook_3w, ALfindcrystal_3w, ALfindit_3w, ALflash_3w, ALflask_3w,
+ ALflasktest2_3w, ALflasktest3_3w, ALgarden_wbase_3w, ALgettest2_3w, ALgive_3w,
+ ALgiveb_3w, ALgivetest_3w, ALgot_3w, ALholel_3w, ALholer_3w,
+ ALhorizdn_3w, ALhorizon_3w, ALhorizup_3w, ALhut_camp_3w, ALhut_enter_3w,
+ ALhut_in_3w, ALhut_out_3w, ALhut_village_c_3w, ALhut_village_r_3w, ALleft_3w,
+ ALlookfall_3w, ALlooknofall_3w, ALlookwfall_3w, ALmagictip_3w, ALmakeclay_3w,
+ ALmakeit_3w, ALmission_3w, ALmodeltip_3w, ALmouse_3w, ALmousego_3w,
+ ALmousegone_3w, ALmousel_3w, ALmouser_3w, ALmousetip_3w, ALnat1_3w,
+ ALnat2_3w, ALnat3_3w, ALnat4_3w, ALnat5_3w, ALnat6_3w,
+ ALnat7_3w, ALnat8_3w, ALnat9_3w, ALnative_3w, ALnoblow_3w,
+ ALnoclay_3w, ALnofill_3w, ALnomake_3w, ALnoremedy_3w, ALnospell_3w,
+ ALnostick_3w, ALnostickpin_3w, ALnotakecb_3w, ALnothanks_3w, ALnotip_3w,
+ ALnottied_3w, ALoktoleave1_3w, ALoktoleave2_3w, ALold2_3w, ALold3_3w,
+ ALold4_3w, ALold5_3w, ALold6_3w, ALold7_3w, ALoldfirst_3w,
+ ALoldman_3w, ALoldmantip_3w, ALoldsubseq_3w, ALopencage_3w, ALopencdoor_3w,
+ ALopendoor_3w, ALpath_3w, ALpath_brg_3w, ALpath_stream_3w, ALpath_village_3w,
+ ALpath_web_3w, ALplane_3w, ALplanetip_3w, ALpostest_3w, ALprod_3w,
+ ALputitdown_3w, ALreadbook_3w, ALreadord_3w, ALreadtest2_3w, ALrefuse_3w,
+ ALrefuseflask_3w, ALremedy_3w, ALremedytip_3w, ALreturn_3w, ALright_3w,
+ ALscare_3w, ALscared_3w, ALsleepy_3w, ALslope_clftop_3w, ALslope_stream_3w,
+ ALspider_3w, ALspirit_3w, ALsteps_3w, ALstick_3w, ALstickpin_3w,
+ ALsticktest1_3w, ALsticktest2_3w, ALsticktest4_3w, ALsticktip_3w, ALstream1_3w,
+ ALstream2_3w, ALstream_path_3w, ALstream_slope_3w, ALstuckpin_3w, ALsunset_3w,
+ ALswing_3w, ALswingtip_3w, ALtakecage_3w, ALtakecb_3w, ALtakecheese_3w,
+ ALtakechs_3w, ALtakeit_3w, ALtaketest1_3w, ALtaketest2_3w, ALtalkdoc1_3w,
+ ALtalkdoc2_3w, ALtalkdoc3_3w, ALtalkdoc_3w, ALtalknat_3w, ALtalktest1_3w,
+ ALtalktest2_3w, ALtalkweb_3w, ALtdtest_3w, ALtied_3w, ALtievine_3w,
+ ALtrapped_3w, ALturn_cave_3w, ALturn_village_3w, ALuntie_3w, ALuntie_vine_3w,
+ ALup_3w, ALusecage_3w, ALvillage_camp_l_3w, ALvillage_camp_r_3w, ALvillage_path_3w,
+ ALvillage_thing_3w, ALvillage_turn_3w, ALvine_3w, ALwarn_3w, ALwaterfall_3w,
+ ALwaternofall_3w, ALwbase_garden_3w, ALwbase_wfall_3w, ALweb_3w, ALweb_crash_3w,
+ ALweb_path_3w, ALwebtest2_3w, ALwfall_cave_3w, ALwfall_clf_3w, ALwfall_wbase_3w,
+ ALwfallb_cave_3w, ALwfallb_clf_3w, ALwfallb_wbase_3w, ALwrong_3w, ALempty_3w,
+ ALgotit_3w, ALnocarry_3w, ALnopurps_3w, ALnothanks_3w, ALok_3w,
+ ALstalk_3w, ALcrashStory_3w, ALcrashNoStory_3w
+};
+
+int rep1_1d[] = {kSTsrep1_1d, -1};
+int rep2_1d[] = {kSTsrep2_1d, -1};
+int rep3_1d[] = {kSTsrep3_1d, -1};
+int rep4_1d[] = {kSTsrep4_1d, -1};
+int rep5_1d[] = {kSTsrep5_1d, -1};
+int rep6_1d[] = {kSTsrep6_1d, -1};
+int repbut2_1d[] = {kSTsbut2_1d, -1};
+int repopen_1d[] = {kSTsopenr_1d, -1};
+
+// Hugo 1 DOS
+act0 aend_1d = {ASCHEDULE, 4 * NORMAL_TPS, kALend_1d};
+act0 ajailrep_1d = {ASCHEDULE, 4, kALjailrep_1d};
+act0 acycle_1d = {ASCHEDULE, 0, kALcycle_1d};
+act0 areparm_1d = {ASCHEDULE, 5 * NORMAL_TPS, kALreparm_1d};
+act0 arepbat_1d = {ASCHEDULE, 12 * NORMAL_TPS, kALbat_1d};
+act0 arepbata_1d = {ASCHEDULE, 3 * NORMAL_TPS, kALbatrep_1d};
+act0 arepeye_1d = {ASCHEDULE, 8 * NORMAL_TPS, kALblinkeyes1_1d};
+act0 arepeye2_1d = {ASCHEDULE, 8 * NORMAL_TPS, kALblinkeyes2_1d};
+act0 areplight_1d = {ASCHEDULE, 11 * NORMAL_TPS, kALightning_1d};
+act0 areplips_1d = {ASCHEDULE, 4 * NORMAL_TPS, kALreplips_1d};
+act0 arepredeye_1d = {ASCHEDULE, 6 * NORMAL_TPS, kALrepredeye_1d};
+act0 aweird_1d = {ASCHEDULE, 16, kALweird_1d};
+
+act1 aridchop_1d = {START_OBJ, 0, CHOP_1d, 0, ALMOST_INVISIBLE};
+act1 ashowchop_1d = {START_OBJ, 0, CHOP_1d, 0, NOT_CYCLING};
+act1 a115b_1d = {START_OBJ, 0, MASK_1d, 0, NOT_CYCLING};
+act1 abin2_1d = {START_OBJ, 0, HERO, 0, ALMOST_INVISIBLE};
+act1 about2_1d = {START_OBJ, 0, HERO, 0, NOT_CYCLING};
+act1 abox10_1d = {START_OBJ, 38, PROF_1d, 0, CYCLE_FORWARD};
+act1 abox11_1d = {START_OBJ, 73, PROF_1d, 0, ALMOST_INVISIBLE};
+act1 abut6d_1d = {START_OBJ, 7, HERO, 0, ALMOST_INVISIBLE};
+act1 abut6f_1d = {START_OBJ, 7, HDLSHERO_1d, 0, NOT_CYCLING};
+act1 aclosetrap_1d = {START_OBJ, 1 * NORMAL_TPS, TRAP_1d, 1, CYCLE_BACKWARD};
+act1 adogcyc_1d = {START_OBJ, 0, DOG_1d, 0, CYCLE_FORWARD};
+act1 adoggy1_1d = {START_OBJ, 0, HERO, 0, ALMOST_INVISIBLE};
+act1 adoggy3_1d = {START_OBJ, 0, HERODEAD_1d, 0, NOT_CYCLING};
+act1 aguardgo1_1d = {START_OBJ, 0, GUARD_1d, 0, CYCLE_FORWARD};
+act1 ajail2_1d = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 alab5_1d = {START_OBJ, 0, PROF_1d, 0, CYCLE_FORWARD};
+act1 alab8_1d = {START_OBJ, 12, PROF_1d, 0, NOT_CYCLING};
+act1 alab9_1d = {START_OBJ, 16, IGOR_1d, 0, NOT_CYCLING};
+act1 aopentrap_1d = {START_OBJ, 1 * NORMAL_TPS, TRAP_1d, 1, CYCLE_FORWARD};
+act1 aridbung_1d = {START_OBJ, 0, BUNG_1d, 0, ALMOST_INVISIBLE};
+act1 atheend1_1d = {START_OBJ, 5 * NORMAL_TPS, HERO, 0, ALMOST_INVISIBLE};
+act1 aarm_1d = {START_OBJ, 0, ARM_1d, 3, CYCLE_BACKWARD};
+act1 ablink1a_1d = {START_OBJ, 0, EYES1_1d, 0, ALMOST_INVISIBLE};
+act1 ablink1b_1d = {START_OBJ, 1, EYES1_1d, 0, NOT_CYCLING};
+act1 ablink1c_1d = {START_OBJ, 2, EYES1_1d, 0, ALMOST_INVISIBLE};
+act1 ablink1d_1d = {START_OBJ, 3, EYES1_1d, 0, NOT_CYCLING};
+act1 ablink2a_1d = {START_OBJ, 3 * NORMAL_TPS + 0, EYES2_1d, 0, ALMOST_INVISIBLE};
+act1 ablink2b_1d = {START_OBJ, 3 * NORMAL_TPS + 1, EYES2_1d, 0, NOT_CYCLING};
+act1 ablink2c_1d = {START_OBJ, 3 * NORMAL_TPS + 2, EYES2_1d, 0, ALMOST_INVISIBLE};
+act1 ablink2d_1d = {START_OBJ, 3 * NORMAL_TPS + 3, EYES2_1d, 0, NOT_CYCLING};
+act1 ablink3a_1d = {START_OBJ, 0, EYES3_1d, 0, ALMOST_INVISIBLE};
+act1 ablink3b_1d = {START_OBJ, 1, EYES3_1d, 0, NOT_CYCLING};
+act1 ablink3c_1d = {START_OBJ, 2, EYES3_1d, 0, ALMOST_INVISIBLE};
+act1 ablink3d_1d = {START_OBJ, 3, EYES3_1d, 0, NOT_CYCLING};
+act1 ablink4a_1d = {START_OBJ, 3 * NORMAL_TPS + 0, EYES4_1d, 0, ALMOST_INVISIBLE};
+act1 ablink4b_1d = {START_OBJ, 3 * NORMAL_TPS + 1, EYES4_1d, 0, NOT_CYCLING};
+act1 ablink4c_1d = {START_OBJ, 3 * NORMAL_TPS + 2, EYES4_1d, 0, ALMOST_INVISIBLE};
+act1 ablink4d_1d = {START_OBJ, 3 * NORMAL_TPS + 3, EYES4_1d, 0, NOT_CYCLING};
+act1 ablink5a_1d = {START_OBJ, 0, REDEYES_1d, 0, ALMOST_INVISIBLE};
+act1 ablink5b_1d = {START_OBJ, 1, REDEYES_1d, 0, NOT_CYCLING};
+act1 ablink5c_1d = {START_OBJ, 2, REDEYES_1d, 0, ALMOST_INVISIBLE};
+act1 ablink5d_1d = {START_OBJ, 3, REDEYES_1d, 0, NOT_CYCLING};
+act1 abut1_1d = {START_OBJ, 4 * NORMAL_TPS, BUTLER_1d, 0, CYCLE_FORWARD};
+act1 aclosedoor1_1d = {START_OBJ, 1 * NORMAL_TPS, DOOR1_1d, 1, CYCLE_BACKWARD};
+act1 aclosedoor4_1d = {START_OBJ, 1 * NORMAL_TPS, DOOR4_1d, 1, CYCLE_BACKWARD};
+act1 aclosewdoorl_1d = {START_OBJ, 1 * NORMAL_TPS, WDOORL_1d, 1, CYCLE_BACKWARD};
+act1 aclosewdoorr_1d = {START_OBJ, 1 * NORMAL_TPS, WDOORR_1d, 1, CYCLE_BACKWARD};
+act1 adog1_1d = {START_OBJ, 0, DOG_1d, 0, CYCLE_FORWARD};
+act1 alips_1d = {START_OBJ, 0, LIPS_1d, 6, CYCLE_FORWARD};
+act1 amdoor1_1d = {START_OBJ, 1 * NORMAL_TPS, MDOOR_1d, 1, CYCLE_FORWARD};
+act1 amovecarp1_1d = {START_OBJ, 0, CARPET_1d, 0, ALMOST_INVISIBLE};
+act1 amovecarp2_1d = {START_OBJ, 0, TRAP_1d, 0, NOT_CYCLING};
+act1 amum1_1d = {START_OBJ, 2 * NORMAL_TPS, MUMMY_1d, 0, CYCLE_FORWARD};
+act1 aopendoor1_1d = {START_OBJ, 1 * NORMAL_TPS, DOOR1_1d, 1, CYCLE_FORWARD};
+act1 aopendoor2_1d = {START_OBJ, 1 * NORMAL_TPS, DOOR2_1d, 1, CYCLE_FORWARD};
+act1 aopendoor3_1d = {START_OBJ, 1 * NORMAL_TPS, DOOR3_1d, 1, CYCLE_FORWARD};
+act1 aopendoor4_1d = {START_OBJ, 1 * NORMAL_TPS, DOOR4_1d, 1, CYCLE_FORWARD};
+act1 aopenwdoorl_1d = {START_OBJ, 1 * NORMAL_TPS, WDOORL_1d, 1, CYCLE_FORWARD};
+act1 aopenwdoorr_1d = {START_OBJ, 1 * NORMAL_TPS, WDOORR_1d, 1, CYCLE_FORWARD};
+act1 aridpkin_1d = {START_OBJ, 0, PKIN_1d, 0, ALMOST_INVISIBLE};
+act1 aridprof_1d = {START_OBJ, 130 / DX, PROF_1d, 0, ALMOST_INVISIBLE};
+act1 ashowkey_1d = {START_OBJ, 0, KEY_1d, 0, NOT_CYCLING};
+
+act2 achopxy_1d = {INIT_OBJXY, 0, CHOP_1d, 51, 155};
+act2 aigor12_1d = {INIT_OBJXY, 30, HERO, 116, 112};
+act2 a115d_1d = {INIT_OBJXY, 0, MASK_1d, 240, 88};
+act2 abata1c_1d = {INIT_OBJXY, 0, BAT2_1d, 65, 25};
+act2 abata2c_1d = {INIT_OBJXY, 0, BAT3_1d, 55, 65};
+act2 abata3c_1d = {INIT_OBJXY, 0, BAT4_1d, 50, 120};
+act2 abata4c_1d = {INIT_OBJXY, 0, BAT5_1d, 55, 130};
+act2 abox4a_1d = {INIT_OBJXY, 20, HERO, 124, 122};
+act2 adog4_1d = {INIT_OBJXY, 0, DOG_1d, 105, 119};
+act2 aheroxy78_1d = {INIT_OBJXY, 1 * NORMAL_TPS + 12, HERO, 80, 42};
+act2 alab2_1d = {INIT_OBJXY, 0, PROF_1d, 100, 130};
+act2 abatxy_1d = {INIT_OBJXY, 0, BAT_1d, 95, 55};
+act2 ahchase2_1d = {INIT_OBJXY, 5 * NORMAL_TPS, DOG_1d, 280, 137};
+act2 aherofar_1d = {INIT_OBJXY, 0, HERO, 142, 25};
+act2 aheronear_1d = {INIT_OBJXY, 0, HERO, 230, 132};
+act2 aheroxy01_1d = {INIT_OBJXY, 0, HERO, 106, 130};
+act2 aheroxy10_1d = {INIT_OBJXY, 0, HERO, 33, 134};
+act2 aheroxy1011_1d = {INIT_OBJXY, 0, HERO, 76, 130};
+act2 aheroxy109_1d = {INIT_OBJXY, 0, HERO, 96, 105};
+act2 aheroxy1110_1d = {INIT_OBJXY, 0, HERO, 261, 77};
+act2 aheroxy1112_1d = {INIT_OBJXY, 0, HERO, 216, 134};
+act2 aheroxy115_1d = {INIT_OBJXY, 1, HERO, 27, 130};
+act2 aheroxy12_1d = {INIT_OBJXY, 1 * NORMAL_TPS + 12, HERO, 169, 90};
+act2 aheroxy1211_1d = {INIT_OBJXY, 0, HERO, 291, 42};
+act2 aheroxy1213_1d = {INIT_OBJXY, 0, HERO, 131, 110};
+act2 aheroxy13_1d = {INIT_OBJXY, 0, HERO, 40, 127};
+act2 aheroxy14_1d = {INIT_OBJXY, 1 * NORMAL_TPS + 12, HERO, 135, 115};
+act2 aheroxy15_1d = {INIT_OBJXY, 0, HERO, 270, 120};
+act2 aheroxy151_1d = {INIT_OBJXY, 0, HERO, 240, 55};
+act2 aheroxy21_1d = {INIT_OBJXY, 0, HERO, 130, 56};
+act2 aheroxy31_1d = {INIT_OBJXY, 0, HERO, 263, 126};
+act2 aheroxy35_1d = {INIT_OBJXY, 0, HERO, 253, 96};
+act2 aheroxy41_1d = {INIT_OBJXY, 0, HERO, 200, 56};
+act2 aheroxy51_1d = {INIT_OBJXY, 0, HERO, 200, 110};
+act2 aheroxy53_1d = {INIT_OBJXY, 0, HERO, 50, 90};
+act2 aheroxy56_1d = {INIT_OBJXY, 0, HERO, 290, 140};
+act2 aheroxy57_1d = {INIT_OBJXY, 0, HERO, 255, 107};
+act2 aheroxy65_1d = {INIT_OBJXY, 0, HERO, 215, 96};
+act2 aheroxy75_1d = {INIT_OBJXY, 0, HERO, 20, 110};
+act2 aheroxy87_1d = {INIT_OBJXY, 0, HERO, 235, 108};
+act2 aheroxy89_1d = {INIT_OBJXY, 0, HERO, 276, 135};
+act2 aheroxy910_1d = {INIT_OBJXY, 0, HERO, 50, 132};
+act2 aheroxy98_1d = {INIT_OBJXY, 0, HERO, 130, 120};
+act2 akchase2_1d = {INIT_OBJXY, 5 * NORMAL_TPS, DOG_1d, 30, 120};
+
+act3 abut4_1d = {PROMPT, 0, kSTsbut1_1d, repbut2_1d, kALbutyes_1d, kALbutno_1d, false};
+act3 ahelp1_1d = {PROMPT, 4 * 60 * NORMAL_TPS, kSTshelpp1_1d, repbut2_1d, kALhelpy_1d, kALhelpn_1d, false};
+act3 ahelp2_1d = {PROMPT, 5 * 60 * NORMAL_TPS, kSTshelpp2_1d, repbut2_1d, kALhelpy2_1d, kALhelpn_1d, false};
+act3 amanq1_1d = {PROMPT, 0, kSTsq1_1d, rep1_1d, kALrepyes1_1d, kALrepno1_1d, true};
+act3 amanq2_1d = {PROMPT, 0, kSTsq2_1d, rep2_1d, kALrepyes2_1d, kALrepno1_1d, true};
+act3 amanq3_1d = {PROMPT, 0, kSTsq3_1d, rep3_1d, kALrepyes3_1d, kALrepno1_1d, true};
+act3 amanq4_1d = {PROMPT, 0, kSTsq4_1d, rep4_1d, kALrepyes4_1d, kALrepno1_1d, true};
+act3 amanq5_1d = {PROMPT, 0, kSTsq5_1d, rep5_1d, kALrepyes5_1d, kALrepno1_1d, true};
+act3 amanq6_1d = {PROMPT, 0, kSTsq6_1d, rep6_1d, kALrepyes6_1d, kALrepno1_1d, true};
+act3 amanq7_1d = {PROMPT, 0, kSTsq7_1d, repbut2_1d, kALrepyes7_1d, kALrepno3_1d, false};
+act3 aopenp_1d = {PROMPT, 0, kSTsopenp_1d, repopen_1d, kALopenyes_1d, kALopenno_1d, false};
+
+act4 abg1_1d = {BKGD_COLOR, 0, _LIGHTYELLOW};
+act4 abg2_1d = {BKGD_COLOR, 2, _LIGHTMAGENTA};
+act4 abg3_1d = {BKGD_COLOR, 4, _LIGHTRED};
+act4 abg4_1d = {BKGD_COLOR, 6, _BLACK};
+act4 abg5_1d = {BKGD_COLOR, 8, _LIGHTYELLOW};
+act4 abg6_1d = {BKGD_COLOR, 10, _LIGHTMAGENTA};
+act4 abg7_1d = {BKGD_COLOR, 12, _LIGHTRED};
+act4 abg8_1d = {BKGD_COLOR, 14, _BLACK};
+act4 abk1_1d = {BKGD_COLOR, 0, _BLUE};
+act4 abk2_1d = {BKGD_COLOR, 2, _BLUE};
+act4 abknorm1_1d = {BKGD_COLOR, 0, _BLACK};
+act4 abknorm2_1d = {BKGD_COLOR, 3, _BLACK};
+
+act5 abox0_1d = {INIT_OBJVXY, 0, GDOOR_1d, 6, 0};
+act5 abox1_1d = {INIT_OBJVXY, 9, GDOOR_1d, 0, 0};
+act5 abox7_1d = {INIT_OBJVXY, 50, GDOOR_1d, -6, 0};
+act5 abox8_1d = {INIT_OBJVXY, 57, GDOOR_1d, 0, 0};
+act5 abox9_1d = {INIT_OBJVXY, 38, PROF_1d, -DX, 0};
+act5 adoggy5_1d = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 aguardgo3_1d = {INIT_OBJVXY, 0, GUARD_1d, -DX, 0};
+act5 ahin2_1d = {INIT_OBJVXY, 0, HERO, 0, 0}; // Stop hero!
+act5 alab3_1d = {INIT_OBJVXY, 0, PROF_1d, DX, 0};
+act5 alab6_1d = {INIT_OBJVXY, 12, PROF_1d, 0, 0};
+act5 alab7_1d = {INIT_OBJVXY, 16, IGOR_1d, 0, 0};
+act5 abatvxy1_1d = {INIT_OBJVXY, 0, BAT_1d, 2, -2};
+act5 abatvxy2_1d = {INIT_OBJVXY, 20, BAT_1d, -1, 1};
+act5 abatvxy3_1d = {INIT_OBJVXY, 40, BAT_1d, -1, -1};
+act5 abatvxy4_1d = {INIT_OBJVXY, 50, BAT_1d, -5, 0};
+act5 abatvxy5_1d = {INIT_OBJVXY, 60, BAT_1d, 0, 0};
+act5 aboatvxy1_1d = {INIT_OBJVXY, 0, BOAT_1w, 0, -2};
+act5 aboatvxy10_1d = {INIT_OBJVXY, 0, BOAT_1w, 9, 7};
+act5 aboatvxy11_1d = {INIT_OBJVXY, 3, BOAT_1w, 0, 0};
+act5 aboatvxy12_1d = {INIT_OBJVXY, 10, BOAT_1w, 1, 1};
+act5 aboatvxy2_1d = {INIT_OBJVXY, 10, BOAT_1w, -5, 0};
+act5 aboatvxy3_1d = {INIT_OBJVXY, 20, BOAT_1w, 2, 0};
+act5 aboatvxy4_1d = {INIT_OBJVXY, 50, BOAT_1w, 1, -1};
+act5 aboatvxy5_1d = {INIT_OBJVXY, 60, BOAT_1w, -2, -3};
+act5 aboatvxy6_1d = {INIT_OBJVXY, 70, BOAT_1w, -3, 0};
+act5 aboatvxy7_1d = {INIT_OBJVXY, 100, BOAT_1w, 0, -3};
+act5 aboatvxy8_1d = {INIT_OBJVXY, 104, BOAT_1w, -1, -1};
+act5 aboatvxy9_1d = {INIT_OBJVXY, 107, BOAT_1w, 0, 0};
+act5 abutvxy1_1d = {INIT_OBJVXY, 4 * NORMAL_TPS, BUTLER_1d, DX - 2, 0};
+act5 astophero_1d = {INIT_OBJVXY, 0, HERO, 0, 0}; // Stop hero!
+
+act6 adropchop_1d = {INIT_CARRY, 0, CHOP_1d, false};
+act6 a115c_1d = {INIT_CARRY, 0, MASK_1d, false};
+act6 abut7_1d = {INIT_CARRY, 0, CHOP_1d, true};
+act6 adropbung_1d = {INIT_CARRY, 0, BUNG_1d, false};
+act6 adropmask_1d = {INIT_CARRY, 0, MASK_1d, false};
+act6 adroppkin_1d = {INIT_CARRY, 0, PKIN_1d, false};
+
+act7 abut6e_1d = {INIT_HH_COORD, 7, HDLSHERO_1d}; // Remove hero's head
+act7 adoggy2_1d = {INIT_HH_COORD, 0, HERODEAD_1d};
+act7 ahchase1_1d = {INIT_HF_COORD, 5 * NORMAL_TPS, DOG_1d};// Set screen to hero's
+act7 akchase1_1d = {INIT_HF_COORD, 5 * NORMAL_TPS, DOG_1d}; // Set screen to hero's
+act7 amovekey_1d = {INIT_HF_COORD, 0, KEY_1d}; // Move key to hero's coords
+
+// Those two were originally defined as act11, but with the type INIT_HF_COORD
+// They are now defined as act7 to silence GCC warnings.
+act7 adog3_1d = {INIT_HF_COORD, 0, DOG_1d}; // Set correct screen
+act7 alab1_1d = {INIT_HF_COORD, 0, PROF_1d}; // Set correct screen
+
+act8 aopen78_1d = {NEW_SCREEN, 1 * NORMAL_TPS + 12, 8}; // Goto to Basement
+act8 atheend2_1d = {NEW_SCREEN, 5 * NORMAL_TPS, 14};
+act8 ascr01_1d = {NEW_SCREEN, 0, 1};
+act8 ascr10_1d = {NEW_SCREEN, 0, 0};
+act8 ascr1011_1d = {NEW_SCREEN, 0, 11};
+act8 ascr109_1d = {NEW_SCREEN, 0, 9};
+act8 ascr1110_1d = {NEW_SCREEN, 0, 10};
+act8 ascr1112_1d = {NEW_SCREEN, 0, 12};
+act8 ascr115_1d = {NEW_SCREEN, 1, 15};// Note delay for COND_CARRY
+act8 ascr12_1d = {NEW_SCREEN, 1 * NORMAL_TPS + 12, 2}; // Goto to Bed1
+act8 ascr1211_1d = {NEW_SCREEN, 0, 11};
+act8 ascr1213_1d = {NEW_SCREEN, 0, 13};
+act8 ascr13_1d = {NEW_SCREEN, 0, 3};
+act8 ascr14_1d = {NEW_SCREEN, 1 * NORMAL_TPS + 12, 4}; // Goto to Bathroom
+act8 ascr15_1d = {NEW_SCREEN, 0, 5};
+act8 ascr151_1d = {NEW_SCREEN, 0, 1};
+act8 ascr21_1d = {NEW_SCREEN, 0, 1};
+act8 ascr31_1d = {NEW_SCREEN, 0, 1};
+act8 ascr35_1d = {NEW_SCREEN, 0, 5};
+act8 ascr41_1d = {NEW_SCREEN, 0, 1};
+act8 ascr51_1d = {NEW_SCREEN, 0, 1};
+act8 ascr53_1d = {NEW_SCREEN, 0, 3};
+act8 ascr56_1d = {NEW_SCREEN, 0, 6};
+act8 ascr57_1d = {NEW_SCREEN, 0, 7};
+act8 ascr65_1d = {NEW_SCREEN, 0, 5};
+act8 ascr75_1d = {NEW_SCREEN, 0, 5};
+act8 ascr87_1d = {NEW_SCREEN, 0, 7};
+act8 ascr89_1d = {NEW_SCREEN, 0, 9};
+act8 ascr910_1d = {NEW_SCREEN, 0, 10};
+act8 ascr98_1d = {NEW_SCREEN, 0, 8};
+
+act9 aigor14_1d = {INIT_OBJSTATE, 0, GDOOR_1d, 2}; // Box now in state 2
+act9 aigor23_1d = {INIT_OBJSTATE, 0, GDOOR_1d, 3}; // Box now in state 3
+act9 aigor33_1d = {INIT_OBJSTATE, 0, GDOOR_1d, 4}; // Box now in state 4
+act9 a115g_1d = {INIT_OBJSTATE, 0, MASK_1d, 0}; // Say mask not worn!
+act9 abox12_1d = {INIT_OBJSTATE, 0, GDOOR_1d, 1}; // Box now in state 1
+act9 abut10_1d = {INIT_OBJSTATE, 10 * NORMAL_TPS, BUTLER_1d, 0}; // Ask again if we meet a bit later
+act9 abut4a_1d = {INIT_OBJSTATE, 0, BUTLER_1d, 1}; // Butler doesn't want to give chop
+act9 abut7a_1d = {INIT_OBJSTATE, 0, BUTLER_1d, 1}; // No more chops to give
+act9 ahin1_1d = {INIT_OBJSTATE, 0, HERO, 1};
+act9 ahout_1d = {INIT_OBJSTATE, 0, HERO, 0};
+act9 ast78_1d = {INIT_OBJSTATE, 1 * NORMAL_TPS + 12, TRAP_1d, 0}; // Close door after
+act9 aboatfar_1d = {INIT_OBJSTATE, 107, BOAT_1d, 1}; // Say boat on other side
+act9 aboatmov_1d = {INIT_OBJSTATE, 0, BOAT_1d, 2}; // Say boat moving
+act9 aboatnear_1d = {INIT_OBJSTATE, 13, BOAT_1d, 0}; // Say boat on near side
+act9 aompass_1d = {INIT_OBJSTATE, 0, OLDMAN_1d, 1}; // Oldman allows passage
+act9 ashedoil_1d = {INIT_OBJSTATE, 0, SHED_1d, 1};
+act9 ast01_1d = {INIT_OBJSTATE, 0, DOOR1_1d, 1}; // Close door after hero!
+act9 ast12_1d = {INIT_OBJSTATE, 1 * NORMAL_TPS + 12, DOOR2_1d, 0}; // Close door after
+act9 ast14_1d = {INIT_OBJSTATE, 1 * NORMAL_TPS + 12, DOOR3_1d, 0}; // Close door after
+act9 astatedoor4_1d = {INIT_OBJSTATE, 0, DOOR4_1d, 1}; // Change state to open
+
+act10 abata1a_1d = {INIT_PATH, 0, BAT2_1d, CHASE, DX * 2, DY * 2};
+act10 abata1b_1d = {INIT_PATH, 7, BAT2_1d, WANDER, DX, DY};
+act10 abata2a_1d = {INIT_PATH, 0, BAT3_1d, CHASE, DX * 2, DY * 2};
+act10 abata2b_1d = {INIT_PATH, 6, BAT3_1d, WANDER, DX, DY};
+act10 abata3a_1d = {INIT_PATH, 0, BAT4_1d, CHASE, DX * 2, DY * 2};
+act10 abata3b_1d = {INIT_PATH, 5, BAT4_1d, WANDER, DX, DY};
+act10 abata4a_1d = {INIT_PATH, 0, BAT5_1d, CHASE, DX * 2, DY * 2};
+act10 abata4b_1d = {INIT_PATH, 4, BAT5_1d, WANDER, DX, DY};
+act10 abin3_1d = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 about3_1d = {INIT_PATH, 0, HERO, USER, 0, 0};
+act10 abut2_1d = {INIT_PATH, 8 * NORMAL_TPS, BUTLER_1d, CHASE, DX - 2, DY - 2};
+act10 abut3_1d = {INIT_PATH, 0, HERO, AUTO, 0, 0}; // Stop HERO and prompt
+act10 abut8_1d = {INIT_PATH, 0, BUTLER_1d, WANDER, DX - 2, DY - 2};
+act10 abut9_1d = {INIT_PATH, 0, HERO, USER, 0, 0};
+act10 acyc1_1d = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 acyc2_1d = {INIT_PATH, 57, HERO, USER, 0, 0};
+act10 adef2_1d = {INIT_PATH, 1 * NORMAL_TPS, BAT2_1d, WANDER, DX, DY};
+act10 adef3_1d = {INIT_PATH, 1 * NORMAL_TPS, BAT3_1d, WANDER, DX, DY};
+act10 adef4_1d = {INIT_PATH, 1 * NORMAL_TPS, BAT4_1d, WANDER, DX, DY};
+act10 adef5_1d = {INIT_PATH, 1 * NORMAL_TPS, BAT5_1d, WANDER, DX, DY};
+act10 adog2_1d = {INIT_PATH, 0, DOG_1d, CHASE, DX * 2, DY * 2};
+act10 ahchase3_1d = {INIT_PATH, 5 * NORMAL_TPS, DOG_1d, CHASE, DX * 2, DY * 2};
+act10 ajail1_1d = {INIT_PATH, 0, HERO, AUTO, 0, 0}; // Stop user control
+act10 akchase3_1d = {INIT_PATH, 5 * NORMAL_TPS, DOG_1d, CHASE, DX * 2, DY * 2};
+act10 alab14_1d = {INIT_PATH, 40, IGOR_1d, WANDER, DX, 0};
+act10 amum2_1d = {INIT_PATH, 3 * NORMAL_TPS, MUMMY_1d, CHASE, DX * 2, DY * 2};
+
+act11 achkd0_1d = {COND_R, 0, GDOOR_1d, 0, kALok151_1d, kALchkd1_1d};
+act11 achkd1_1d = {COND_R, 0, GDOOR_1d, 1, kALdmsg1_1d, kALchkd2_1d};
+act11 achkd2_1d = {COND_R, 0, GDOOR_1d, 2, kALdmsg2_1d, kALchkd3_1d};
+act11 achkd3_1d = {COND_R, 0, GDOOR_1d, 3, kALdmsg3_1d, kALok151_1d};
+act11 achklab_1d = {COND_R, 0, GDOOR_1d, 0, kALprof_1d, 0};
+act11 aichk0_1d = {COND_R, 0, GDOOR_1d, 0, kALigor0_1d, kALichk1_1d}; // State 0 ?
+act11 aichk1_1d = {COND_R, 0, GDOOR_1d, 1, kALigor1_1d, kALichk2_1d}; // State 1 ?
+act11 aichk2_1d = {COND_R, 0, GDOOR_1d, 2, kALigor2_1d, kALichk3_1d}; // State 2 ?
+act11 aichk3_1d = {COND_R, 0, GDOOR_1d, 3, kALigor3_1d, kALinorm_1d}; // State 3 ?
+act11 a115a_1d = {COND_R, 0, MASK_1d, 1, kALswapmask_1d, 0}; // Remove mask if worn
+act11 abin_1d = {COND_R, 0, BUNG_1d, 0, kALnobung_1d, kALembark_1d};
+act11 abox_1d = {COND_R, 0, GDOOR_1d, 0, kALbox0_1d, 0};
+act11 abut3a_1d = {COND_R, 0, BUTLER_1d, 0, kALbutp_1d, 0};
+act11 abut5_1d = {COND_R, 0, MASK_1d, 0, kALbutchopped_1d, kALbutchop_1d};
+act11 abut6_1d = {COND_R, 0, MASK_1d, 0, kALbutchopped_1d, kALbutroam_1d};
+act11 achkmove_1d = {COND_R, 0, BOAT_1d, 2, kALmoving_1d, kALmoveboat_1d};
+act11 achkout_1d = {COND_R, 0, OLDMAN_1d, 1, kALdeboat_1d, kALnodeboat_1d};
+act11 achkpass_1d = {COND_R, 0, OLDMAN_1d, 1, kALomasked_1d, kALomask_1d};
+act11 achkrope_1d = {COND_R, 0, ROPE_1d, 1, kALchkmove_1d, kALnotcut_1d};
+act11 agetout_1d = {COND_R, 0, BOAT_1d, 0, kALdeboat_1d, kALchkout_1d};
+act11 aherochk_1d = {COND_R, 107, HERO, 1, kALherofar_1d, 0};
+act11 apush_1d = {COND_R, 0, BOAT_1d, 0, kALgofar_1d, kALcomenear_1d};
+act11 at78b_1d = {COND_R, 0, MASK_1d, 1, kALswapmask_1d, 0}; // Remove mask if worn
+act11 atcup0_1d = {COND_R, 0, CUPBOARD_1d, 0, kALcuptxt0_1d, kALlookcupb1_1d};
+act11 atcup1_1d = {COND_R, 0, CUPBOARD_1d, 1, kALcuptxt1_1d, kALlookcupb2_1d};
+act11 atcup2_1d = {COND_R, 0, CUPBOARD_1d, 2, kALcuptxt2_1d, kALcuptxt3_1d};
+act11 atrap_1d = {COND_R, 0, BOLT_1d, 2, kALopenpass_1d, kALopenfail_1d};
+
+act12 achopfail_1d = {TEXT, 0, kSTsthrown_1d};
+act12 achopthrown_1d = {TEXT, 5 * NORMAL_TPS, kSTsachopthrown_1d};
+act12 admsg1_1d = {TEXT, 0, kSTsadmsg1_1d};
+act12 admsg2_1d = {TEXT, 0, kSTsadmsg2_1d};
+act12 admsg3_1d = {TEXT, 0, kSTsadmsg3_1d};
+act12 aeatchop_1d = {TEXT, 0, kSTsaeatchop_1d};
+act12 agobox_1d = {TEXT, 0, kSTsagobox_1d};
+act12 aigor0_1d = {TEXT, 0, kSTsaigor0_1d};
+act12 aigor13_1d = {TEXT, 0, kSTsaigor13_1d};
+act12 aigor22_1d = {TEXT, 0, kSTsaigor22_1d};
+act12 aigor32_1d = {TEXT, 0, kSTsaigor32_1d};
+act12 ainorm_1d = {TEXT, 0, kSTsainorm_1d};
+act12 a115e_1d = {TEXT, 0, kSTsa115e_1d};
+act12 abat5a_1d = {TEXT, 0, kSTsabat5a_1d};
+act12 abat5b_1d = {TEXT, 0, kSTsabat5b_1d};
+act12 abin0_1d = {TEXT, 0, kSTokgen_1d};
+act12 ablowt_1d = {TEXT, 3 * NORMAL_TPS, kSTsablowt_1d};
+act12 abox2_1d = {TEXT, 16, kSTsabox2_1d};
+act12 abox3_1d = {TEXT, 16, kSTsabox3_1d};
+act12 abox5_1d = {TEXT, 38, kSTsabox5_1d};
+act12 abox6_1d = {TEXT, 44, kSTsabox6_1d};
+act12 abung1_1d = {TEXT, 0, kSTsabung1_1d};
+act12 abut11_1d = {TEXT, NORMAL_TPS / 3, kSTsabut11_1d};
+act12 abut6a_1d = {TEXT, 0, kSTsabut6a_1d};
+act12 abut6b_1d = {TEXT, 3, kSTsabut6b_1d};
+act12 abut6c_1d = {TEXT, 6, kSTsabut6c_1d};
+act12 abut9a_1d = {TEXT, NORMAL_TPS / 3, kSTsabut9a_1d};
+act12 abut9b_1d = {TEXT, NORMAL_TPS / 3 + 1, kSTsabut9b_1d};
+act12 acuptxt0_1d = {TEXT, 0, kSTsseepkdw_1d};
+act12 acuptxt1_1d = {TEXT, 0, kSTsseedw_1d};
+act12 acuptxt2_1d = {TEXT, 0, kSTsseepk_1d};
+act12 acuptxt3_1d = {TEXT, 0, kSTsnosee_1d};
+act12 adef6_1d = {TEXT, 1 * NORMAL_TPS, kSTsdefbat1_1d};
+act12 adef7_1d = {TEXT, 3 * NORMAL_TPS, kSTsdefbat2_1d};
+act12 adoggy4_1d = {TEXT, 0, kSTsadoggy4_1d};
+act12 adwwhy_1d = {TEXT, 0, kSTsadwwhy_1d};
+act12 agive1_1d = {TEXT, 0, kSTsagive1_1d};
+act12 agive2_1d = {TEXT, 0, kSTsagive2_1d};
+act12 ahelps1_1d = {TEXT, 0, kSTsahelps1_1d};
+act12 ahelps2_1d = {TEXT, 0, kSTsahelps2_1d};
+act12 ahout1_1d = {TEXT, 0, kSTokgen_1d};
+act12 ajails1_1d = {TEXT, 0, kSTsajails1_1d};
+act12 ajails2_1d = {TEXT, 0, kSTsajails2_1d};
+act12 ajails3_1d = {TEXT, 0, kSTsajails3_1d};
+act12 ajails4_1d = {TEXT, 0, kSTsajails4_1d};
+act12 alab12_1d = {TEXT, 24, kSTsalab12_1d};
+act12 alab13_1d = {TEXT, 24, kSTsalab13_1d};
+act12 amans1_1d = {TEXT, 0, kSTsamans1_1d};
+act12 amans3_1d = {TEXT, 0, kSTsamans3_1d};
+act12 amans4_1d = {TEXT, 0, kSTsamans4_1d};
+act12 amans5_1d = {TEXT, 0, kSTsamans5_1d};
+act12 amans6_1d = {TEXT, 0, kSTsamans6_1d};
+act12 amans7_1d = {TEXT, 0, kSTsamans7_1d};
+act12 amoving_1d = {TEXT, 0, kSTsamoving_1d};
+act12 amum3_1d = {TEXT, 0, kSTsabat5a_1d};
+act12 amum4_1d = {TEXT, 0, kSTsamum4_1d};
+act12 anodeboat_1d = {TEXT, 0, kSTsanodeboat_1d};
+act12 anogive_1d = {TEXT, 0, kSTsanogive_1d};
+act12 anohelp_1d = {TEXT, 0, kSTsanohelp_1d};
+act12 anoopen_1d = {TEXT, 0, kSTsanoopen_1d};
+act12 anotcut_1d = {TEXT, 0, kSTsanotcut_1d};
+act12 anought_1d = {TEXT, 1 * NORMAL_TPS, kSTsanought_1d};
+act12 aopen4_1d = {TEXT, 0, kSTsaopen4_1d};
+act12 aopenfail_1d = {TEXT, 0, kSTsaopenfail_1d};
+act12 apbreak_1d = {TEXT, 0, kSTspbreak_1d};
+act12 arepno5_1d = {TEXT, 0, kSTsarepno5_1d};
+act12 arepnop_1d = {TEXT, 0, kSTsarepnop_1d};
+act12 arepyep_1d = {TEXT, 0, kSTsarepyep_1d};
+act12 arepyep2_1d = {TEXT, 0, kSTsarepyep2_1d};
+act12 at78a_1d = {TEXT, 0, kSTsat78a_1d};
+act12 bye1_1d = {TEXT, 2 * NORMAL_TPS, kSTsabye1_1d};
+
+act13 aigor10_1d = {SWAP_IMAGES, 30, HERO, WHERO_1d};
+act13 aigor11_1d = {SWAP_IMAGES, 30, HERO, SPACHERO_1d};
+act13 aigor20_1d = {SWAP_IMAGES, 30, HERO, SPACHERO_1d};
+act13 aigor21_1d = {SWAP_IMAGES, 30, HERO, FUZYHERO_1d};
+act13 aigor30_1d = {SWAP_IMAGES, 30, HERO, FUZYHERO_1d};
+act13 aigor31_1d = {SWAP_IMAGES, 30, HERO, HERO};
+act13 abox4_1d = {SWAP_IMAGES, 20, HERO, WHERO_1d};
+act13 aswaphero_1d = {SWAP_IMAGES, 0, HERO, WHERO_1d};
+act13 aswapmask_1d = {SWAP_IMAGES, 0, HERO, MONKEY_1d};
+
+act14 athrowchop_1d = {COND_SCR, 0, HERO, 7, kALchoppass_1d, kALchopfail_1d};
+act14 ablow1_1d = {COND_SCR, 0, HERO, 1, kALchasehall_1d, kALcond5_1d};
+act14 achkscr_1d = {COND_SCR, 0, HERO, 12, kALgive_1d, kALnogive_1d};
+act14 acond5_1d = {COND_SCR, 0, HERO, 5, kALchasekit_1d, kALcond9_1d};
+act14 acond9_1d = {COND_SCR, 0, HERO, 9, kALdefbats_1d, kALnought_1d};
+
+act15 adogchop_1d = {AUTOPILOT, 0, DOG_1d, CHOP_1d, DX + 2, DY * 2};
+
+act16 abin1_1d = {INIT_OBJ_SEQ, 0, BOAT_1d, 1}; // Hero gets in boat
+act16 about1_1d = {INIT_OBJ_SEQ, 0, BOAT_1d, 0}; // Hero gets out of boat
+act16 aclosedoor2_1d = {INIT_OBJ_SEQ, 1 * NORMAL_TPS + 12, DOOR2_1d, 0};
+act16 aclosedoor3_1d = {INIT_OBJ_SEQ, 1 * NORMAL_TPS + 12, DOOR3_1d, 0};
+act16 acutrope_1d = {INIT_OBJ_SEQ, 0, ROPE_1d, 1};
+act16 adog5_1d = {INIT_OBJ_SEQ, 0, DOG_1d, 0}; // Go right
+act16 adogseq_1d = {INIT_OBJ_SEQ, 0, DOG_1d, 1}; // Go left
+act16 adogseq2_1d = {INIT_OBJ_SEQ, 4 * NORMAL_TPS, DOG_1d, 2}; // Sit up
+act16 aguardgo2_1d = {INIT_OBJ_SEQ, 0, GUARD_1d, 1};
+act16 ajail3_1d = {INIT_OBJ_SEQ, 0, HERO, 0}; // Hero dances for joy!
+act16 ajail4_1d = {INIT_OBJ_SEQ, 2, HERO, 1};
+act16 alab10_1d = {INIT_OBJ_SEQ, 14, PROF_1d, 1}; // Look to left
+act16 alab11_1d = {INIT_OBJ_SEQ, 18, IGOR_1d, 1}; // Look to left
+act16 alab4_1d = {INIT_OBJ_SEQ, 0, PROF_1d, 0}; // Walk to right
+act16 at78c_1d = {INIT_OBJ_SEQ, 1 * NORMAL_TPS + 12, TRAP_1d, 0};// Close trap
+act16 aturnguard_1d = {INIT_OBJ_SEQ, 2 * NORMAL_TPS, GUARD_1d, 0};
+
+act17 acupbdw_1d = {SET_STATE_BITS, 0, CUPBOARD_1d, 2};
+act17 acupbpk_1d = {SET_STATE_BITS, 0, CUPBOARD_1d, 1};
+
+act20 adef1_1d = {DEL_EVENTS, 1 * NORMAL_TPS, ASCHEDULE}; // Stop bats looping
+
+act21 abut6g_1d = {GAMEOVER, 7};
+act21 adoggy6_1d = {GAMEOVER, 0};
+
+act23 bye2_1d = {EXIT, 2 * NORMAL_TPS};
+
+act24 abonus0_1d = {BONUS, 0, 0};
+act24 abonus1_1d = {BONUS, 0, 1};
+act24 abonus2_1d = {BONUS, 0, 2};
+act24 abonus3_1d = {BONUS, 0, 3};
+act24 abonus4_1d = {BONUS, 0, 4};
+act24 abonus5_1d = {BONUS, 0, 5};
+act24 abonus6_1d = {BONUS, 0, 6};
+act24 abonus7_1d = {BONUS, 0, 7};
+act24 abonus8_1d = {BONUS, 0, 8};
+act24 abonus9_1d = {BONUS, 0, 9};
+
+act25 aichkbox_1d = {COND_BOX, 0, HERO, 100, 153, 144, 163, kALichk0_1d, kALgobox_1d};
+
+act27 abut7b_1d = {ADD_SCORE, 0, CHOP_1d}; // Manually add score
+
+act28 a115f_1d = {SUB_SCORE, 0, MASK_1d};
+
+act29 achkmask_1d = {COND_CARRY, 0, MASK_1d, kALputmask_1d, 0};
+act29 achkmask2_1d = {COND_CARRY, 0, MASK_1d, kALridmask_1d, 0};
+
+//Strangerke - act26 are stored in new act49, as songs were not handled the same way in DOS version (in harcoded strings)
+act49 ahchase4_1d = {OLD_SONG, 4 * NORMAL_TPS, kDTsong3_1d};
+act49 asong1_1d = {OLD_SONG, 0, kDTsong1_1d};
+act49 asong2_1d = {OLD_SONG, 1 * NORMAL_TPS, kDTsong2_1d};
+act49 asong3_1d = {OLD_SONG, 0, kDTsong3_1d};
+
+actListPtr ALbat_1d[] = {&abatxy_1d, &abatvxy1_1d, &abatvxy2_1d, &abatvxy3_1d, &abatvxy4_1d, &abatvxy5_1d, &arepbat_1d, 0};
+actListPtr ALbatattack_1d[] = {&abata1a_1d, &abata1b_1d, &abata1c_1d, &abata2a_1d, &abata2b_1d, &abata2c_1d, &abata3a_1d, &abata3b_1d, &abata3c_1d, &abata4a_1d, &abata4b_1d, &abata4c_1d, &arepbata_1d, 0};
+actListPtr ALbatrep_1d[] = {&abata1a_1d, &abata1b_1d, &abata2a_1d, &abata2b_1d, &abata3a_1d, &abata3b_1d, &abata4a_1d, &abata4b_1d, &arepbata_1d, 0};
+actListPtr ALbats_1d[] = {&adoggy1_1d, &adoggy2_1d, &adoggy3_1d, &abat5a_1d, &abat5b_1d, &adoggy5_1d, &adoggy6_1d, 0};
+actListPtr ALblinkeyes1_1d[] = {&ablink1a_1d, &ablink1b_1d, &ablink1c_1d, &ablink1d_1d, &ablink2a_1d, &ablink2b_1d, &ablink2c_1d, &ablink2d_1d, &arepeye_1d, 0};
+actListPtr ALblinkeyes2_1d[] = {&ablink3a_1d, &ablink3b_1d, &ablink3c_1d, &ablink3d_1d, &ablink4a_1d, &ablink4b_1d, &ablink4c_1d, &ablink4d_1d, &arepeye2_1d, 0};
+actListPtr ALblowdw_1d[] = {&ablow1_1d, 0};
+actListPtr ALbox0_1d[] = {&acycle_1d, &abox2_1d, &abox3_1d, &abox4_1d, &abox4a_1d, &abox5_1d, &abox6_1d, &abox9_1d, &abox10_1d, &abox11_1d, &abox12_1d, 0};
+actListPtr ALbox_1d[] = {&abox_1d, 0};
+actListPtr ALbut_1d[] = {&abut1_1d, &abutvxy1_1d, &abut2_1d, 0};
+actListPtr ALbutchop_1d[] = {&abut7_1d, &abut7a_1d, &abut7b_1d, &abut8_1d, &abut9_1d, &abut9a_1d, &abut9b_1d, 0};
+actListPtr ALbutchopped_1d[] = {&abut6a_1d, &abut6b_1d, &abut6c_1d, &abut6d_1d, &abut6e_1d, &abut6f_1d, &abut6g_1d, 0};
+actListPtr ALbutler_1d[] = {&abut3a_1d, 0};
+actListPtr ALbutno_1d[] = {&abut6_1d, 0};
+actListPtr ALbutp_1d[] = {/*&abut3_1d, */&abut4_1d, &abut4a_1d, 0};
+actListPtr ALbutroam_1d[] = {&abut8_1d, &abut9_1d, &abut10_1d, &abut11_1d, 0};
+actListPtr ALbutyes_1d[] = {&abut5_1d, 0};
+actListPtr ALchasehall_1d[] = {&ablowt_1d, &ahchase1_1d, &ahchase2_1d, &ahchase3_1d, &ahchase4_1d, 0};
+actListPtr ALchasekit_1d[] = {&ablowt_1d, &akchase1_1d, &akchase2_1d, &akchase3_1d, &ahchase4_1d, 0};
+actListPtr ALchkd1_1d[] = {&achkd1_1d, 0}; // State 1 ?
+actListPtr ALchkd2_1d[] = {&achkd2_1d, 0}; // State 2 ?
+actListPtr ALchkd3_1d[] = {&achkd3_1d, 0}; // State 3 ?
+actListPtr ALchkmove_1d[] = {&achkmove_1d, 0};
+actListPtr ALchkout_1d[] = {&achkout_1d, 0};
+actListPtr ALchopfail_1d[] = {&adropchop_1d, &aridchop_1d, &achopfail_1d, 0};
+actListPtr ALchoppass_1d[] = {&ashowchop_1d, &achopthrown_1d, &adropchop_1d, &achopxy_1d, &adogchop_1d, &adogseq_1d, &adogcyc_1d, &adogseq2_1d, 0};
+actListPtr ALclosedoor1_1d[] = {&aclosedoor1_1d, 0};
+actListPtr ALclosedoor4_1d[] = {&aclosedoor4_1d, 0};
+actListPtr ALclosetrap_1d[] = {&aclosetrap_1d, 0};
+actListPtr ALclosewdoors_1d[] = {&aclosewdoorl_1d, &aclosewdoorr_1d, 0};
+actListPtr ALcomenear_1d[] = {&aboatmov_1d, &aboatvxy10_1d, &aboatvxy11_1d, &aboatvxy12_1d, &aheronear_1d, &aboatnear_1d, 0};
+actListPtr ALcond5_1d[] = {&acond5_1d, 0};
+actListPtr ALcond9_1d[] = {&acond9_1d, 0};
+actListPtr ALcupbdw_1d[] = {&acupbdw_1d, &adwwhy_1d, 0};
+actListPtr ALcupbpk_1d[] = {&acupbpk_1d, 0};
+actListPtr ALcuptxt0_1d[] = {&acuptxt0_1d, 0};
+actListPtr ALcuptxt1_1d[] = {&acuptxt1_1d, 0};
+actListPtr ALcuptxt2_1d[] = {&acuptxt2_1d, 0};
+actListPtr ALcuptxt3_1d[] = {&acuptxt3_1d, 0};
+actListPtr ALcutrope_1d[] = {&acutrope_1d, 0};
+actListPtr ALcycle_1d[] = {&abox0_1d, &abox1_1d, &acyc1_1d, &acyc2_1d, &aweird_1d, &abox7_1d, &abox8_1d, 0};
+actListPtr ALdeboat_1d[] = {&ahout_1d, &ahout1_1d, &about1_1d, &about2_1d, &about3_1d, 0};
+actListPtr ALdefbats_1d[] = {&abonus6_1d, &adef1_1d, &adef2_1d, &adef3_1d, &adef4_1d, &adef5_1d, &adef6_1d, &adef7_1d, 0};
+actListPtr ALdmsg1_1d[] = {&admsg1_1d, 0};
+actListPtr ALdmsg2_1d[] = {&admsg2_1d, 0};
+actListPtr ALdmsg3_1d[] = {&admsg3_1d, 0};
+actListPtr ALdog_1d[] = {&asong3_1d, &adog1_1d, &adog2_1d, &adog3_1d, &adog4_1d, &adog5_1d, 0};
+actListPtr ALdoggy_1d[] = {&adoggy1_1d, &adoggy2_1d, &adoggy3_1d, &adoggy4_1d, &adoggy5_1d, &adoggy6_1d, 0};
+actListPtr ALdropmask_1d[] = {&adropmask_1d, 0};
+actListPtr ALeatchop_1d[] = {&adropchop_1d, &aeatchop_1d, &aridchop_1d, 0};
+actListPtr ALembark_1d[] = {&abin0_1d, &ahin1_1d, &ahin2_1d, &abin1_1d, &abin2_1d, &abin3_1d, 0};
+actListPtr ALend_1d[] = {&ajails1_1d, &ajails2_1d, &ajails3_1d, &ajails4_1d, 0};
+actListPtr ALgetinboat_1d[] = {&abin_1d, 0};
+actListPtr ALgetoutboat_1d[] = {&agetout_1d, 0};
+actListPtr ALgive_1d[] = {&abonus8_1d, &agive1_1d, &agive2_1d, &aguardgo1_1d, &aguardgo2_1d, &aguardgo3_1d, &aturnguard_1d, 0};
+actListPtr ALgobox_1d[] = {&agobox_1d, 0};
+actListPtr ALgofar_1d[] = {&aboatmov_1d, &aboatvxy1_1d, &aboatvxy2_1d, &aboatvxy3_1d, &aboatvxy4_1d, &aboatvxy5_1d, &aboatvxy6_1d, &aboatvxy7_1d, &aboatvxy8_1d, &aboatvxy9_1d, &aherochk_1d, &aboatfar_1d, 0};
+actListPtr ALgold_1d[] = {&achkscr_1d, 0};
+actListPtr ALhelp_1d[] = {&ahelp1_1d, &ahelp2_1d, 0};
+actListPtr ALhelpn_1d[] = {&anohelp_1d, 0};
+actListPtr ALhelpy2_1d[] = {&ahelps2_1d, 0};
+actListPtr ALhelpy_1d[] = {&ahelps1_1d, 0};
+actListPtr ALherofar_1d[] = {&aherofar_1d, 0};
+actListPtr ALichk0_1d[] = {&aichk0_1d, 0};
+actListPtr ALichk1_1d[] = {&aichk1_1d, 0};
+actListPtr ALichk2_1d[] = {&aichk2_1d, 0};
+actListPtr ALichk3_1d[] = {&aichk3_1d, 0};
+actListPtr ALightning_1d[] = {&abk1_1d, &abknorm1_1d, &abk2_1d, &abknorm2_1d, &areplight_1d, 0};
+actListPtr ALigor0_1d[] = {&aigor0_1d, 0};
+actListPtr ALigor1_1d[] = {&acycle_1d, &aigor10_1d, &aigor11_1d, &aigor12_1d, &aigor13_1d, &aigor14_1d, 0};
+actListPtr ALigor2_1d[] = {&acycle_1d, &aigor20_1d, &aigor21_1d, &aigor22_1d, &aigor23_1d, 0};
+actListPtr ALigor3_1d[] = {&acycle_1d, &aigor30_1d, &aigor31_1d, &aigor32_1d, &aigor33_1d, 0};
+actListPtr ALigor_1d[] = {&aichkbox_1d, 0}; // Make sure hero is in box!
+actListPtr ALinorm_1d[] = {&ainorm_1d, 0};
+actListPtr ALjail_1d[] = {&ajail1_1d, &ajail2_1d, &ajailrep_1d, &aend_1d, &atheend1_1d, &atheend2_1d, 0};
+actListPtr ALjailrep_1d[] = {&ajail3_1d, &ajail4_1d, &ajailrep_1d, 0};
+actListPtr ALlab_1d[] = {&achklab_1d, 0};
+actListPtr ALlookcupb1_1d[] = {&atcup1_1d, 0};
+actListPtr ALlookcupb2_1d[] = {&atcup2_1d, 0};
+actListPtr ALlookcupb_1d[] = {&abonus2_1d, &atcup0_1d, 0};
+actListPtr ALmoveboat_1d[] = {&apush_1d, 0};
+actListPtr ALmovecarp_1d[] = {&amovecarp1_1d, &amovecarp2_1d, &abonus9_1d, 0};
+actListPtr ALmoving_1d[] = {&amoving_1d, 0};
+actListPtr ALmum_1d[] = {&asong2_1d, &amdoor1_1d, &amum1_1d, &amum2_1d, 0};
+actListPtr ALmummy_1d[] = {&amum3_1d, &amum4_1d, &adoggy5_1d, &adoggy6_1d, 0};
+actListPtr ALnodeboat_1d[] = {&anodeboat_1d, 0};
+actListPtr ALnogive_1d[] = {&anogive_1d, 0};
+actListPtr ALnotcut_1d[] = {&anotcut_1d, 0};
+actListPtr ALnought_1d[] = {&anought_1d, 0};
+actListPtr ALok151_1d[] = {&aheroxy151_1d, &ascr151_1d, 0};
+actListPtr ALoldman_1d[] = {&achkpass_1d, 0};
+actListPtr ALomask_1d[] = {&amans3_1d, &amans4_1d, &amans5_1d, &amans6_1d, &amanq1_1d, 0};
+actListPtr ALomasked_1d[] = {&amans7_1d, 0};
+actListPtr ALopendoor1_1d[] = {&aopendoor1_1d, 0};
+actListPtr ALopendoor2_1d[] = {&astophero_1d, &aopendoor2_1d, &ast12_1d, &aheroxy12_1d, &aclosedoor2_1d, &ascr12_1d, 0};
+actListPtr ALopendoor3_1d[] = {&astophero_1d, &aopendoor3_1d, &ast14_1d, &aheroxy14_1d, &aclosedoor3_1d, &ascr14_1d, 0};
+actListPtr ALopendoor4_1d[] = {&aopenp_1d, 0};
+actListPtr ALopenfail_1d[] = {&aopenfail_1d, 0};
+actListPtr ALopenno_1d[] = {&anoopen_1d, 0};
+actListPtr ALopenpass_1d[] = {&abonus4_1d, &aopentrap_1d, &aheroxy78_1d, &ast78_1d, &at78c_1d, &aopen78_1d, &achkmask2_1d, 0};
+actListPtr ALopentrap_1d[] = {&atrap_1d, 0};
+actListPtr ALopenwdoors_1d[] = {&aopenwdoorl_1d, &aopenwdoorr_1d, 0};
+actListPtr ALopenyes_1d[] = {&abonus3_1d, &aopen4_1d, &aopendoor4_1d, &astatedoor4_1d, 0};
+actListPtr ALpkin_1d[] = {&abonus0_1d, &apbreak_1d, &ashowkey_1d, &aridpkin_1d, &adroppkin_1d, &amovekey_1d, 0};
+actListPtr ALplugbung_1d[] = {&aridbung_1d, &adropbung_1d, 0};
+actListPtr ALprof_1d[] = {&alab1_1d, &alab2_1d, &alab3_1d, &alab4_1d, &alab5_1d, &alab6_1d, &alab7_1d, &alab8_1d, &alab9_1d, &alab10_1d, &alab11_1d, &alab12_1d, &alab13_1d, &alab14_1d, 0};
+actListPtr ALpushboat_1d[] = {&achkrope_1d, 0};
+actListPtr ALputmask_1d[] = {&a115a_1d, &a115b_1d, &a115c_1d, &a115d_1d, &a115e_1d, &a115f_1d, &a115g_1d, 0};
+actListPtr ALreparm_1d[] = {&aarm_1d, &areparm_1d, 0};
+actListPtr ALreplips_1d[] = {&alips_1d, &areplips_1d, 0};
+actListPtr ALrepno1_1d[] = {&arepnop_1d, &amans1_1d, &aboatvxy9_1d, 0};
+actListPtr ALrepno3_1d[] = {&arepno5_1d, &aboatvxy9_1d, 0};
+actListPtr ALrepredeye_1d[] = {&ablink5a_1d, &ablink5b_1d, &ablink5c_1d, &ablink5d_1d, &arepredeye_1d, 0};
+actListPtr ALrepyes1_1d[] = {&arepyep_1d, &amanq2_1d, 0};
+actListPtr ALrepyes2_1d[] = {&arepyep_1d, &amanq3_1d, 0};
+actListPtr ALrepyes3_1d[] = {&arepyep_1d, &amanq4_1d, 0};
+actListPtr ALrepyes4_1d[] = {&amanq5_1d, 0};
+actListPtr ALrepyes5_1d[] = {&amanq6_1d, 0};
+actListPtr ALrepyes6_1d[] = {&amanq7_1d, 0};
+actListPtr ALrepyes7_1d[] = {&abonus7_1d, &arepyep2_1d, &aompass_1d, 0};
+actListPtr ALridmask_1d[] = {&at78a_1d, &at78b_1d, &adropmask_1d, 0};
+actListPtr ALridprof_1d[] = {&aridprof_1d, 0};
+actListPtr ALscr1011_1d[] = {&aswaphero_1d, &aheroxy1011_1d, &ascr1011_1d, 0};
+actListPtr ALscr109_1d[] = {&aheroxy109_1d, &ascr109_1d, 0};
+actListPtr ALscr10_1d[] = {&aheroxy10_1d, &ast01_1d, &ascr10_1d, 0};
+actListPtr ALscr1110_1d[] = {&aswaphero_1d, &aheroxy1110_1d, &ascr1110_1d, 0};
+actListPtr ALscr1112_1d[] = {&aswaphero_1d, &aheroxy1112_1d, &ascr1112_1d, 0};
+actListPtr ALscr115_1d[] = {&achkmask_1d, &aheroxy115_1d, &ascr115_1d, 0};
+actListPtr ALscr1211_1d[] = {&aswaphero_1d, &aheroxy1211_1d, &ascr1211_1d, 0};
+actListPtr ALscr1213_1d[] = {&aheroxy1213_1d, &ascr1213_1d, 0};
+actListPtr ALscr13_1d[] = {&aheroxy13_1d, &ascr13_1d, 0};
+actListPtr ALscr151_1d[] = {&achkd0_1d, 0}; // State 0 ?
+actListPtr ALscr15_1d[] = {&aheroxy15_1d, &ascr15_1d, 0};
+actListPtr ALscr1_1d[] = {&abonus1_1d, &aheroxy01_1d, &ascr01_1d, 0};
+actListPtr ALscr21_1d[] = {&aheroxy21_1d, &ascr21_1d, 0};
+actListPtr ALscr31_1d[] = {&aheroxy31_1d, &ascr31_1d, 0};
+actListPtr ALscr35_1d[] = {&aheroxy35_1d, &ascr35_1d, 0};
+actListPtr ALscr41_1d[] = {&aheroxy41_1d, &ascr41_1d, 0};
+actListPtr ALscr51_1d[] = {&aheroxy51_1d, &ascr51_1d, 0};
+actListPtr ALscr53_1d[] = {&aheroxy53_1d, &ascr53_1d, 0};
+actListPtr ALscr56_1d[] = {&aheroxy56_1d, &ascr56_1d, 0};
+actListPtr ALscr57_1d[] = {&aheroxy57_1d, &ascr57_1d, 0};
+actListPtr ALscr65_1d[] = {&aheroxy65_1d, &ascr65_1d, 0};
+actListPtr ALscr75_1d[] = {&aheroxy75_1d, &ascr75_1d, 0};
+actListPtr ALscr87_1d[] = {&aheroxy87_1d, &ascr87_1d, 0};
+actListPtr ALscr89_1d[] = {&abonus5_1d, &aheroxy89_1d, &ascr89_1d, 0};
+actListPtr ALscr910_1d[] = {&aheroxy910_1d, &ascr910_1d, 0};
+actListPtr ALscr98_1d[] = {&aheroxy98_1d, &ascr98_1d, 0};
+actListPtr ALshedoil_1d[] = {&ashedoil_1d, 0};
+actListPtr ALsong1_1d[] = {&asong1_1d, 0};
+actListPtr ALswapmask_1d[] = {&aswapmask_1d, 0};
+actListPtr ALthrowchop_1d[] = {&athrowchop_1d, 0};
+actListPtr ALweird_1d[] = {&abg1_1d, &abg2_1d, &abg3_1d, &abg4_1d, &abg5_1d, &abg6_1d, &abg7_1d, &abg8_1d, 0};
+actListPtr ALnobung_1d[] = {&abung1_1d, 0};
+actListPtr ALgoodbye_1d[] = {&bye1_1d, &bye2_1d, 0};
+
+actList actListArr_1d[] = {
+ ALDummy, ALbat_1d, ALbatattack_1d, ALbatrep_1d, ALbats_1d,
+ ALblinkeyes1_1d, ALblinkeyes2_1d, ALblowdw_1d, ALbox0_1d, ALbox_1d,
+ ALbut_1d, ALbutchop_1d, ALbutchopped_1d, ALbutler_1d, ALbutno_1d,
+ ALbutp_1d, ALbutroam_1d, ALbutyes_1d, ALchasehall_1d, ALchasekit_1d,
+ ALchkd1_1d, ALchkd2_1d, ALchkd3_1d, ALchkmove_1d, ALchkout_1d,
+ ALchopfail_1d, ALchoppass_1d, ALclosedoor1_1d, ALclosedoor4_1d, ALclosetrap_1d,
+ ALclosewdoors_1d, ALcomenear_1d, ALcond5_1d, ALcond9_1d, ALcupbdw_1d,
+ ALcupbpk_1d, ALcuptxt0_1d, ALcuptxt1_1d, ALcuptxt2_1d, ALcuptxt3_1d,
+ ALcutrope_1d, ALcycle_1d, ALdeboat_1d, ALdefbats_1d, ALdmsg1_1d,
+ ALdmsg2_1d, ALdmsg3_1d, ALdog_1d, ALdoggy_1d, ALdropmask_1d,
+ ALeatchop_1d, ALembark_1d, ALend_1d, ALgetinboat_1d, ALgetoutboat_1d,
+ ALgive_1d, ALgobox_1d, ALgofar_1d, ALgold_1d, ALhelp_1d,
+ ALhelpn_1d, ALhelpy2_1d, ALhelpy_1d, ALherofar_1d, ALichk0_1d,
+ ALichk1_1d, ALichk2_1d, ALichk3_1d, ALightning_1d, ALigor0_1d,
+ ALigor1_1d, ALigor2_1d, ALigor3_1d, ALigor_1d, ALinorm_1d,
+ ALjail_1d, ALjailrep_1d, ALlab_1d, ALlookcupb1_1d, ALlookcupb2_1d,
+ ALlookcupb_1d, ALmoveboat_1d, ALmovecarp_1d, ALmoving_1d, ALmum_1d,
+ ALmummy_1d, ALnodeboat_1d, ALnogive_1d, ALnotcut_1d, ALnought_1d,
+ ALok151_1d, ALoldman_1d, ALomask_1d, ALomasked_1d, ALopendoor1_1d,
+ ALopendoor2_1d, ALopendoor3_1d, ALopendoor4_1d, ALopenfail_1d, ALopenno_1d,
+ ALopenpass_1d, ALopentrap_1d, ALopenwdoors_1d, ALopenyes_1d, ALpkin_1d,
+ ALplugbung_1d, ALprof_1d, ALpushboat_1d, ALputmask_1d, ALreparm_1d,
+ ALreplips_1d, ALrepno1_1d, ALrepno3_1d, ALrepredeye_1d, ALrepyes1_1d,
+ ALrepyes2_1d, ALrepyes3_1d, ALrepyes4_1d, ALrepyes5_1d, ALrepyes6_1d,
+ ALrepyes7_1d, ALridmask_1d, ALridprof_1d, ALscr1011_1d, ALscr109_1d,
+ ALscr10_1d, ALscr1110_1d, ALscr1112_1d, ALscr115_1d, ALscr1211_1d,
+ ALscr1213_1d, ALscr13_1d, ALscr151_1d, ALscr15_1d, ALscr1_1d,
+ ALscr21_1d, ALscr31_1d, ALscr35_1d, ALscr41_1d, ALscr51_1d,
+ ALscr53_1d, ALscr56_1d, ALscr57_1d, ALscr65_1d, ALscr75_1d,
+ ALscr87_1d, ALscr89_1d, ALscr910_1d, ALscr98_1d, ALshedoil_1d,
+ ALsong1_1d, ALswapmask_1d, ALthrowchop_1d, ALweird_1d, ALnobung_1d,
+ ALgoodbye_1d
+};
+
+// Hugo 2 DOS
+int dialrsp_2d[] = {kSTSdial2_2d, -1};
+int hestrsp_2d[] = {kSTYes_2d, -1};
+int whorsp_2d[] = {kSTNobody_2d, kSTNo_one1_2d, kSTNo_one2_2d, kSTSharry_2d, -1};
+
+act0 aclimax_2d = {ASCHEDULE, 20, kALclimax_2d};
+act0 aclue09_2d = {ASCHEDULE, 300 * NORMAL_TPS, kALchkc09_2d};
+act0 ahdrink10_2d = {ASCHEDULE, 52, kALhfaint_2d};
+act0 aschedbut_2d = {ASCHEDULE, 30, kALschedbut_2d};
+act0 arepbuga_2d = {ASCHEDULE, 3 * NORMAL_TPS, kALbugrep1_2d};
+act0 arepbugf_2d = {ASCHEDULE, 2 * NORMAL_TPS, kALbugrep2_2d};
+act0 arepblah_2d = {ASCHEDULE, 12 * NORMAL_TPS, kALblah_2d};
+act0 arepmsg1_2d = {ASCHEDULE, 120 * NORMAL_TPS, kALrepmsg1_2d};
+
+act1 aback1_2d = {START_OBJ, 0, CAT_2d, 0, ALMOST_INVISIBLE};
+act1 aback2_2d = {START_OBJ, 2, CAT_2d, 0, NOT_CYCLING};
+act1 aball3_2d = {START_OBJ, 0, BALLOON_2d, 0, ALMOST_INVISIBLE};
+act1 abel1_2d = {START_OBJ, 0, BELL_2d, 0, NOT_CYCLING};
+act1 acook7_2d = {START_OBJ, 60, COOKB_2d, 0, ALMOST_INVISIBLE};
+act1 acook8_2d = {START_OBJ, 60, COOK_2d, 0, NOT_CYCLING};
+act1 acop1_2d = {START_OBJ, 0, COP_2d, 0, CYCLE_FORWARD};
+act1 acop3_2d = {START_OBJ, 12, COP_2d, 0, ALMOST_INVISIBLE};
+act1 adalek5_2d = {START_OBJ, 4, DALEK_2d, 0, CYCLE_FORWARD};
+act1 adead1_2d = {START_OBJ, 0, HERO, 0, ALMOST_INVISIBLE};
+act1 adead3_2d = {START_OBJ, 0, PENNYLIE_2d, 0, NOT_CYCLING};
+act1 adone12_2d = {START_OBJ, 10, HERO, 0, CYCLE_FORWARD};
+act1 adone5_2d = {START_OBJ, 0, HORACE_2d, 0, CYCLE_FORWARD};
+act1 adyn2_2d = {START_OBJ, 0, DYNAMITE_2d, 0, NOT_CYCLING};
+act1 afall2_2d = {START_OBJ, 0, PENFALL_2d, 0, CYCLE_FORWARD};
+act1 afuze2_2d = {START_OBJ, 0, DYNAMITE_2d, 0, CYCLE_FORWARD};
+act1 agenie2_2d = {START_OBJ, 0, GENIE_2d, 0, CYCLE_FORWARD};
+act1 agiveb4_2d = {START_OBJ, 2, CAT_2d, 0, CYCLE_FORWARD};
+act1 agiveb7_2d = {START_OBJ, 0, CAT_2d, 0, ALMOST_INVISIBLE};
+act1 aglightoff1_2d = {START_OBJ, 0, GATELIGHT_2d, 0, ALMOST_INVISIBLE};
+act1 aglighton1_2d = {START_OBJ, 0, GATELIGHT_2d, 0, NOT_CYCLING};
+act1 ahdrink3_2d = {START_OBJ, 0, HESTER_2d, 0, CYCLE_FORWARD};
+act1 ahdrink6_2d = {START_OBJ, 50, HESTER_2d, 0, NOT_CYCLING};
+act1 ahest11_2d = {START_OBJ, 47, HESTER_2d, 0, NOT_CYCLING};
+act1 ahest2_2d = {START_OBJ, 0, HESTER_2d, 0, CYCLE_FORWARD};
+act1 ahfaint1_2d = {START_OBJ, 4, HERO, 0, ALMOST_INVISIBLE};
+act1 ahfaint3_2d = {START_OBJ, 4, PENNYLIE_2d, 0, NOT_CYCLING};
+act1 ahfaint4_2d = {START_OBJ, 8, PENNYLIE_2d, 0, ALMOST_INVISIBLE};
+act1 ahfaint5_2d = {START_OBJ, 8, HERO, 0, NOT_CYCLING};
+act1 akeyhole5_2d = {START_OBJ, 0, HERO, 0, ALMOST_INVISIBLE};
+act1 amaidb2_2d = {START_OBJ, 0, MAID_2d, 0, CYCLE_FORWARD};
+act1 amaidb5_2d = {START_OBJ, 10, MAID_2d, 0, ALMOST_INVISIBLE};
+act1 amaidbk3_2d = {START_OBJ, 0, MAID_2d, 0, CYCLE_FORWARD};
+act1 amaidbk7_2d = {START_OBJ, 10, MAID_2d, 0, NOT_CYCLING};
+act1 amat2_2d = {START_OBJ, 0, MATCHES_2d, 0, NOT_CYCLING};
+act1 amurd3_2d = {START_OBJ, 30, HERO, 0, NOT_CYCLING};
+act1 aom15_2d = {START_OBJ, 59, OLDMAN_2d, 0, ALMOST_INVISIBLE};
+act1 aom18_2d = {START_OBJ, 60, HERO, 0, NOT_CYCLING};
+act1 aom19_2d = {START_OBJ, 60, OLDMAN_2d, 0, NOT_CYCLING};
+act1 aomridlip_2d = {START_OBJ, 49, LIPS_2d, 0, ALMOST_INVISIBLE};
+act1 aopendoor1_2d = {START_OBJ, 0, DOOR1_2d, 1, CYCLE_FORWARD};
+act1 apaper2_2d = {START_OBJ, 0, PAPER_2d, 0, NOT_CYCLING};
+act1 aridban_2d = {START_OBJ, 0, BANANA_2d, 0, ALMOST_INVISIBLE};
+act1 aridcooklips_2d = {START_OBJ, 22, LIPS_2d, 0, ALMOST_INVISIBLE};
+act1 aridgard2_2d = {START_OBJ, 0, GARDENER_2d, 0, CYCLE_FORWARD};
+act1 aridgard6_2d = {START_OBJ, 20, GARDENER_2d, 0, ALMOST_INVISIBLE};
+act1 aridgarl_2d = {START_OBJ, 0, GARLIC_2d, 0, ALMOST_INVISIBLE};
+act1 aslightoff1_2d = {START_OBJ, 0, SHEDLIGHT_2d, 0, ALMOST_INVISIBLE};
+act1 aslighton1_2d = {START_OBJ, 0, SHEDLIGHT_2d, 0, NOT_CYCLING};
+act1 astick5_2d = {START_OBJ, 0, DOG_2d, 0, CYCLE_FORWARD};
+act1 astick7_2d = {START_OBJ, 16, DOG_2d, 0, ALMOST_INVISIBLE};
+act1 azapperoff1_2d = {START_OBJ, 0, ZAPPER_2d, 0, ALMOST_INVISIBLE};
+act1 azapperon1_2d = {START_OBJ, 0, ZAPPER_2d, 0, NOT_CYCLING};
+act1 afaint2_2d = {START_OBJ, 10, HERO, 0, ALMOST_INVISIBLE};
+act1 afaint4_2d = {START_OBJ, 10, PENNYLIE_2d, 0, NOT_CYCLING};
+act1 afaint6_2d = {START_OBJ, 30, PENNYLIE_2d, 0, ALMOST_INVISIBLE};
+act1 afaint7_2d = {START_OBJ, 30, HERO, 0, NOT_CYCLING};
+act1 agone1_2d = {START_OBJ, 23, HERO, 0, ALMOST_INVISIBLE};
+act1 agone14_2d = {START_OBJ, 129, HERO, 0, CYCLE_FORWARD};
+act1 agone2_2d = {START_OBJ, 120, PENNYLIE_2d, 0, ALMOST_INVISIBLE};
+act1 agone4_2d = {START_OBJ, 120, HERO, 0, NOT_CYCLING};
+act1 aharry1_2d = {START_OBJ, 0, HARRY_2d, 0, NOT_CYCLING};
+act1 aharry6_2d = {START_OBJ, 4, HARRY_2d, 0, CYCLE_FORWARD};
+act1 amaidc10_2d = {START_OBJ, 26, MAID_2d, 0, ALMOST_INVISIBLE};
+act1 amaidc14_2d = {START_OBJ, 30, MAID_2d, 0, NOT_CYCLING};
+act1 amaidc5_2d = {START_OBJ, 8, MAID_2d, 0, CYCLE_FORWARD};
+act1 aopendoor2_2d = {START_OBJ, 0, DOOR2_2d, 1, CYCLE_FORWARD};
+act1 aopendoor3_2d = {START_OBJ, 0, DOOR3_2d, 1, CYCLE_FORWARD};
+act1 apenblie1_2d = {START_OBJ, 30, PENNY_2d, 0, ALMOST_INVISIBLE};
+act1 apenblie2_2d = {START_OBJ, 30, PENNYLIE_2d, 0, NOT_CYCLING};
+act1 apenbstart_2d = {START_OBJ, 0, PENNY_2d, 0, CYCLE_FORWARD};
+act1 apenbstop_2d = {START_OBJ, 20, PENNY_2d, 0, NOT_CYCLING};
+act1 apeng1_2d = {START_OBJ, 23, HERO, 0, ALMOST_INVISIBLE};
+act1 apeng3_2d = {START_OBJ, 40, HERO, 0, NOT_CYCLING};
+act1 aridmaidlips_2d = {START_OBJ, 15, LIPS_2d, 0, ALMOST_INVISIBLE};
+act1 aherostart_2d = {START_OBJ, 0, HERO, 0, NOT_CYCLING};
+act1 apenstart_2d = {START_OBJ, PENDELAY + 10, PENNY_2d, 0, CYCLE_FORWARD};
+act1 apenstop_2d = {START_OBJ, PENDELAY + 70, PENNY_2d, 0, NOT_CYCLING};
+
+act2 aback3_2d = {INIT_OBJXY, 2, CAT_2d, 189, 69};
+act2 abanana10_2d = {INIT_OBJXY, 16, GENIE_2d, 212, 10};
+act2 abanana11_2d = {INIT_OBJXY, 18, GENIE_2d, 209, 20};
+act2 abanana12_2d = {INIT_OBJXY, 20, GENIE_2d, 206, 40};
+act2 abanana13_2d = {INIT_OBJXY, 22, GENIE_2d, 200, 65};
+act2 abanana5_2d = {INIT_OBJXY, 00, GENIE_2d, 203, 60};
+act2 abanana6_2d = {INIT_OBJXY, 02, GENIE_2d, 206, 40};
+act2 abanana7_2d = {INIT_OBJXY, 04, GENIE_2d, 209, 20};
+act2 abanana8_2d = {INIT_OBJXY, 06, GENIE_2d, 212, 10};
+act2 abd1_2d = {INIT_OBJXY, 0, HERO, 214, 92};
+act2 abd10_2d = {INIT_OBJXY, 0, HERO, 20, 92};
+act2 abd20_2d = {INIT_OBJXY, 0, HERO, 20, 92};
+act2 abed2_1_2d = {INIT_OBJXY, 0, HERO, 200, 95};
+act2 abed3_1_2d = {INIT_OBJXY, 0, HERO, 60, 120};
+act2 abel3_2d = {INIT_OBJXY, 0, BELL_2d, 185, 110};
+act2 aboomxy_2d = {INIT_OBJXY, 0, PENNYLIE_2d, 120, 110};
+act2 acatroom1_2d = {INIT_OBJXY, 0, HERO, 258, 98};
+act2 achasm25_2d = {INIT_OBJXY, 0, HERO, 155, 20};
+act2 adumb1_2d = {INIT_OBJXY, 0, HERO, 36, 107};
+act2 adumb11_2d = {INIT_OBJXY, 0, HERO, 64, 103};
+act2 afall1_2d = {INIT_OBJXY, 0, PENFALL_2d, 188, 95};
+act2 agard3_2d = {INIT_OBJXY, 0, GARDENER_2d, 190, 90};
+act2 agates1_2d = {INIT_OBJXY, 0, HERO, 279, 108};
+act2 agates11_2d = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 agiveb6_2d = {INIT_OBJXY, 2, CAT_2d, 157, 96};
+act2 ahall1_1_2d = {INIT_OBJXY, 0, HERO, 14, 92};
+act2 ahall1_2_2d = {INIT_OBJXY, 0, HERO, 35, 130};
+act2 ahall2_1_2d = {INIT_OBJXY, 0, HERO, 61, 105};
+act2 ahall2_2_2d = {INIT_OBJXY, 0, HERO, 231, 120};
+act2 ahall2_3_2d = {INIT_OBJXY, 0, HERO, 182, 122};
+act2 ahall2_4_2d = {INIT_OBJXY, 0, HERO, 160, 140};
+act2 ahall2_5_2d = {INIT_OBJXY, 0, HERO, 264, 117};
+act2 ahall3_1_2d = {INIT_OBJXY, 0, HERO, 147, 112};
+act2 ahall3_2_2d = {INIT_OBJXY, 0, HERO, 42, 41};
+act2 aheroxy12_2d = {INIT_OBJXY, DOORDELAY, HERO, 100, 125};
+act2 ahest1_2d = {INIT_OBJXY, 0, HESTER_2d, 78, 114};
+act2 ahestroom1_2d = {INIT_OBJXY, 0, HERO, 108, 76};
+act2 ainshed1_2d = {INIT_OBJXY, 0, HERO, 140, 88};
+act2 akennel1_2d = {INIT_OBJXY, 0, HERO, 283, 63};
+act2 akit1_2d = {INIT_OBJXY, 0, HERO, 145, 120};
+act2 akit11_2d = {INIT_OBJXY, 0, HERO, 40, 108};
+act2 aladder1_2d = {INIT_OBJXY, 0, HERO, 282, 107};
+act2 alamp1_2d = {INIT_OBJXY, 0, HERO, 26, 46};
+act2 alounge1_2d = {INIT_OBJXY, 0, HERO, 232, 55};
+act2 amaidbk8_2d = {INIT_OBJXY, 12, MAID_2d, 207, 99};
+act2 amat4_2d = {INIT_OBJXY, 0, MATCHES_2d, 216, 146};
+act2 amurd2_2d = {INIT_OBJXY, 26, MURDER_2d, 120, 86};
+act2 amush1_2d = {INIT_OBJXY, 0, HERO, 272, 107};
+act2 amush11_2d = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 amush21_2d = {INIT_OBJXY, 0, HERO, 95, 26};
+act2 aom17_2d = {INIT_OBJXY, 60, OLDMAN_2d, 155, 95};
+act2 aorgan1_2d = {INIT_OBJXY, 0, HERO, 241, 76};
+act2 apanel2_2d = {INIT_OBJXY, 0, PANEL_2d, 189, 91};
+act2 apanel4_2d = {INIT_OBJXY, 20, HERO, 192, 95};
+act2 apaper4_2d = {INIT_OBJXY, 0, PAPER_2d, 138, 130};
+act2 aparlor1_2d = {INIT_OBJXY, 0, HERO, 75, 75};
+act2 aparlor2_2d = {INIT_OBJXY, 0, HERO, 86, 30};
+act2 aparlor3_2d = {INIT_OBJXY, 2, HERO, 263, 114};
+act2 aparty1b_2d = {INIT_OBJXY, 0, COP_2d, 80, 115};
+act2 aparty2b_2d = {INIT_OBJXY, 0, MAID_2d, 100, 130};
+act2 aparty3b_2d = {INIT_OBJXY, 0, HESTER_2d, 120, 120};
+act2 aparty4b_2d = {INIT_OBJXY, 0, GARDENER_2d, 140, 120};
+act2 aparty5b_2d = {INIT_OBJXY, 0, SNAKE_2d, 80, 150};
+act2 aparty6b_2d = {INIT_OBJXY, 0, GENIE_2d, 70, 120};
+act2 aparty7b_2d = {INIT_OBJXY, 0, HARRY_2d, 150, 130};
+act2 aparty8b_2d = {INIT_OBJXY, 0, DOCTOR_2d, 170, 100};
+act2 aparty9b_2d = {INIT_OBJXY, 0, COOK_2d, 200, 110};
+act2 apass1_2d = {INIT_OBJXY, 0, HERO, 262, 45};
+act2 apass11_2d = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 apen4_2d = {INIT_OBJXY, 0, HERO, 147, 112};
+act2 aphone1_2d = {INIT_OBJXY, 0, HERO, 286, 108};
+act2 aphone11c_2d = {INIT_OBJXY, 0, HERO, 146, 127};
+act2 aphone11l_2d = {INIT_OBJXY, 0, HERO, 285, 87};
+act2 aphone11r_2d = {INIT_OBJXY, 0, HERO, 18, 93};
+act2 aretupxy_2d = {INIT_OBJXY, 0, HERO, 61, 81};
+act2 aridgard3_2d = {INIT_OBJXY, 4, GARDENER_2d, 190, 88};
+act2 arockg1_2d = {INIT_OBJXY, 0, HERO, 146, 122};
+act2 arxy_2d = {INIT_OBJXY, 0, HERO, 75, 73};
+act2 arxy21_2d = {INIT_OBJXY, 0, HERO, 205, 82};
+act2 ascr33c_2d = {INIT_OBJXY, 4, HERO, 160, 105};
+act2 ashed1_2d = {INIT_OBJXY, 0, HERO, 139, 139};
+act2 ashed11_2d = {INIT_OBJXY, 0, HERO, 54, 89};
+act2 ashed21_2d = {INIT_OBJXY, 0, HERO, 13, 124};
+act2 asnake1_2d = {INIT_OBJXY, 0, HERO, 264, 79};
+act2 asnake11_2d = {INIT_OBJXY, 0, HERO, 14, 66};
+act2 asnake21_2d = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 astick3_2d = {INIT_OBJXY, 0, DOG_2d, 165, 80};
+act2 astream1_2d = {INIT_OBJXY, 0, HERO, 283, 124};
+act2 astream11_2d = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 athree1_2d = {INIT_OBJXY, 0, HERO, 268, 50};
+act2 athree11_2d = {INIT_OBJXY, 0, HERO, 272, 69};
+act2 athree21_2d = {INIT_OBJXY, 0, HERO, 19, 81};
+act2 athree31_2d = {INIT_OBJXY, 0, HERO, 18, 107};
+act2 atrap1_2d = {INIT_OBJXY, 0, HERO, 209, 35};
+act2 atrap2_2d = {INIT_OBJXY, 0, HERO, 270, 87};
+act2 auptrap1_2d = {INIT_OBJXY, 0, HERO, 193, 101};
+act2 avenus1_2d = {INIT_OBJXY, 0, HERO, 275, 130};
+act2 awell1_2d = {INIT_OBJXY, 0, HERO, 146, 131};
+act2 awho3_2d = {INIT_OBJXY, 0, HERO, 255, 39};
+act2 azap1_2d = {INIT_OBJXY, 0, HERO, 284, 110};
+act2 azap11_2d = {INIT_OBJXY, 0, HERO, 25, 64};
+act2 abuga1c_2d = {INIT_OBJXY, 0, BUG1_2d, 165, 25};
+act2 abuga2c_2d = {INIT_OBJXY, 0, BUG2_2d, 265, 95};
+act2 abuga3c_2d = {INIT_OBJXY, 0, BUG3_2d, 255, 110};
+act2 abuga4c_2d = {INIT_OBJXY, 0, BUG4_2d, 300, 120};
+act2 abuga5c_2d = {INIT_OBJXY, 0, BUG5_2d, 175, 130};
+act2 abugf1c_2d = {INIT_OBJXY, 0, BUG1_2d, 65, 25};
+act2 abugf2c_2d = {INIT_OBJXY, 0, BUG2_2d, 245, 85};
+act2 abugf3c_2d = {INIT_OBJXY, 0, BUG3_2d, 155, 60};
+act2 abugf4c_2d = {INIT_OBJXY, 0, BUG4_2d, 270, 25};
+act2 abugf5c_2d = {INIT_OBJXY, 0, BUG5_2d, 175, 30};
+act2 agone3_2d = {INIT_OBJXY, 120, HERO, 229, 119};
+act2 aheroxy11_2d = {INIT_OBJXY, 0, HERO, 160, 100};
+act2 aheroxy3435_2d = {INIT_OBJXY, DOORDELAY, HERO, 76, 133};
+act2 aheroxy3436_2d = {INIT_OBJXY, DOORDELAY, HERO, 246, 120};
+act2 amaidc12_2d = {INIT_OBJXY, 30, MAID_2d, 207, 99};
+act2 amaidc3_2d = {INIT_OBJXY, 8, MAID_2d, 74, 78};
+act2 amaidp2_2d = {INIT_OBJXY, 0, MAID_2d, 207, 99};
+act2 amazexy_2d = {INIT_OBJXY, 0, HERO, 134, 92};
+act2 apenbxy1_2d = {INIT_OBJXY, 0, PENNY_2d, 129, 119};
+act2 apenbxy2_2d = {INIT_OBJXY, 30, PENNYLIE_2d, 215, 125};
+act2 apeng2_2d = {INIT_OBJXY, 23, HERO, 192, 93};
+act2 aheroxy01_2d = {INIT_OBJXY, 0, HERO, 169, 141};
+act2 apenxy_2d = {INIT_OBJXY, 0, PENNY_2d, 109, 140};
+
+act3 aclimax7_2d = {PROMPT, 100, kSTSclimax7_2d, whorsp_2d, kALcheat_2d, kALdidnt_2d, false};
+act3 adial_2d = {PROMPT, 0, kSTSdial1_2d, dialrsp_2d, kALwho_2d, kALnoreply_2d, false};
+act3 ahestd3_2d = {PROMPT, 0, kSTShest1_2d, hestrsp_2d, kALhdrink_2d, kALnodrink_2d, false};
+act3 asafepr_2d = {PROMPT, 0, kSTSafepr_2d, dialrsp_2d, kALcomb1_2d, kALcomb2_2d, false};
+
+act5 aball2_2d = {INIT_OBJVXY, 0, BALLOON_2d, 0, 0};
+act5 acop2_2d = {INIT_OBJVXY, 0, COP_2d, DX, 0};
+act5 adalek4_2d = {INIT_OBJVXY, 4, DALEK_2d, 0, 0};
+act5 adead4_2d = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 adone11_2d = {INIT_OBJVXY, 10, HERO, 0, -1};
+act5 adone7_2d = {INIT_OBJVXY, 0, HORACE_2d, -DX, DY};
+act5 adone8_2d = {INIT_OBJVXY, 10, HORACE_2d, 0, -1};
+act5 afall4_2d = {INIT_OBJVXY, 0, PENFALL_2d, 0, 4};
+act5 ahest10_2d = {INIT_OBJVXY, 46, HESTER_2d, 0, 0};
+act5 ahest4_2d = {INIT_OBJVXY, 0, HESTER_2d, DX, 0};
+act5 ahest6_2d = {INIT_OBJVXY, 22, HESTER_2d, 0, -DY};
+act5 ahest8_2d = {INIT_OBJVXY, 24, HESTER_2d, -DX, -1};
+act5 amaidb3_2d = {INIT_OBJVXY, 0, MAID_2d, DX, 0};
+act5 amaidb4_2d = {INIT_OBJVXY, 10, MAID_2d, 0, 0};
+act5 amaidbk4_2d = {INIT_OBJVXY, 0, MAID_2d, -DX, 0};
+act5 amaidbk5_2d = {INIT_OBJVXY, 10, MAID_2d, 0, 0};
+act5 amaidstop2_2d = {INIT_OBJVXY, 0, MAID_2d, 0, 0};
+act5 aom3_2d = {INIT_OBJVXY, 12, HERO, 0, 0};
+act5 aom8_2d = {INIT_OBJVXY, 40, HERO, 0, 0};
+act5 apanel3_2d = {INIT_OBJVXY, 5, PANEL_2d, 0, -4};
+act5 apanel8_2d = {INIT_OBJVXY, 25, PANEL_2d, 0, 4};
+act5 aridgard5_2d = {INIT_OBJVXY, 4, GARDENER_2d, -2 * DX, 0};
+act5 astick6_2d = {INIT_OBJVXY, 0, DOG_2d, -DX * 2, 0};
+act5 abkstart1_2d = {INIT_OBJVXY, 0, BOOKCASE_2d, -2, 0};
+act5 abkstart2_2d = {INIT_OBJVXY, 23, BOOKCASE_2d, +2, 0};
+act5 abkstop_2d = {INIT_OBJVXY, 46, BOOKCASE_2d, 0, 0};
+act5 agone15_2d = {INIT_OBJVXY, 133, HERO, -DX, 0};
+act5 amaidc1_2d = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 amaidc6_2d = {INIT_OBJVXY, 8, MAID_2d, DX, 0};
+act5 amaidc8_2d = {INIT_OBJVXY, 16, MAID_2d, -DX, 0};
+act5 amaidc9_2d = {INIT_OBJVXY, 26, MAID_2d, 0, 0};
+act5 apenbvxy1_2d = {INIT_OBJVXY, 0, PENNY_2d, DX, 0};
+act5 apenbvxy2_2d = {INIT_OBJVXY, 20, PENNY_2d, 0, 0};
+act5 astophero_2d = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 apenvxy1_2d = {INIT_OBJVXY, PENDELAY + 10, PENNY_2d, -DX, 0};
+act5 apenvxy2_2d = {INIT_OBJVXY, PENDELAY + 17, PENNY_2d, 0, -DY};
+act5 apenvxy3_2d = {INIT_OBJVXY, PENDELAY + 42, PENNY_2d, DX, 0};
+act5 apenvxy4_2d = {INIT_OBJVXY, PENDELAY + 70, PENNY_2d, 0, 0};
+
+act6 abanana2_2d = {INIT_CARRY, 0, BANANA_2d, false};
+act6 abel2_2d = {INIT_CARRY, 0, BELL_2d, false};
+act6 adrop33a_2d = {INIT_CARRY, 0, BOTTLE_2d, false};
+act6 adrop33b_2d = {INIT_CARRY, 0, GUN_2d, false};
+act6 adrop33c_2d = {INIT_CARRY, 0, BELL_2d, false};
+act6 adrop33d_2d = {INIT_CARRY, 0, SCREW_2d, false};
+act6 adrop33e_2d = {INIT_CARRY, 0, ALBUM_2d, false};
+act6 adrop33f_2d = {INIT_CARRY, 0, WILL_2d, false};
+act6 adrop33g_2d = {INIT_CARRY, 0, OILLAMP_2d, false};
+act6 adrop33h_2d = {INIT_CARRY, 0, CATNIP_2d, false};
+act6 adrop33i_2d = {INIT_CARRY, 0, MAGNIFY_2d, false};
+act6 adrop33j_2d = {INIT_CARRY, 0, MATCHES_2d, false};
+act6 adropban_2d = {INIT_CARRY, 0, BANANA_2d, false};
+act6 adropgarl_2d = {INIT_CARRY, 0, GARLIC_2d, false};
+act6 amat3_2d = {INIT_CARRY, 0, MATCHES_2d, false};
+act6 apaper3_2d = {INIT_CARRY, 0, PAPER_2d, false};
+act6 aphoto1_2d = {INIT_CARRY, 0, ALBUM_2d, true};
+act6 asafe4_2d = {INIT_CARRY, 0, WILL_2d, true};
+act6 asonic5_2d = {INIT_CARRY, 0, SCREW_2d, true};
+act6 astick9_2d = {INIT_CARRY, 0, STICK_2d, false};
+
+act7 adead2_2d = {INIT_HF_COORD, 0, PENNYLIE_2d};
+act7 agard2_2d = {INIT_HF_COORD, 0, GARDENER_2d};
+act7 agetgarlic_2d = {INIT_HF_COORD, 0, GARLIC_2d};
+act7 agetmatch_2d = {INIT_HF_COORD, 0, MATCHES_2d};
+act7 ahfaint2_2d = {INIT_HF_COORD, 4, PENNYLIE_2d};
+act7 afaint3_2d = {INIT_HF_COORD, 10, PENNYLIE_2d};
+act7 apenscr_2d = {INIT_HF_COORD, 0, PENNY_2d};
+
+act8 akaboom3_2d = {NEW_SCREEN, 0, 22};
+act8 arg_2d = {NEW_SCREEN, 0, 22};
+act8 arr_2d = {NEW_SCREEN, 0, 21};
+act8 arr21_2d = {NEW_SCREEN, 0, 16};
+act8 ascr0204_2d = {NEW_SCREEN, 0, 4};
+act8 ascr0305_2d = {NEW_SCREEN, 0, 5};
+act8 ascr0306_2d = {NEW_SCREEN, 0, 6};
+act8 ascr0402_2d = {NEW_SCREEN, 30, 2};
+act8 ascr0503_2d = {NEW_SCREEN, 0, 3};
+act8 ascr0603_2d = {NEW_SCREEN, 0, 3};
+act8 ascr0607_2d = {NEW_SCREEN, 0, 7};
+act8 ascr0631_2d = {NEW_SCREEN, 0, 31};
+act8 ascr0706_2d = {NEW_SCREEN, 0, 6};
+act8 ascr0708_2d = {NEW_SCREEN, 0, 8};
+act8 ascr0710_2d = {NEW_SCREEN, 0, 10};
+act8 ascr0807_2d = {NEW_SCREEN, 0, 7};
+act8 ascr0809_2d = {NEW_SCREEN, 0, 9};
+act8 ascr0811_2d = {NEW_SCREEN, 0, 11};
+act8 ascr0812_2d = {NEW_SCREEN, 0, 12};
+act8 ascr0908_2d = {NEW_SCREEN, 0, 8};
+act8 ascr1007_2d = {NEW_SCREEN, 0, 7};
+act8 ascr1108_2d = {NEW_SCREEN, 0, 8};
+act8 ascr1113_2d = {NEW_SCREEN, 0, 13};
+act8 ascr12_2d = {NEW_SCREEN, DOORDELAY, 2};
+act8 ascr1314_2d = {NEW_SCREEN, 0, 14};
+act8 ascr1413_2d = {NEW_SCREEN, 0, 13};
+act8 ascr1415_2d = {NEW_SCREEN, 0, 15};
+act8 ascr1514_2d = {NEW_SCREEN, 0, 14};
+act8 ascr1516_2d = {NEW_SCREEN, 0, 16};
+act8 ascr1517_2d = {NEW_SCREEN, 0, 17};
+act8 ascr1615_2d = {NEW_SCREEN, 0, 15};
+act8 ascr1715_2d = {NEW_SCREEN, 0, 15};
+act8 ascr1718_2d = {NEW_SCREEN, 0, 18};
+act8 ascr1720_2d = {NEW_SCREEN, 0, 20};
+act8 ascr1817_2d = {NEW_SCREEN, 0, 17};
+act8 ascr1819_2d = {NEW_SCREEN, 0, 19};
+act8 ascr1837_2d = {NEW_SCREEN, 0, 37};
+act8 ascr1918_2d = {NEW_SCREEN, 0, 18};
+act8 ascr2017_2d = {NEW_SCREEN, 0, 17};
+act8 ascr2223_2d = {NEW_SCREEN, 0, 23};
+act8 ascr2322_2d = {NEW_SCREEN, 0, 22};
+act8 ascr2324_2d = {NEW_SCREEN, 0, 24};
+act8 ascr2325_2d = {NEW_SCREEN, 0, 25};
+act8 ascr2326_2d = {NEW_SCREEN, 0, 26};
+act8 ascr2423_2d = {NEW_SCREEN, 0, 23};
+act8 ascr2523_2d = {NEW_SCREEN, 0, 23};
+act8 ascr2623_2d = {NEW_SCREEN, 0, 23};
+act8 ascr2627_2d = {NEW_SCREEN, 0, 27};
+act8 ascr2726_2d = {NEW_SCREEN, 0, 26};
+act8 ascr2827_2d = {NEW_SCREEN, 0, 27};
+act8 ascr2829_2d = {NEW_SCREEN, 0, 29};
+act8 ascr2928_2d = {NEW_SCREEN, 0, 28};
+act8 ascr2930_2d = {NEW_SCREEN, 0, 30};
+act8 ascr2931_2d = {NEW_SCREEN, 0, 31};
+act8 ascr2934_2d = {NEW_SCREEN, 0, 34};
+act8 ascr2938_2d = {NEW_SCREEN, 0, 38};
+act8 ascr3029_2d = {NEW_SCREEN, 0, 29};
+act8 ascr3106_2d = {NEW_SCREEN, 2, 6};
+act8 ascr3129_2d = {NEW_SCREEN, 0, 29};
+act8 ascr3132_2d = {NEW_SCREEN, 0, 32};
+act8 ascr3231_2d = {NEW_SCREEN, 0, 31};
+act8 ascr3334_2d = {NEW_SCREEN, 0, 34};
+act8 ascr33d_2d = {NEW_SCREEN, 4, 33};
+act8 ascr3429_2d = {NEW_SCREEN, 0, 29};
+act8 ascr3438_2d = {NEW_SCREEN, 0, 38};
+act8 ascr3534_2d = {NEW_SCREEN, 0, 34};
+act8 ascr3634_2d = {NEW_SCREEN, 0, 34};
+act8 ascr3718_2d = {NEW_SCREEN, 0, 18};
+act8 ascr3829_2d = {NEW_SCREEN, 0, 29};
+act8 ascr3834_2d = {NEW_SCREEN, 0, 34};
+act8 auptrap2_2d = {NEW_SCREEN, 0, 28};
+act8 ascr01_2d = {NEW_SCREEN, STORYDELAY + 10, 1};
+act8 ascr0203_2d = {NEW_SCREEN, 40, 3};
+act8 ascr11maze_2d = {NEW_SCREEN, 0, MAZE_SCREEN + 59};
+act8 ascr3435_2d = {NEW_SCREEN, DOORDELAY, 35};
+act8 ascr3436_2d = {NEW_SCREEN, DOORDELAY, 36};
+act8 ascrmaze_2d = {NEW_SCREEN, 0, 11};
+
+act9 abanana9_2d = {INIT_OBJSTATE, 16, GENIE_2d, 1};
+act9 abite1_2d = {INIT_OBJSTATE, 0, SNAKE_2d, 1};
+act9 acallp1_2d = {INIT_OBJSTATE, 0, TARDIS_2d, 1};
+act9 acat2_2d = {INIT_OBJSTATE, 0, CATNIP_2d, 1};
+act9 acook6_2d = {INIT_OBJSTATE, 0, COOK_2d, 2};
+act9 acookp1_2d = {INIT_OBJSTATE, 0, COOK_2d, 1};
+act9 adalek6_2d = {INIT_OBJSTATE, 4, DALEK_2d, 1};
+act9 adynamite1_2d = {INIT_OBJSTATE, 0, DYNAMITE_2d, 1};
+act9 afinito_2d = {INIT_OBJSTATE, 0, HERO, 1};
+act9 afuze3_2d = {INIT_OBJSTATE, 0, WELL_2d, 1};
+act9 agarl1_2d = {INIT_OBJSTATE, 0, GARLIC_2d, 1};
+act9 agenie4_2d = {INIT_OBJSTATE, 0, OILLAMP_2d, 1};
+act9 agiveb2_2d = {INIT_OBJSTATE, 0, CATNIP_2d, 2};
+act9 ahdrink1_2d = {INIT_OBJSTATE, 0, LETTER_2d, 3};
+act9 ahdrink7_2d = {INIT_OBJSTATE, 50, LETTER_2d, 2};
+act9 ahest16_2d = {INIT_OBJSTATE, 50, LETTER_2d, 1};
+act9 ahestd1_2d = {INIT_OBJSTATE, 0, LETTER_2d, 2};
+act9 akeyhole3_2d = {INIT_OBJSTATE, 0, KEYHOLE_2d, 1};
+act9 akeyhole4_2d = {INIT_OBJSTATE, 0, BOOK_2d, 2};
+act9 amat1_2d = {INIT_OBJSTATE, 0, MATCHES_2d, 1};
+act9 amissed1_2d = {INIT_OBJSTATE, 0, GUN_2d, 1};
+act9 aom4_2d = {INIT_OBJSTATE, 12, OLDMAN_2d, 1};
+act9 apanel1_2d = {INIT_OBJSTATE, 0, PANEL_2d, 1};
+act9 apaper1_2d = {INIT_OBJSTATE, 0, PAPER_2d, 1};
+act9 aphoto5_2d = {INIT_OBJSTATE, 0, ALBUM_2d, 1};
+act9 aridkey1_2d = {INIT_OBJSTATE, 0, PAPER_2d, 2};
+act9 asafe2_2d = {INIT_OBJSTATE, 0, SAFE_2d, 1};
+act9 asafe3_2d = {INIT_OBJSTATE, 0, WILL_2d, 1};
+act9 asonic7_2d = {INIT_OBJSTATE, 0, DOCTOR_2d, 1};
+act9 ast12_2d = {INIT_OBJSTATE, DOORDELAY, DOOR1_2d, 0};
+act9 astick2_2d = {INIT_OBJSTATE, 0, STICK_2d, 1};
+act9 awho4_2d = {INIT_OBJSTATE, 0, TARDIS_2d, 2};
+act9 amaidp9_2d = {INIT_OBJSTATE, 12, MAID_2d, 1};
+act9 asetbk1_2d = {INIT_OBJSTATE, 0, BOOK_2d, 1};
+act9 asetbk2_2d = {INIT_OBJSTATE, 0, BOOK_2d, 2};
+act9 asetbk3_2d = {INIT_OBJSTATE, 0, BOOK_2d, 3};
+act9 ast3435_2d = {INIT_OBJSTATE, DOORDELAY, DOOR2_2d, 0};
+act9 ast3436_2d = {INIT_OBJSTATE, DOORDELAY, DOOR3_2d, 0};
+
+act10 aball1_2d = {INIT_PATH, 0, BALLOON_2d, AUTO, 0, 0};
+act10 abanana14_2d = {INIT_PATH, 24, GENIE_2d, WANDER, DX, DY};
+act10 abanana4_2d = {INIT_PATH, 0, GENIE_2d, AUTO, 0, 0};
+act10 acook9_2d = {INIT_PATH, 60, COOK_2d, WANDER, DX, DY};
+act10 adalek3_2d = {INIT_PATH, 0, DALEK_2d, AUTO, 0, 0};
+act10 adalek7_2d = {INIT_PATH, 4, DOCTOR_2d, CHASE, DX / 2, DY / 2};
+act10 agard11_2d = {INIT_PATH, 300, GARDENER_2d, WANDER, DX, DY};
+act10 agard4_2d = {INIT_PATH, 16, GARDENER_2d, CHASE, DX, DY};
+act10 agenie3_2d = {INIT_PATH, 4, GENIE_2d, CHASE, DX, DY};
+act10 ahfaint6_2d = {INIT_PATH, 8, HERO, USER, 0, 0};
+act10 akeyhole6_2d = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 amaidstop1_2d = {INIT_PATH, 0, MAID_2d, AUTO, 0, 0};
+act10 aom2_2d = {INIT_PATH, 12, HERO, AUTO, 0, 0};
+act10 aom20_2d = {INIT_PATH, 60, HERO, USER, 0, 0};
+act10 apanel5_2d = {INIT_PATH, 20, HERO, USER, 0, 0};
+act10 aparty1c_2d = {INIT_PATH, 0, COP_2d, CHASE, DX, DY};
+act10 aparty2c_2d = {INIT_PATH, 0, MAID_2d, WANDER, DX, DY};
+act10 aparty3c_2d = {INIT_PATH, 0, HESTER_2d, WANDER, DX, DY};
+act10 aparty4c_2d = {INIT_PATH, 0, GARDENER_2d, WANDER, DX, DY};
+act10 aparty5c_2d = {INIT_PATH, 0, SNAKE_2d, WANDER, DX, DY};
+act10 aparty6c_2d = {INIT_PATH, 0, GENIE_2d, WANDER, DX, DY};
+act10 aparty7c_2d = {INIT_PATH, 0, HARRY_2d, AUTO, 0, 0};
+act10 aparty8c_2d = {INIT_PATH, 0, DOCTOR_2d, WANDER, DX, DY};
+act10 aparty9c_2d = {INIT_PATH, 0, COOK_2d, WANDER, DX, DY};
+act10 aridgard1_2d = {INIT_PATH, 0, GARDENER_2d, AUTO, 0, 0};
+act10 ascr33a_2d = {INIT_PATH, 4, HERO, USER, 0, 0};
+act10 asonic8_2d = {INIT_PATH, 16, DOCTOR_2d, WANDER, DX, DY};
+act10 astick8_2d = {INIT_PATH, 16, HERO, USER, 0, 0};
+act10 abuga1a_2d = {INIT_PATH, 0, BUG1_2d, CHASE, DX * 2, DY * 2};
+act10 abuga1b_2d = {INIT_PATH, 7, BUG1_2d, WANDER2, DX, DY};
+act10 abuga2a_2d = {INIT_PATH, 0, BUG2_2d, CHASE, DX, DY};
+act10 abuga2b_2d = {INIT_PATH, 9, BUG2_2d, WANDER2, DX, DY};
+act10 abuga3a_2d = {INIT_PATH, 0, BUG3_2d, CHASE, DX * 2, DY * 2};
+act10 abuga3b_2d = {INIT_PATH, 6, BUG3_2d, WANDER2, DX, DY};
+act10 abuga4a_2d = {INIT_PATH, 0, BUG4_2d, CHASE, DX, DY};
+act10 abuga4b_2d = {INIT_PATH, 10, BUG4_2d, WANDER2, DX * 2, DY * 2};
+act10 abuga5a_2d = {INIT_PATH, 0, BUG5_2d, CHASE, DX, DY};
+act10 abuga5b_2d = {INIT_PATH, 4, BUG5_2d, WANDER2, DX, DY};
+act10 abugf1b_2d = {INIT_PATH, 10, BUG1_2d, WANDER2, DX, DY};
+act10 abugf2b_2d = {INIT_PATH, 12, BUG2_2d, WANDER2, DX, DY};
+act10 abugf3b_2d = {INIT_PATH, 5, BUG3_2d, WANDER2, DX, DY};
+act10 abugf4b_2d = {INIT_PATH, 10, BUG4_2d, WANDER2, DX * 2, DY * 2};
+act10 abugf5b_2d = {INIT_PATH, 5, BUG5_2d, WANDER2, DX, DY};
+act10 acyc2_2d = {INIT_PATH, 120, HERO, USER, 0, 0};
+act10 adisable_2d = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 afaint8_2d = {INIT_PATH, 30, HERO, USER, 0, 0};
+act10 amaid2_2d = {INIT_PATH, 18, MAID_2d, CHASE, DX, DY};
+act10 amaidc15_2d = {INIT_PATH, 30, HERO, USER, 0, 0};
+act10 amaidgo_2d = {INIT_PATH, 25, HERO, USER, 0, 0};
+act10 apeng4_2d = {INIT_PATH, 40, HERO, USER, 0, 0};
+
+act11 abutchk_2d = {COND_R, 0, GARLIC_2d, 0, kALcantpush_2d, 0};
+act11 achkbite_2d = {COND_R, 0, SNAKE_2d, 0, kALnocure_2d, kALcure_2d};
+act11 achkc09_2d = {COND_R, 0, GARLIC_2d, 0, kALclue09_2d, 0};
+act11 achkcook_2d = {COND_R, 0, COOK_2d, 1, kALcook_2d, 0};
+act11 achkcookp_2d = {COND_R, 0, COOK_2d, 0, kALcookp_2d, 0};
+act11 achkcop_2d = {COND_R, 0, COP_2d, 0x1f, kALcop_2d, 0};
+act11 achkcop2_2d = {COND_R, 0, COP_2d, 0x1f, kALparty_2d, 0};
+act11 achkdalek_2d = {COND_R, 0, DALEK_2d, 1, kALchkdoc_2d, 0};
+act11 achkdoc_2d = {COND_R, 0, DOCTOR_2d, 0, kALsonic_2d, 0};
+act11 achkgive_2d = {COND_R, 0, CATNIP_2d, 1, kALgiveb3_2d, kALgiveb4_2d};
+act11 achkhero_2d = {COND_R, 0, HERO, 1, kALdone_2d, 0};
+act11 achkhr1_2d = {COND_R, 0, LETTER_2d, 0, kALhrgreet_2d, kALblah_2d};
+act11 achkhr2_2d = {COND_R, 0, LETTER_2d, 1, kALhprompt_2d, 0};
+act11 achkken1_2d = {COND_R, 0, STICK_2d, 1, kALthrown_2d, kALdog1_2d};
+act11 achkken2_2d = {COND_R, 0, DYNAMITE_2d, 0, kALdyn1_2d, kALempty_2d};
+act11 achkkit_2d = {COND_R, 0, GENIE_2d, 1, kALscrok_2d, 0};
+act11 achkld1_2d = {COND_R, 0, MATCHES_2d, 1, kALlookm2_2d, kALmatok_2d};
+act11 achkmat2_2d = {COND_R, 0, MATCHES_2d, 0, kALdropmat_2d, 0};
+act11 achknasty_2d = {COND_R, 0, BOTTLE_2d, 0, kALnasty_2d, 0};
+act11 achkom_2d = {COND_R, 0, OLDMAN_2d, 0, kALomgag_2d, 0};
+act11 achkpanel_2d = {COND_R, 0, PANEL_2d, 0, kALpanel_2d, 0};
+act11 achkpaper1_2d = {COND_R, 0, PAPER_2d, 1, kALchkpap2_2d, kALridkey_2d};
+act11 achkpb1_2d = {COND_R, 0, TARDIS_2d, 0, kALcallp_2d, 0};
+act11 achkpb2_2d = {COND_R, 0, TARDIS_2d, 1, kALdial_2d, 0};
+act11 achkphoto_2d = {COND_R, 0, ALBUM_2d, 0, kALphoto1_2d, kALempty_2d};
+act11 achkrr1_2d = {COND_R, 0, WELL_2d, 1, kALchkrr2_2d, kALclimbup_2d};
+act11 achksnake_2d = {COND_R, 0, SNAKE_2d, 0, kALbite_2d, 0};
+act11 achktrap_2d = {COND_R, 0, GENIE_2d, 1, kALuptrap_2d, kALnotrap_2d};
+act11 achkwell_2d = {COND_R, 0, WELL_2d, 0, kALrr_2d, kALrg_2d};
+act11 achkwill_2d = {COND_R, 0, WILL_2d, 0, kALchksafe_2d, kALnopurps_2d};
+act11 agard1_2d = {COND_R, 0, GARLIC_2d, 0, kALgard1_2d, 0};
+act11 akeyhole_2d = {COND_R, 0, BOOK_2d, 0, kALkeyhole1_2d, kALkeyhole2_2d};
+act11 amatchk1_2d = {COND_R, 0, MATCHES_2d, 0, kALlookm1_2d, kALlookm2_2d};
+act11 amatchk2_2d = {COND_R, 0, MATCHES_2d, 0, kALstrike1_2d, kALlookm2_2d};
+act11 achkbed1_2d = {COND_R, 0, BOOK_2d, 0, kALbed1_2d, kALfaint_2d};
+act11 achkmaid_2d = {COND_R, 0, MAID_2d, 0, kALmaidx_2d, kALblah_2d};
+act11 achkstate0_2d = {COND_R, 0, BOOK_2d, 0, kALhugone_2d, kALchkstate1_2d};
+act11 achkstate1_2d = {COND_R, 0, BOOK_2d, 1, kALhole_2d, kALpengone_2d};
+
+act12 aball4_2d = {TEXT, 2, kSTBalloon1_2d};
+act12 aball5_2d = {TEXT, 2, kSTBalloon2_2d};
+act12 aball6_2d = {TEXT, 2, kSTBalloon3_2d};
+act12 abanana1_2d = {TEXT, 0, kSTBanana1_2d};
+act12 abanana3_2d = {TEXT, 0, kSTBanana2_2d};
+act12 abell_2d = {TEXT, 0, kSTBell1_2d};
+act12 abell1_2d = {TEXT, 8, kSTMaid7_2d};
+act12 abite2_2d = {TEXT, 0, kSTSnake5_2d};
+act12 ablah_2d = {TEXT, 8, kSTBlah_2d};
+act12 aboom_2d = {TEXT, 0, kSTDyn4_2d};
+act12 acallp2_2d = {TEXT, 0, kSTCall1_2d};
+act12 acallp3_2d = {TEXT, 0, kSTCall2_2d};
+act12 acallp4_2d = {TEXT, 0, kSTCall3_2d};
+act12 acallp5_2d = {TEXT, 0, kSTCall4_2d};
+act12 acallp6_2d = {TEXT, 0, kSTCall5_2d};
+act12 acallp7_2d = {TEXT, 0, kSTCall6_2d};
+act12 acantpush_2d = {TEXT, 0, kSTPush1_2d};
+act12 acat1_2d = {TEXT, 0, kSTCat3_2d};
+act12 acat4_2d = {TEXT, 0, kSTMaid8_2d};
+act12 achasm1_2d = {TEXT, 12, kSTChasm1_2d};
+act12 acheat1_2d = {TEXT, 0, kSTScheat1_2d};
+act12 acheat2_2d = {TEXT, 0, kSTScheat2_2d};
+act12 aclimax1_2d = {TEXT, 0, kSTSclimax1_2d};
+act12 aclimax2_2d = {TEXT, 8, kSTSclimax2_2d};
+act12 aclimax3_2d = {TEXT, 80, kSTSclimax3_2d};
+act12 aclimax4_2d = {TEXT, 80, kSTSclimax4_2d};
+act12 aclimax5_2d = {TEXT, 80, kSTSclimax5_2d};
+act12 aclimax6_2d = {TEXT, 80, kSTSclimax6_2d};
+act12 aclue09a_2d = {TEXT, 0, kSTSclue09a_2d};
+act12 aclue09b_2d = {TEXT, 0, kSTSclue09b_2d};
+act12 aclue09c_2d = {TEXT, 0, kSTSclue09c_2d};
+act12 acomb1_2d = {TEXT, 0, kSTScomb1_2d};
+act12 acomb2_2d = {TEXT, 0, kSTScomb2_2d};
+act12 acook1_2d = {TEXT, 8, kSTCook1_2d};
+act12 acook2_2d = {TEXT, 8, kSTCook2_2d};
+act12 acook3_2d = {TEXT, 8, kSTCook3_2d};
+act12 acook4_2d = {TEXT, 24, kSTCook4_2d};
+act12 acook5_2d = {TEXT, 24, kSTCook5_2d};
+act12 adalek1_2d = {TEXT, 0, kSTFire3_2d};
+act12 adidnt1_2d = {TEXT, 0, kSTSdidnt1_2d};
+act12 adidnt2_2d = {TEXT, 0, kSTSdidnt2_2d};
+act12 adog1_2d = {TEXT, 0, kSTDyn2_2d};
+act12 adone1_2d = {TEXT, 10, kSTSdone1_2d};
+act12 adone13_2d = {TEXT, 50, kSTSdone5_2d};
+act12 adone14_2d = {TEXT, 50, kSTSdone6_2d};
+act12 adone2_2d = {TEXT, 10, kSTSdone2_2d};
+act12 adone3_2d = {TEXT, 10, kSTSdone3_2d};
+act12 adone4_2d = {TEXT, 10, kSTSdone4_2d};
+act12 adraught_2d = {TEXT, 5 * 60 * NORMAL_TPS, kSTDraught_2d};
+act12 adropdyn2_2d = {TEXT, 0, kSTDyn3_2d};
+act12 adumb12_2d = {TEXT, 0, kSTDumb2_2d};
+act12 adumb2_2d = {TEXT, 0, kSTDumb1_2d};
+act12 adyn1_2d = {TEXT, 0, kSTDyn1_2d};
+act12 aeatban_2d = {TEXT, 0, kSTSeatbanana_2d};
+act12 aeatgarl1_2d = {TEXT, 0, kSTSgarl1_2d};
+act12 aeatgarl2_2d = {TEXT, 0, kSTSgarl2_2d};
+act12 aexplainb_2d = {TEXT, 0, kSTSexplainb_2d};
+act12 aext1_2d = {TEXT, 0, kSTSdalek1_2d};
+act12 aext2_2d = {TEXT, 0, kSTSdalek2_2d};
+act12 aext3_2d = {TEXT, 0, kSTSdalek3_2d};
+act12 agard10_2d = {TEXT, 300, kSTSgard6_2d};
+act12 agard5_2d = {TEXT, 20, kSTSgard1_2d};
+act12 agard6_2d = {TEXT, 30, kSTSgard2_2d};
+act12 agard7_2d = {TEXT, 40, kSTSgard3_2d};
+act12 agard8_2d = {TEXT, 90, kSTSgard4_2d};
+act12 agard9_2d = {TEXT, 100, kSTSgard5_2d};
+act12 agenie1_2d = {TEXT, 0, kSTRub2_2d};
+act12 agiveb3_2d = {TEXT, 0, kSTCat2_2d};
+act12 ahdrink11_2d = {TEXT, 62, kSTHest4_2d};
+act12 ahdrink12_2d = {TEXT, 64, kSTSay1_2d};
+act12 ahdrink13_2d = {TEXT, 64, kSTSay2_2d};
+act12 ahdrink2_2d = {TEXT, 0, kSTHest1_2d};
+act12 ahdrink8_2d = {TEXT, 52, kSTHest2_2d};
+act12 ahdrink9_2d = {TEXT, 52, kSTHest3_2d};
+act12 ahest12_2d = {TEXT, 8, kSTHest6_2d};
+act12 ahest13_2d = {TEXT, 12, kSTHest7_2d};
+act12 ahest14_2d = {TEXT, 16, kSTHest8_2d};
+act12 ahest15_2d = {TEXT, 50, kSTHest9_2d};
+act12 ahestd2_2d = {TEXT, 0, kSTHest5_2d};
+act12 ahnod1_2d = {TEXT, 0, kSTNod1_2d};
+act12 ahnod2_2d = {TEXT, 0, kSTSay1_2d};
+act12 ahnod3_2d = {TEXT, 0, kSTSay2_2d};
+act12 akaboom1_2d = {TEXT, 0, kSTDyn5_2d};
+act12 alookm1_2d = {TEXT, 0, kSTMatch1_2d};
+act12 alookm2_2d = {TEXT, 0, kSTMatch2_2d};
+act12 amat5_2d = {TEXT, 0, kSTMatch4_2d};
+act12 amissed2_2d = {TEXT, 0, kSTFire1_2d};
+act12 amissed3_2d = {TEXT, 0, kSTFire2_2d};
+act12 amurd4_2d = {TEXT, 10, kSTArgue1_2d};
+act12 anobang_2d = {TEXT, 0, kSTDyn7_2d};
+act12 anobang2_2d = {TEXT, 0, kSTDyn6_2d};
+act12 anobell_2d = {TEXT, 8, kSTBell2_2d};
+act12 anogenie_2d = {TEXT, 0, kSTRub1_2d};
+act12 anoreply_2d = {TEXT, 0, kSTBrrr_2d};
+act12 anotrap_2d = {TEXT, 0, kSTTrap1_2d};
+act12 aom1_2d = {TEXT, 8, kSTSom1_2d};
+act12 aom10_2d = {TEXT, 50, kSTSom4_2d};
+act12 aom11_2d = {TEXT, 50, kSTSom5_2d};
+act12 aom12_2d = {TEXT, 50, kSTSom6_2d};
+act12 aom13_2d = {TEXT, 54, kSTSom7_2d};
+act12 aom14_2d = {TEXT, 54, kSTSom8_2d};
+act12 aom5_2d = {TEXT, 16, kSTSom2_2d};
+act12 aom6_2d = {TEXT, 20, kSTSom3_2d};
+act12 aom9_2d = {TEXT, 40, kSTSom3a_2d};
+act12 apen1_2d = {TEXT, 0, kSTSpen1_2d};
+act12 apen2_2d = {TEXT, 0, kSTSpen2_2d};
+act12 apen3_2d = {TEXT, 0, kSTSpen3_2d};
+act12 aphoto4_2d = {TEXT, 0, kSTSphoto_2d};
+act12 aphoto6_2d = {TEXT, 0, kSTSphoto1_2d};
+act12 apois1_2d = {TEXT, 0, kSTSnake1_2d};
+act12 apois2_2d = {TEXT, 0, kSTSnake2_2d};
+act12 apois3_2d = {TEXT, 0, kSTSnake3_2d};
+act12 apois4_2d = {TEXT, 0, kSTSnake4_2d};
+act12 aridkey2_2d = {TEXT, 0, kSTSridkey_2d};
+act12 arok_2d = {TEXT, 0, kSTWell1_2d};
+act12 arumbling_2d = {TEXT, 0, kSTRumble_2d};
+act12 arup_2d = {TEXT, 0, kSTDyn8_2d};
+act12 asafe1_2d = {TEXT, 0, kSTSsafe1_2d};
+act12 ascr31_2d = {TEXT, 0, kSTLock1_2d};
+act12 aserum1_2d = {TEXT, 0, kSTSserum1_2d};
+act12 aserum2_2d = {TEXT, 0, kSTSserum2_2d};
+act12 asilly_2d = {TEXT, 0, kSTDyn9_2d};
+act12 asniff_2d = {TEXT, 0, kSTCat1_2d};
+act12 asonic1_2d = {TEXT, 0, kSTSsonic1_2d};
+act12 asonic2_2d = {TEXT, 0, kSTSsonic2_2d};
+act12 asonic3_2d = {TEXT, 0, kSTSsonic3_2d};
+act12 asonic4_2d = {TEXT, 0, kSTSsonic4_2d};
+act12 astick1_2d = {TEXT, 0, kSTWeee_2d};
+act12 astrike1_2d = {TEXT, 0, kSTMatch3_2d};
+act12 astung_2d = {TEXT, 0, kSTStung_2d};
+act12 awarn_2d = {TEXT, 8, kSTSwarn_2d};
+act12 awarnz_2d = {TEXT, 8, kSTSwarnz_2d};
+act12 awho1_2d = {TEXT, 0, kSTTard1_2d};
+act12 awho2_2d = {TEXT, 0, kSTTard2_2d};
+act12 awill1_2d = {TEXT, 0, kSTSwill1_2d};
+act12 awill2_2d = {TEXT, 0, kSTSwill2_2d};
+act12 awill3_2d = {TEXT, 0, kSTSwill3_2d};
+act12 awill4_2d = {TEXT, 0, kSTSwill4_2d};
+act12 abell2_2d = {TEXT, 16, kSTMaid6_2d};
+act12 abug5a_2d = {TEXT, 0, kSTStingeroo_2d};
+act12 abug5b_2d = {TEXT, 0, kSTSbug5b_2d};
+act12 aclick_2d = {TEXT, 0, kSTClick_2d};
+act12 aempty_2d = {TEXT, 0, kSTEmpty_2d};
+act12 afaint1_2d = {TEXT, 5, kSTSfaint1_2d};
+act12 afaint10_2d = {TEXT, 35, kSTSfaint4_2d};
+act12 afaint5_2d = {TEXT, 20, kSTSfaint2_2d};
+act12 afaint9_2d = {TEXT, 35, kSTSfaint3_2d};
+act12 agone10_2d = {TEXT, 115, kSTSgone6_2d};
+act12 agone11_2d = {TEXT, 115, kSTSgone7_2d};
+act12 agone5_2d = {TEXT, 0, kSTSgone1_2d};
+act12 agone6_2d = {TEXT, 34, kSTSgone2_2d};
+act12 agone7_2d = {TEXT, 70, kSTSgone3_2d};
+act12 agone8_2d = {TEXT, 90, kSTSgone4_2d};
+act12 agone9_2d = {TEXT, 115, kSTSgone5_2d};
+act12 aharry3_2d = {TEXT, 4, kSTOrgan1_2d};
+act12 aharry4_2d = {TEXT, 4, kSTOrgan2_2d};
+act12 aharry5_2d = {TEXT, 4, kSTOrgan3_2d};
+act12 aharry7_2d = {TEXT, 8, kSTOrgan4_2d};
+act12 ahole_2d = {TEXT, 0, kSTFirst2_2d};
+act12 akeyhole1_2d = {TEXT, 0, kSTHole1_2d};
+act12 alie1_2d = {TEXT, 13, kSTTired_2d};
+act12 alie2_2d = {TEXT, 18, kSTTired2_2d};
+act12 amaid10_2d = {TEXT, 90 * NORMAL_TPS, kSTSmaid1_8_2d};
+act12 amaid11_2d = {TEXT, 99 * NORMAL_TPS, kSTSmaid1_9_2d};
+act12 amaid12_2d = {TEXT, 0, kSTSmaid1_10_2d};
+act12 amaid3_2d = {TEXT, 4, kSTSmaid1_1_2d};
+act12 amaid4_2d = {TEXT, 17, kSTSmaid1_2_2d};
+act12 amaid5_2d = {TEXT, 17, kSTSmaid1_3_2d};
+act12 amaid6_2d = {TEXT, 17, kSTSmaid1_4_2d};
+act12 amaid7_2d = {TEXT, 30, kSTSmaid1_5_2d};
+act12 amaid8_2d = {TEXT, 30 * NORMAL_TPS, kSTSmaid1_6_2d};
+act12 amaid9_2d = {TEXT, 60 * NORMAL_TPS, kSTSmaid1_7_2d};
+act12 amaidp3_2d = {TEXT, 8, kSTMaid1_2d};
+act12 amaidp4_2d = {TEXT, 8, kSTMaid2_2d};
+act12 amaidp5_2d = {TEXT, 8, kSTMaid3_2d};
+act12 amaidp7_2d = {TEXT, 12, kSTMaid4_2d};
+act12 amaidp8_2d = {TEXT, 12, kSTMaid5_2d};
+act12 anocarry_2d = {TEXT, 0, kSTNocarry_2d};
+act12 anopurps_2d = {TEXT, 0, kSTNopurps_2d};
+act12 aok_2d = {TEXT, 0, kSTOkgen_2d};
+act12 ascr21_2d = {TEXT, 0, kSTSfirst_2d};
+act12 astory1_2d = {TEXT, STORYDELAY, kSTStory_2d};
+act12 astory2_2d = {TEXT, STORYDELAY, kSTStory1_2d};
+
+act13 ascr33b_2d = {SWAP_IMAGES, 4, HERO, PENNY_2d};
+act13 aswaphero_2d = {SWAP_IMAGES, 23, HERO, PENNY_2d};
+
+act14 achkbell1_2d = {COND_SCR, 0, HERO, 31, kALbell1_2d, kALchkbell2_2d};
+act14 achkbell2_2d = {COND_SCR, 0, HERO, 32, kALbell2_2d, kALnobell_2d};
+act14 achkcat2_2d = {COND_SCR, 0, HERO, 32, kALbell2_2d, kALcat5_2d};
+act14 achkcat3_2d = {COND_SCR, 0, HERO, 31, kALcat6_2d, 0};
+act14 achkgun_2d = {COND_SCR, 0, HERO, 37, kALshot_2d, kALmissed_2d};
+act14 achklamp_2d = {COND_SCR, 0, HERO, 27, kALgenie_2d, kALnogenie_2d};
+act14 achkld2_2d = {COND_SCR, 0, HERO, 21, kALchkld3_2d, kALnobang_2d};
+act14 achkrr_2d = {COND_SCR, 0, HERO, 21, kALkaboom_2d, kALboom_2d};
+act14 adropdyn1_2d = {COND_SCR, 0, HERO, 21, kALdropdyn1_2d, 0};
+act14 adumbchk_2d = {COND_SCR, 0, HERO, 3, kALscr0306_2d, kALscr0603_2d};
+act14 agarchk_2d = {COND_SCR, 0, HERO, 9, kALridgard_2d, kALridgarl_2d};
+act14 agiveb1_2d = {COND_SCR, 0, HERO, 32, kALgiveb2_2d, kALnopurps_2d};
+
+act15 aom7_2d = {AUTOPILOT, 20, HERO, OLDMAN_2d, DX, DY};
+act15 abugf1a_2d = {AUTOPILOT, 4, BUG1_2d, ZAPPER_2d, DX, DY};
+act15 abugf2a_2d = {AUTOPILOT, 6, BUG2_2d, ZAPPER_2d, DX, DY};
+act15 abugf3a_2d = {AUTOPILOT, 13, BUG3_2d, ZAPPER_2d, DX, DY};
+act15 abugf4a_2d = {AUTOPILOT, 5, BUG4_2d, ZAPPER_2d, DX, DY};
+act15 abugf5a_2d = {AUTOPILOT, 11, BUG5_2d, ZAPPER_2d, DX, DY};
+
+act16 aback4_2d = {INIT_OBJ_SEQ, 2, CAT_2d, 0};
+act16 abd11_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 abd2_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 abd21_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 aclosedoor1_2d = {INIT_OBJ_SEQ, DOORDELAY, DOOR1_2d, 0};
+act16 adalek2_2d = {INIT_OBJ_SEQ, 0, DALEK_2d, 2};
+act16 adone10_2d = {INIT_OBJ_SEQ, 10, HERO, _UP};
+act16 adone6_2d = {INIT_OBJ_SEQ, 0, HORACE_2d, LEFT};
+act16 adone9_2d = {INIT_OBJ_SEQ, 10, HORACE_2d, _UP};
+act16 adumb13_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 adumb3_2d = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 afuze1_2d = {INIT_OBJ_SEQ, 0, DYNAMITE_2d, 1};
+act16 agiveb5_2d = {INIT_OBJ_SEQ, 2, CAT_2d, 1};
+act16 ahall1_3_2d = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 ahall2_2a_2d = {INIT_OBJ_SEQ, 0, HERO, LEFT};
+act16 ahall3_1a_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 ahdrink4_2d = {INIT_OBJ_SEQ, 3, HESTER_2d, _UP};
+act16 ahdrink5_2d = {INIT_OBJ_SEQ, 50, HESTER_2d, DOWN};
+act16 ahest3_2d = {INIT_OBJ_SEQ, 0, HESTER_2d, RIGHT};
+act16 ahest5_2d = {INIT_OBJ_SEQ, 22, HESTER_2d, _UP};
+act16 ahest7_2d = {INIT_OBJ_SEQ, 24, HESTER_2d, LEFT};
+act16 ahest9_2d = {INIT_OBJ_SEQ, 45, HESTER_2d, DOWN};
+act16 ainshed2_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 akit2_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 amaidb1_2d = {INIT_OBJ_SEQ, 0, MAID_2d, RIGHT};
+act16 amaidbk2_2d = {INIT_OBJ_SEQ, 0, MAID_2d, LEFT};
+act16 amaidbk6_2d = {INIT_OBJ_SEQ, 10, MAID_2d, DOWN};
+act16 amurd1_2d = {INIT_OBJ_SEQ, 26, MURDER_2d, 1};
+act16 aom16_2d = {INIT_OBJ_SEQ, 60, OLDMAN_2d, 1};
+act16 apanel7_2d = {INIT_OBJ_SEQ, 5, HERO, DOWN};
+act16 apen5_2d = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 aridgard4_2d = {INIT_OBJ_SEQ, 4, GARDENER_2d, LEFT};
+act16 ashed12_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 ashed2_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 ashed22_2d = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 astick4_2d = {INIT_OBJ_SEQ, 0, DOG_2d, 1};
+act16 avenus2_2d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 aclosedoor2_2d = {INIT_OBJ_SEQ, DOORDELAY, DOOR2_2d, 0};
+act16 aclosedoor3_2d = {INIT_OBJ_SEQ, DOORDELAY, DOOR3_2d, 0};
+act16 agone12_2d = {INIT_OBJ_SEQ, 125, HERO, DOWN};
+act16 agone13_2d = {INIT_OBJ_SEQ, 127, HERO, LEFT};
+act16 aharry2_2d = {INIT_OBJ_SEQ, 0, HARRY_2d, 1};
+act16 aheroseq1_2d = {INIT_OBJ_SEQ, 1, HERO, LEFT};
+act16 amaid1_2d = {INIT_OBJ_SEQ, 1, MAID_2d, DOWN};
+act16 amaidc13_2d = {INIT_OBJ_SEQ, 30, MAID_2d, DOWN};
+act16 amaidc4_2d = {INIT_OBJ_SEQ, 8, MAID_2d, RIGHT};
+act16 amaidc7_2d = {INIT_OBJ_SEQ, 16, MAID_2d, LEFT};
+act16 amaidp6_2d = {INIT_OBJ_SEQ, 10, MAID_2d, DOWN};
+act16 apenbseq1_2d = {INIT_OBJ_SEQ, 0, PENNY_2d, RIGHT};
+act16 apenbseq2_2d = {INIT_OBJ_SEQ, 25, PENNY_2d, _UP};
+act16 apenseq1_2d = {INIT_OBJ_SEQ, 0, PENNY_2d, RIGHT};
+act16 apenseq2_2d = {INIT_OBJ_SEQ, PENDELAY + 7, PENNY_2d, DOWN};
+act16 apenseq3_2d = {INIT_OBJ_SEQ, PENDELAY + 10, PENNY_2d, LEFT};
+act16 apenseq4_2d = {INIT_OBJ_SEQ, PENDELAY + 17, PENNY_2d, _UP};
+act16 apenseq5_2d = {INIT_OBJ_SEQ, PENDELAY + 42, PENNY_2d, RIGHT};
+act16 apenseq6_2d = {INIT_OBJ_SEQ, PENDELAY + 74, PENNY_2d, 2};
+
+act17 acopbit1_2d = {SET_STATE_BITS, 0, COP_2d, 1};
+act17 acopbit16_2d = {SET_STATE_BITS, 0, COP_2d, 16};
+act17 acopbit4_2d = {SET_STATE_BITS, 0, COP_2d, 4};
+act17 agatesopn_2d = {SET_STATE_BITS, 0, BUTTON_2d, 32};
+act17 aglighton2_2d = {SET_STATE_BITS, 0, BUTTON_2d, 2};
+act17 aphoto3_2d = {SET_STATE_BITS, 0, COP_2d, 2};
+act17 ashed23_2d = {SET_STATE_BITS, 0, BUTTON_2d, 16};
+act17 aslighton2_2d = {SET_STATE_BITS, 0, BUTTON_2d, 1};
+act17 astream12_2d = {SET_STATE_BITS, 0, BUTTON_2d, 4};
+act17 azapperon2_2d = {SET_STATE_BITS, 0, BUTTON_2d, 8};
+act17 acopbit8_2d = {SET_STATE_BITS, 0, COP_2d, 8};
+
+// all act18 were defined as act17 with a type set to CLEAR_STATE_BITS
+act18 agatescls_2d = {CLEAR_STATE_BITS, 0, BUTTON_2d, 32};
+act18 aglightoff2_2d = {CLEAR_STATE_BITS, 0, BUTTON_2d, 2};
+act18 aslightoff2_2d = {CLEAR_STATE_BITS, 0, BUTTON_2d, 1};
+act18 azapperoff2_2d = {CLEAR_STATE_BITS, 0, BUTTON_2d, 8};
+
+act19 achkbugs_2d = {TEST_STATE_BITS, 0, BUTTON_2d, 8, kALbugflit_2d, kALbugattack_2d};
+act19 achkgates_2d = {TEST_STATE_BITS, 2, BUTTON_2d, 16, kALswgates_2d, kALrumbling_2d};
+act19 achkglight_2d = {TEST_STATE_BITS, 2, BUTTON_2d, 2, kALglightoff_2d, kALglighton_2d};
+act19 achkgo_2d = {TEST_STATE_BITS, 0, BUTTON_2d, 32, kALgoopen_2d, kALgoclosed_2d};
+act19 achkslight_2d = {TEST_STATE_BITS, 2, BUTTON_2d, 1, kALslightoff_2d, kALslighton_2d};
+act19 achksong_2d = {TEST_STATE_BITS, 0, COP_2d, 8, 0, kALsong4_2d};
+act19 achkzapper_2d = {TEST_STATE_BITS, 2, BUTTON_2d, 4, kALswzapper_2d, kALclick_2d};
+act19 aswgates_2d = {TEST_STATE_BITS, 2, BUTTON_2d, 32, kALgatescls_2d, kALgatesopn_2d};
+act19 aswzapper_2d = {TEST_STATE_BITS, 2, BUTTON_2d, 8, kALzapperoff_2d, kALzapperon_2d};
+
+act20 acure_2d = {DEL_EVENTS, 0, AGSCHEDULE};
+act20 aridpath_2d = {DEL_EVENTS, 5, INIT_PATH};
+act20 aridsched_2d = {DEL_EVENTS, 0, ASCHEDULE};
+act20 aridtests_2d = {DEL_EVENTS, 0, TEST_STATE_BITS};
+act20 aridtext_2d = {DEL_EVENTS, 5, TEXT};
+
+act21 adead5_2d = {GAMEOVER, 0};
+act21 afall5_2d = {GAMEOVER, 12};
+
+act23 adone15_2d = {EXIT, 54};
+
+act24 abonus10_2d = {BONUS, 0, 10};
+act24 abonus11_2d = {BONUS, 57, 11};
+act24 abonus12_2d = {BONUS, 0, 12};
+act24 abonus13_2d = {BONUS, 0, 13};
+act24 abonus14_2d = {BONUS, 0, 14};
+act24 abonus15_2d = {BONUS, 0, 15};
+act24 abonus16_2d = {BONUS, 0, 16};
+act24 abonus17_2d = {BONUS, 0, 17};
+act24 abonus18_2d = {BONUS, 0, 18};
+act24 abonus19_2d = {BONUS, 0, 19};
+act24 abonus2_2d = {BONUS, 0, 2};
+act24 abonus20_2d = {BONUS, 0, 20};
+act24 abonus21_2d = {BONUS, 0, 21};
+act24 abonus22_2d = {BONUS, 0, 22};
+act24 abonus24_2d = {BONUS, 0, 24};
+act24 abonus25_2d = {BONUS, 0, 25};
+act24 abonus26_2d = {BONUS, 0, 26};
+act24 abonus27_2d = {BONUS, 0, 27};
+act24 abonus30_2d = {BONUS, 0, 30};
+act24 abonus6_2d = {BONUS, 0, 6};
+act24 abonus7_2d = {BONUS, 0, 7};
+act24 abonus8_2d = {BONUS, 0, 8};
+act24 abonus9_2d = {BONUS, 0, 9};
+act24 abonus1_2d = {BONUS, 0, 1};
+act24 abonus23_2d = {BONUS, 8, 23};
+act24 abonus3_2d = {BONUS, 0, 3};
+
+act25 achkdrop_2d = {COND_BOX, 0, HERO, 196, 78, 283, 115, 0, kALdropdyn2_2d};
+act25 achkld3_2d = {COND_BOX, 0, DYNAMITE_2d, 196, 78, 283, 125, kALchkld4_2d, kALnobang2_2d};
+act25 achkph2_2d = {COND_BOX, 0, MAID_2d, 192, 134, 251, 149, kALphoto2_2d, kALphoto3_2d};
+
+act27 aphoto2_2d = {ADD_SCORE, 0, ALBUM_2d};
+act27 asafe5_2d = {ADD_SCORE, 0, WILL_2d};
+act27 asonic6_2d = {ADD_SCORE, 0, SCREW_2d};
+
+act28 abel4_2d = {SUB_SCORE, 0, BELL_2d};
+act28 amat6_2d = {SUB_SCORE, 0, MATCHES_2d};
+act28 asubban_2d = {SUB_SCORE, 0, BANANA_2d};
+act28 subgarlic_2d = {SUB_SCORE, 0, GARLIC_2d};
+
+act29 achkbel_2d = {COND_CARRY, 0, BELL_2d, kALcat2_2d, kALnocarry_2d};
+act29 achkcarry_2d = {COND_CARRY, 0, BELL_2d, kALcat3_2d, kALcat4_2d};
+act29 achkld4_2d = {COND_CARRY, 0, DYNAMITE_2d, kALnobang2_2d, kALbang1_2d};
+act29 achkmag_2d = {COND_CARRY, 0, MAGNIFY_2d, kALwill1_2d, kALwill2_2d};
+act29 achkmat1_2d = {COND_CARRY, 0, MATCHES_2d, kALchkmat2_2d, 0};
+act29 achkpaper2_2d = {COND_CARRY, 0, PAPER_2d, kALridkey_2d, kALpencil_2d};
+act29 achkrr3_2d = {COND_CARRY, 0, DYNAMITE_2d, kALsilly_2d, kALclimbup_2d};
+act29 achksafe_2d = {COND_CARRY, 0, SCREW_2d, kALchkscrew_2d, kALsafepr_2d};
+
+act30 ainitmaze_2d = {INIT_MAZE, 0, 8, 50, 37, 260, 154, 140, 175, MAZE_SCREEN};
+
+act31 aexitmaze_2d = {EXIT_MAZE, 0};
+
+act32 apanel6_2d = {INIT_PRIORITY, 20, PANEL_2d, BACKGROUND};
+
+act33 acookp3_2d = {INIT_SCREEN, 0, COOKB_2d, 6};
+act33 afall3_2d = {INIT_SCREEN, 0, PENFALL_2d, 25};
+act33 amaidbk1_2d = {INIT_SCREEN, 0, MAID_2d, 31};
+act33 aparty1a_2d = {INIT_SCREEN, 0, COP_2d, 30};
+act33 aparty2a_2d = {INIT_SCREEN, 0, MAID_2d, 30};
+act33 aparty3a_2d = {INIT_SCREEN, 0, HESTER_2d, 30};
+act33 aparty4a_2d = {INIT_SCREEN, 0, GARDENER_2d, 30};
+act33 aparty5a_2d = {INIT_SCREEN, 0, SNAKE_2d, 30};
+act33 aparty6a_2d = {INIT_SCREEN, 0, GENIE_2d, 30};
+act33 aparty7a_2d = {INIT_SCREEN, 0, HARRY_2d, 30};
+act33 aparty8a_2d = {INIT_SCREEN, 0, DOCTOR_2d, 30};
+act33 aparty9a_2d = {INIT_SCREEN, 0, COOK_2d, 30};
+act33 ashed24_2d = {INIT_SCREEN, 0, GATELIGHT_2d, 11};
+act33 ashed25_2d = {INIT_SCREEN, 0, GATELIGHT_2d, 12};
+act33 astick10_2d = {INIT_SCREEN, 0, STICK_2d, -1};
+act33 amaidc11_2d = {INIT_SCREEN, 30, MAID_2d, 31};
+act33 amaidc2_2d = {INIT_SCREEN, 8, MAID_2d, 32};
+act33 amaidp1_2d = {INIT_SCREEN, 0, MAID_2d, 31};
+
+act34 abang1_2d = {AGSCHEDULE, 5 * NORMAL_TPS, kALbang2_2d};
+act34 abite3_2d = {AGSCHEDULE, 60 * NORMAL_TPS, kALpois1_2d};
+act34 abite4_2d = {AGSCHEDULE, 200 * NORMAL_TPS, kALpois2_2d};
+act34 abite5_2d = {AGSCHEDULE, 290 * NORMAL_TPS, kALpois3_2d};
+act34 abite6_2d = {AGSCHEDULE, 300 * NORMAL_TPS, kALpois4_2d};
+act34 acat3_2d = {AGSCHEDULE, 8 * NORMAL_TPS, kALchkcarry_2d};
+act34 akaboom2_2d = {AGSCHEDULE, 1, kALkaboom3_2d};
+act34 amaidb6_2d = {AGSCHEDULE, 8 * NORMAL_TPS, kALmaidbk_2d};
+
+act35 amap0_2d = {REMAPPAL, 0, _TLIGHTMAGENTA, _LIGHTMAGENTA};
+act35 amap1_2d = {REMAPPAL, 0, _TLIGHTMAGENTA, _BLACK};
+
+act36 achkcat1_2d = {COND_NOUN, 0, kNBell_2d, kALcat1_2d, kALnopurps_2d};
+act36 achkpencil_2d = {COND_NOUN, 0, kNKey_2d, kALchkpap1_2d, kALnopurps_2d};
+act36 achkscrew_2d = {COND_NOUN, 0, kNScrew_2d, kALsafe1_2d, kALsafepr_2d};
+
+act37 acookp2_2d = {SCREEN_STATE, 0, 6, 1};
+act37 ascreen2_2d = {SCREEN_STATE, 0, 2, 1};
+act37 ascreen35_2d = {SCREEN_STATE, 0, 35, 1};
+
+act38 acooklips_2d = {INIT_LIPS, 10, LIPS_2d, COOKB_2d, LIPDX - 1, LIPDY + 1};
+act38 aomlips_2d = {INIT_LIPS, 41, LIPS_2d, OLDMAN_2d, 24, LIPDY};
+act38 alips_2d = {INIT_LIPS, 0, LIPS_2d, MAID_2d, LIPDX, LIPDY};
+act38 amaidlips_2d = {INIT_LIPS, 5, LIPS_2d, MAID_2d, LIPDX, LIPDY};
+
+//Strangerke - act26 are stored in new act49, as songs were not handled the same way in DOS version (in harcoded strings)
+act49 asong2a_2d = {OLD_SONG, 0, kDTsong2_2d};
+act49 asong2dn_2d = {OLD_SONG, 30, kDTsong2a_2d};
+act49 asong2up_2d = {OLD_SONG, 10, kDTsong2_2d};
+act49 asong5_2d = {OLD_SONG, 0, kDTsong5_2d};
+act49 asong0_2d = {OLD_SONG, 0, kDTsong0_2d};
+act49 asong1_2d = {OLD_SONG, 0, kDTsong1_2d};
+act49 asong2_2d = {OLD_SONG, 24, kDTsong2_2d};
+act49 asong3_2d = {OLD_SONG, 0, kDTsong3_2d};
+act49 asong4_2d = {OLD_SONG, 0, kDTsong4_2d};
+act49 asong6_2d = {OLD_SONG, 4, kDTsong6_2d};
+
+actListPtr AL11maze_2d[] = {&ainitmaze_2d, &amazexy_2d, &ascr11maze_2d, 0};
+actListPtr ALballoon_2d[] = {&aball1_2d, &aball2_2d, &aball3_2d, &aball4_2d, &aball5_2d, &aball6_2d, &asong6_2d, 0};
+actListPtr ALbanana_2d[] = {&abonus18_2d, &abanana1_2d, &abanana2_2d, &abanana3_2d, &abanana4_2d, &abanana5_2d, &abanana6_2d, &abanana7_2d, &abanana8_2d, &abanana9_2d, &abanana10_2d, &abanana11_2d, &abanana12_2d, &abanana13_2d, &abanana14_2d, 0};
+actListPtr ALbang1_2d[] = {&abang1_2d, &afuze1_2d, &afuze2_2d, &afuze3_2d, 0};
+actListPtr ALbang2_2d[] = {&achkrr_2d, 0};
+actListPtr ALbed1_2d[] = {&apenscr_2d, &apenbxy1_2d, &apenbseq1_2d, &apenbstart_2d, &apenbvxy1_2d, &apenbvxy2_2d, &apenbseq2_2d, &apenbstop_2d, &apenbxy2_2d, &apenblie1_2d, &apenblie2_2d, &alie1_2d, &alie2_2d, 0};
+actListPtr ALbell_2d[] = {&achkbell1_2d, 0};
+actListPtr ALbell1_2d[] = {&abell_2d, &abell1_2d, 0};
+actListPtr ALbell2_2d[] = {&abell_2d, &adisable_2d, &amaidc1_2d, &amaidc2_2d, &amaidc3_2d, &amaidc4_2d, &amaidc5_2d, &amaidc6_2d, &abell2_2d, &amaidc7_2d, &amaidc8_2d, &amaidc9_2d, &amaidc10_2d, &amaidc11_2d, &amaidc12_2d, &amaidc13_2d, &amaidc14_2d, &amaidc15_2d, 0};
+actListPtr ALbite_2d[] = {&abite1_2d, &abite2_2d, &achknasty_2d, 0};
+actListPtr ALblah_2d[] = {&ablah_2d, &arepblah_2d, 0};
+actListPtr ALboom_2d[] = {&asong5_2d, &aboom_2d, &abonus17_2d, 0};
+actListPtr ALbottle_2d[] = {&abonus10_2d, &achkbite_2d, 0};
+actListPtr ALbridge_2d[] = {&achkmat1_2d, 0};
+actListPtr ALbugattack_2d[] = {&abuga1a_2d, &abuga1b_2d, &abuga1c_2d, &abuga2a_2d, &abuga2b_2d, &abuga2c_2d, &abuga3a_2d, &abuga3b_2d, &abuga3c_2d, &abuga4a_2d, &abuga4b_2d, &abuga4c_2d, &abuga5a_2d, &abuga5b_2d, &abuga5c_2d, &arepbuga_2d, 0};
+actListPtr ALbugflit_2d[] = {&abugf1a_2d, &abugf1b_2d, &abugf1c_2d, &abugf2a_2d, &abugf2b_2d, &abugf2c_2d, &abugf3a_2d, &abugf3b_2d, &abugf3c_2d, &abugf4a_2d, &abugf4b_2d, &abugf4c_2d, &abugf5a_2d, &abugf5b_2d, &abugf5c_2d, &arepbugf_2d, 0};
+actListPtr ALbugrep1_2d[] = {&abuga1a_2d, &abuga1b_2d, &abuga2a_2d, &abuga2b_2d, &abuga3a_2d, &abuga3b_2d, &abuga4a_2d, &abuga4b_2d, &abuga5a_2d, &abuga5b_2d, &arepbuga_2d, 0};
+actListPtr ALbugrep2_2d[] = {&abugf1a_2d, &abugf1b_2d, &abugf2a_2d, &abugf2b_2d, &abugf3a_2d, &abugf3b_2d, &abugf4a_2d, &abugf4b_2d, &abugf5a_2d, &abugf5b_2d, &arepbugf_2d, 0};
+actListPtr ALbugs_2d[] = {&adead1_2d, &adead2_2d, &adead3_2d, &abug5a_2d, &abug5b_2d, &adead4_2d, &adead5_2d, 0};
+actListPtr ALbugzapper_2d[] = {&abutchk_2d, &achkzapper_2d, 0};
+actListPtr ALcallp_2d[] = {&acallp1_2d, &acallp2_2d, &acallp3_2d, &acallp4_2d, &acallp5_2d, &acallp6_2d, &acallp7_2d, &abonus13_2d, 0};
+actListPtr ALcantpush_2d[] = {&acantpush_2d, &aridtests_2d, 0};
+actListPtr ALcat1_2d[] = {&achkbel_2d, 0};
+actListPtr ALcat2_2d[] = {&acat1_2d, &acat2_2d, 0};
+actListPtr ALcat3_2d[] = {&aback1_2d, &aback2_2d, &aback3_2d, &aback4_2d, 0};
+actListPtr ALcat4_2d[] = {&aback1_2d, &aback2_2d, &aback3_2d, &aback4_2d, &achkcat2_2d, 0};
+actListPtr ALcat5_2d[] = {&achkcat3_2d, 0};
+actListPtr ALcat6_2d[] = {&aridsched_2d, &abell_2d, &acat4_2d, &amaidb1_2d, &amaidb2_2d, &amaidb3_2d, &amaidb4_2d, &amaidb5_2d, &amaidb6_2d, 0};
+actListPtr ALcatnip_2d[] = {&achkcat1_2d, 0};
+actListPtr ALchasm_2d[] = {&achasm1_2d, &adead1_2d, &afall1_2d, &afall2_2d, &afall3_2d, &afall4_2d, &adead4_2d, &afall5_2d, 0};
+actListPtr ALcheat_2d[] = {&acheat1_2d, &acheat2_2d, &abonus25_2d, &ascr33a_2d, &ascr33b_2d, &ascr33c_2d, &ascr33d_2d, 0};
+actListPtr ALchkbell2_2d[] = {&achkbell2_2d, 0};
+actListPtr ALchkc09_2d[] = {&achkc09_2d, 0};
+actListPtr ALchkcarry_2d[] = {&achkcarry_2d, 0};
+actListPtr ALchkdoc_2d[] = {&achkdoc_2d, 0};
+actListPtr ALchkld3_2d[] = {&achkld3_2d, 0};
+actListPtr ALchkld4_2d[] = {&achkld4_2d, 0};
+actListPtr ALchkmat2_2d[] = {&achkmat2_2d, 0};
+actListPtr ALchkpap1_2d[] = {&achkpaper1_2d, 0};
+actListPtr ALchkpap2_2d[] = {&achkpaper2_2d, 0};
+actListPtr ALchkrr2_2d[] = {&achkrr3_2d, 0};
+actListPtr ALchksafe_2d[] = {&achksafe_2d, 0};
+actListPtr ALchkscrew_2d[] = {&achkscrew_2d, 0};
+actListPtr ALchkstate1_2d[] = {&achkstate1_2d, 0};
+actListPtr ALclick_2d[] = {&aclick_2d, 0};
+actListPtr ALclimax_2d[] = {&aclimax1_2d, &aclimax2_2d, &aclimax3_2d, &aclimax4_2d, &aclimax5_2d, &aclimax6_2d, &aclimax7_2d, 0};
+actListPtr ALclimbrope_2d[] = {&achkrr1_2d, 0};
+actListPtr ALclimbup_2d[] = {&arxy21_2d, &arup_2d, &arr21_2d, 0};
+actListPtr ALclimbwell_2d[] = {&abonus16_2d, &achkwell_2d, 0};
+actListPtr ALclue09_2d[] = {&aclue09a_2d, &aclue09b_2d, &aclue09c_2d, 0};
+actListPtr ALcomb1_2d[] = {&acomb1_2d, 0};
+actListPtr ALcomb2_2d[] = {&acomb2_2d, 0};
+actListPtr ALcook_2d[] = {&acooklips_2d, &aridcooklips_2d, &acook1_2d, &acook2_2d, &acook3_2d, &acook4_2d, &acook5_2d, &acook6_2d, &acopbit4_2d, &acook7_2d, &acook8_2d, &acook9_2d, 0};
+actListPtr ALcookp_2d[] = {&abonus22_2d, &acookp1_2d, &acookp2_2d, &acookp3_2d, 0};
+actListPtr ALcop_2d[] = {&acop1_2d, &acop2_2d, &acop3_2d, 0};
+actListPtr ALcure_2d[] = {&aserum1_2d, &aserum2_2d, &acure_2d, 0};
+actListPtr ALdalek_2d[] = {&adead1_2d, &adead2_2d, &adead3_2d, &adead4_2d, &aext1_2d, &aext2_2d, &aext3_2d, &adead5_2d, 0};
+actListPtr ALdial_2d[] = {&adial_2d, 0};
+actListPtr ALdidnt_2d[] = {&adidnt1_2d, &adidnt2_2d, &ascr33a_2d, &ascr33b_2d, &ascr33c_2d, &ascr33d_2d, 0};
+actListPtr ALdoctor_2d[] = {&achkdalek_2d, 0};
+actListPtr ALdog1_2d[] = {&adog1_2d, 0};
+actListPtr ALdone_2d[] = {&adisable_2d, &adone1_2d, &adone2_2d, &adone3_2d, &adone4_2d, &adone5_2d, &adone6_2d, &adone7_2d, &adone8_2d, &adone9_2d, &adone10_2d, &adone11_2d, &adone12_2d, &adone13_2d, &adone14_2d, &adone15_2d, 0};
+actListPtr ALdropdyn1_2d[] = {&achkdrop_2d, 0};
+actListPtr ALdropdyn2_2d[] = {&adropdyn2_2d, 0};
+actListPtr ALdropdynamite_2d[] = {&adropdyn1_2d, 0};
+actListPtr ALdropmat_2d[] = {&amat1_2d, &amat2_2d, &amat3_2d, &amat4_2d, &amat5_2d, &amat6_2d, 0};
+actListPtr ALdumb_2d[] = {&abonus6_2d, &adumbchk_2d, 0};
+actListPtr ALdyn1_2d[] = {&adyn1_2d, &adyn2_2d, 0};
+actListPtr ALeatbanana_2d[] = {&aridban_2d, &aeatban_2d, &asubban_2d, &adropban_2d, 0};
+actListPtr ALempty_2d[] = {&aempty_2d, 0};
+actListPtr ALexitmaze_2d[] = {&aexitmaze_2d, &aheroxy11_2d, &ascrmaze_2d, 0};
+actListPtr ALfaint_2d[] = {&afaint1_2d, &adisable_2d, &afaint2_2d, &afaint3_2d, &afaint4_2d, &afaint5_2d, &afaint6_2d, &afaint7_2d, &afaint8_2d, &afaint9_2d, &afaint10_2d, 0};
+actListPtr ALgard1_2d[] = {&agard2_2d, &agard3_2d, &agard4_2d, &agard5_2d, &agard6_2d, &agard7_2d, &agard8_2d, &agard9_2d, &agard10_2d, &agard11_2d, 0};
+actListPtr ALgarlic_2d[] = {&agarchk_2d, 0};
+actListPtr ALgatelight_2d[] = {&abutchk_2d, &achkglight_2d, 0};
+actListPtr ALgatescls_2d[] = {&agatescls_2d, 0};
+actListPtr ALgatesopn_2d[] = {&abonus8_2d, &agatesopn_2d, 0};
+actListPtr ALgenie_2d[] = {&asong2a_2d, &abonus30_2d, &agenie1_2d, &agenie2_2d, &agenie3_2d, &agenie4_2d, 0};
+actListPtr ALgetbook_2d[] = {&achkstate0_2d, 0};
+actListPtr ALgetdynamite_2d[] = {&adynamite1_2d, 0};
+actListPtr ALgetgarlic_2d[] = {&agetgarlic_2d, 0};
+actListPtr ALgetmatch_2d[] = {&agetmatch_2d, 0};
+actListPtr ALgiveb2_2d[] = {&achkgive_2d, 0};
+actListPtr ALgiveb3_2d[] = {&agiveb2_2d, &agiveb3_2d, &agiveb4_2d, &agiveb5_2d, &agiveb6_2d, &agiveb7_2d, &abel1_2d, &abel2_2d, &abel3_2d, &abel4_2d, &acat3_2d, &abonus21_2d, 0};
+actListPtr ALgiveb4_2d[] = {&asniff_2d, 0};
+actListPtr ALgivebel_2d[] = {&agiveb1_2d, 0};
+actListPtr ALglightoff_2d[] = {&aglightoff1_2d, &aglightoff2_2d, &aclick_2d, 0};
+actListPtr ALglighton_2d[] = {&aglighton1_2d, &aglighton2_2d, &aclick_2d, 0};
+actListPtr ALgoclosed_2d[] = {&ashed25_2d, &ascr0812_2d, 0};
+actListPtr ALgoopen_2d[] = {&ashed24_2d, &ascr0811_2d, 0};
+actListPtr ALgun_2d[] = {&achkgun_2d, 0};
+actListPtr ALharry_2d[] = {&aharry1_2d, &aharry2_2d, &aharry3_2d, &aharry4_2d, &aharry5_2d, &aharry6_2d, &aharry7_2d, &acopbit8_2d, &abonus23_2d, &asong0_2d, &ascreen35_2d, 0};
+actListPtr ALhdrink_2d[] = {&ahdrink1_2d, &ahdrink2_2d, &ahdrink3_2d, &ahdrink4_2d, &ahdrink5_2d, &ahdrink6_2d, &ahdrink7_2d, &ahdrink8_2d, &ahdrink9_2d, &ahdrink10_2d, &ahdrink11_2d, &ahdrink12_2d, &ahdrink13_2d, &arepblah_2d, 0};
+actListPtr ALheroxy01_2d[] = {&aheroxy01_2d, &aherostart_2d, &aheroseq1_2d, 0};
+actListPtr ALhfaint_2d[] = {&adisable_2d, &ahfaint1_2d, &ahfaint2_2d, &ahfaint3_2d, &ahfaint4_2d, &ahfaint5_2d, &ahfaint6_2d, 0};
+actListPtr ALhole_2d[] = {&ahole_2d, 0};
+actListPtr ALhprompt_2d[] = {&ahestd1_2d, &ahestd2_2d, &ahestd3_2d, 0};
+actListPtr ALhrgreet_2d[] = {&ahest1_2d, &ahest2_2d, &ahest3_2d, &ahest4_2d, &ahest5_2d, &ahest6_2d, &ahest7_2d, &ahest8_2d, &ahest9_2d, &ahest10_2d, &ahest11_2d, &ahest12_2d, &ahest13_2d, &ahest14_2d, &ahest15_2d, &ahest16_2d, 0};
+actListPtr ALhtable_2d[] = {&achkhr2_2d, 0};
+actListPtr ALhugone_2d[] = {&asetbk1_2d, &abkstart1_2d, &abkstart2_2d, &abkstop_2d, &aswaphero_2d, &ascreen2_2d, &abonus1_2d, &asong2_2d, &adisable_2d, &agone1_2d, &agone2_2d, &agone3_2d, &agone4_2d, &acyc2_2d, &agone5_2d, &agone6_2d, &agone7_2d, &agone8_2d, &agone9_2d, &agone10_2d, &agone11_2d, &agone12_2d, &agone13_2d, &agone14_2d, &agone15_2d, 0};
+actListPtr ALkaboom_2d[] = {&asong5_2d, &akaboom1_2d, &akaboom2_2d, &akaboom3_2d, 0};
+actListPtr ALkaboom3_2d[] = {&adead1_2d, &adead2_2d, &aboomxy_2d, &adead3_2d, &adead4_2d, &adead5_2d, 0};
+actListPtr ALkeyhole_2d[] = {&akeyhole_2d, 0};
+actListPtr ALkeyhole1_2d[] = {&akeyhole1_2d, 0};
+actListPtr ALkeyhole2_2d[] = {&aok_2d, &akeyhole3_2d, &akeyhole4_2d, &akeyhole5_2d, &akeyhole6_2d, &ascr0204_2d, 0};
+actListPtr ALlamp_2d[] = {&achklamp_2d, 0};
+actListPtr ALlightdynamite_2d[] = {&achkld1_2d, 0};
+actListPtr ALlookkennel_2d[] = {&achkken1_2d, 0};
+actListPtr ALlookm1_2d[] = {&alookm1_2d, 0};
+actListPtr ALlookm2_2d[] = {&alookm2_2d, 0};
+actListPtr ALlookmatch_2d[] = {&amatchk1_2d, 0};
+actListPtr ALmaid_2d[] = {&amaidlips_2d, &aridmaidlips_2d, &amaid1_2d, &amaid2_2d, &amaid3_2d, &amaid4_2d, &amaid5_2d, &amaid6_2d, &amaidgo_2d, &amaid7_2d, &amaid8_2d, &amaid9_2d, &amaid10_2d, &amaid11_2d, &arepmsg1_2d, 0};
+actListPtr ALmaidbk_2d[] = {&amaidbk1_2d, &amaidbk2_2d, &amaidbk3_2d, &amaidbk4_2d, &amaidbk5_2d, &amaidbk6_2d, &amaidbk7_2d, &amaidbk8_2d, 0};
+actListPtr ALmaidp_2d[] = {&achkmaid_2d, 0};
+actListPtr ALmaidx_2d[] = {&amaidp1_2d, &amaidp2_2d, &amaidp3_2d, &amaidp4_2d, &amaidp5_2d, &amaidp6_2d, &amaidp7_2d, &amaidp8_2d, &amaidp9_2d, &arepblah_2d, 0};
+actListPtr ALmap0_2d[] = {&amap0_2d, 0};
+actListPtr ALmap1_2d[] = {&amap1_2d, 0};
+actListPtr ALmatok_2d[] = {&achkld2_2d, 0};
+actListPtr ALmissed_2d[] = {&amissed1_2d, &amissed2_2d, &amissed3_2d, 0};
+actListPtr ALnasty_2d[] = {&abite3_2d, &abite4_2d, &abite5_2d, &abite6_2d, 0};
+actListPtr ALnobang_2d[] = {&anobang_2d, 0};
+actListPtr ALnobang2_2d[] = {&anobang2_2d, 0};
+actListPtr ALnobell_2d[] = {&abell_2d, &anobell_2d, 0};
+actListPtr ALnocarry_2d[] = {&anocarry_2d, 0};
+actListPtr ALnocure_2d[] = {&aserum1_2d, 0};
+actListPtr ALnodrink_2d[] = {&ahnod1_2d, &ahnod2_2d, &ahnod3_2d, &arepblah_2d, 0};
+actListPtr ALnogenie_2d[] = {&anogenie_2d, 0};
+actListPtr ALnopurps_2d[] = {&anopurps_2d, 0};
+actListPtr ALnoreply_2d[] = {&anoreply_2d, 0};
+actListPtr ALnotrap_2d[] = {&anotrap_2d, 0};
+actListPtr ALomgag_2d[] = {&aomlips_2d, &aomridlip_2d, &aom1_2d, &aom2_2d, &aom3_2d, &aom4_2d, &aom5_2d, &aom6_2d, &aom7_2d, &aom8_2d, &aom9_2d, &aom10_2d, &aom11_2d, &aom12_2d, &aom13_2d, &aom14_2d, &aom15_2d, &aom16_2d, &aom17_2d, &aom18_2d, &aom19_2d, &aom20_2d, &abonus11_2d, 0};
+actListPtr ALopendoor1_2d[] = {&astophero_2d, &amaidstop1_2d, &amaidstop2_2d, &aopendoor1_2d, &ast12_2d, &aheroxy12_2d, &aclosedoor1_2d, &ascr12_2d, 0};
+actListPtr ALopendoor2_2d[] = {&astophero_2d, &aopendoor2_2d, &ast3435_2d, &aheroxy3435_2d, &aclosedoor2_2d, &ascr3435_2d, 0};
+actListPtr ALopendoor3_2d[] = {&astophero_2d, &aopendoor3_2d, &ast3436_2d, &aheroxy3436_2d, &aclosedoor3_2d, &ascr3436_2d, 0};
+actListPtr ALpanel_2d[] = {&asong2up_2d, &asong2dn_2d, &adisable_2d, &apanel1_2d, &apanel2_2d, &apanel3_2d, &apanel4_2d, &apanel5_2d, &apanel6_2d, &apanel7_2d, &apanel8_2d, 0};
+actListPtr ALparty_2d[] = {&adisable_2d, &aparty1a_2d, &aparty1b_2d, &aparty1c_2d, &aparty2a_2d, &aparty2b_2d, &aparty2c_2d, &aparty3a_2d, &aparty3b_2d, &aparty3c_2d, &aparty4a_2d, &aparty4b_2d, &aparty4c_2d, &aparty5a_2d, &aparty5b_2d, &aparty5c_2d, &aparty6a_2d, &aparty6b_2d, &aparty6c_2d, &aparty7a_2d, &aparty7b_2d, &aparty7c_2d, &aparty8a_2d, &aparty8b_2d, &aparty8c_2d, &aparty9a_2d, &aparty9b_2d, &aparty9c_2d, &aclimax_2d, 0};
+actListPtr ALpencil_2d[] = {&apen1_2d, &apen2_2d, &apen3_2d, &apen4_2d, &apen5_2d, &abonus27_2d, &afinito_2d, &ascr3334_2d, 0};
+actListPtr ALpengone_2d[] = {&abonus3_2d, &abkstart1_2d, &abkstart2_2d, &abkstop_2d, &asong2_2d, &adisable_2d, &apeng1_2d, &apeng2_2d, &apeng3_2d, &apeng4_2d, &ascr0203_2d, 0};
+actListPtr ALpenny1_2d[] = {&apenxy_2d, &apenseq1_2d, &apenseq2_2d, &apenseq3_2d, &apenseq4_2d, &apenstart_2d, &apenvxy1_2d, &apenvxy2_2d, &apenvxy3_2d, &apenvxy4_2d, &apenseq5_2d, &apenseq6_2d, &apenstop_2d, 0};
+actListPtr ALphone_2d[] = {&achkpb2_2d, 0};
+actListPtr ALphonebox_2d[] = {&achkpb1_2d, 0};
+actListPtr ALphoto_2d[] = {&achkphoto_2d, 0};
+actListPtr ALphoto1_2d[] = {&achkph2_2d, 0};
+actListPtr ALphoto2_2d[] = {&aphoto6_2d, 0};
+actListPtr ALphoto3_2d[] = {&aphoto1_2d, &aphoto2_2d, &aphoto3_2d, &aphoto4_2d, &aphoto5_2d, 0};
+actListPtr ALpois1_2d[] = {&apois1_2d, 0};
+actListPtr ALpois2_2d[] = {&apois2_2d, 0};
+actListPtr ALpois3_2d[] = {&apois3_2d, 0};
+actListPtr ALpois4_2d[] = {&apois4_2d, &adead1_2d, &adead2_2d, &adead3_2d, &adead4_2d, &adead5_2d, 0};
+actListPtr ALpushpaper_2d[] = {&abonus26_2d, &apaper1_2d, &apaper2_2d, &apaper3_2d, &apaper4_2d, 0};
+actListPtr ALpushpencil_2d[] = {&achkpencil_2d, 0};
+actListPtr ALreadlet_2d[] = {&abonus24_2d, &acopbit16_2d, 0};
+actListPtr ALrepmsg1_2d[] = {&amaid12_2d, &arepmsg1_2d, 0};
+actListPtr ALrg_2d[] = {&arxy_2d, &arok_2d, &arg_2d, 0};
+actListPtr ALridgard_2d[] = {&adropgarl_2d, &aridgarl_2d, &aeatgarl2_2d, &aridgard1_2d, &aridgard2_2d, &aridgard3_2d, &aridgard4_2d, &aridgard5_2d, &aridpath_2d, &aridtext_2d, &aridgard6_2d, &abonus7_2d, &agarl1_2d, &aschedbut_2d, 0};
+actListPtr ALridgarl_2d[] = {&adropgarl_2d, &aridgarl_2d, &aeatgarl1_2d, &subgarlic_2d, 0};
+actListPtr ALridkey_2d[] = {&aridkey1_2d, &aridkey2_2d, 0};
+actListPtr ALrr_2d[] = {&arxy_2d, &arok_2d, &arr_2d, 0};
+actListPtr ALrumbling_2d[] = {&arumbling_2d, 0};
+actListPtr ALsafe_2d[] = {&achkwill_2d, 0};
+actListPtr ALsafe1_2d[] = {&abonus19_2d, &asafe1_2d, &asafe2_2d, &asafe3_2d, &asafe4_2d, &asafe5_2d, 0};
+actListPtr ALsafepr_2d[] = {&asafepr_2d, 0};
+actListPtr ALschedbut_2d[] = {&aexplainb_2d, 0};
+actListPtr ALscr01_2d[] = {&astory1_2d, &astory2_2d, &ascr01_2d, 0};
+actListPtr ALscr02_2d[] = {&achkbed1_2d, 0};
+actListPtr ALscr0201_2d[] = {&ascr21_2d, 0};
+actListPtr ALscr03_2d[] = {&achkpanel_2d, 0};
+actListPtr ALscr0301_2d[] = {&ascr31_2d, 0};
+actListPtr ALscr0305_2d[] = {&abed2_1_2d, &ascr0305_2d, 0};
+actListPtr ALscr0306_2d[] = {&adumb1_2d, &adumb2_2d, &adumb3_2d, &ascr0306_2d, 0};
+actListPtr ALscr04_2d[] = {&abonus2_2d, &amurd1_2d, &amurd2_2d, &amurd3_2d, &amurd4_2d, &ascr0402_2d, 0};
+actListPtr ALscr0503_2d[] = {&abed3_1_2d, &ascr0503_2d, 0};
+actListPtr ALscr06_2d[] = {&achkcook_2d, 0};
+actListPtr ALscr0603_2d[] = {&adumb11_2d, &adumb12_2d, &adumb13_2d, &ascr0603_2d, 0};
+actListPtr ALscr0607_2d[] = {&akit1_2d, &akit2_2d, &ascr0607_2d, 0};
+actListPtr ALscr0631_2d[] = {&achkkit_2d, 0};
+actListPtr ALscr0706_2d[] = {&abd1_2d, &abd2_2d, &ascr0706_2d, 0};
+actListPtr ALscr0708_2d[] = {&abd20_2d, &abd21_2d, &ascr0708_2d, 0};
+actListPtr ALscr0710_2d[] = {&abd10_2d, &abd11_2d, &ascr0710_2d, 0};
+actListPtr ALscr0807_2d[] = {&ashed1_2d, &ashed2_2d, &ascr0807_2d, 0};
+actListPtr ALscr0809_2d[] = {&ashed11_2d, &ashed12_2d, &ascr0809_2d, 0};
+actListPtr ALscr09_2d[] = {&agard1_2d, &aclue09_2d, 0};
+actListPtr ALscr0908_2d[] = {&ainshed1_2d, &ainshed2_2d, &ascr0908_2d, 0};
+actListPtr ALscr10_2d[] = {&awarn_2d, 0};
+actListPtr ALscr1007_2d[] = {&avenus1_2d, &avenus2_2d, &ascr1007_2d, 0};
+actListPtr ALscr1108_2d[] = {&agates1_2d, &ascr1108_2d, 0};
+actListPtr ALscr1113_2d[] = {&agates11_2d, &ascr1113_2d, 0};
+actListPtr ALscr1314_2d[] = {&astream11_2d, &astream12_2d, &ascr1314_2d, 0};
+actListPtr ALscr14_2d[] = {&achkbugs_2d, &awarnz_2d, 0};
+actListPtr ALscr1413_2d[] = {&azap1_2d, &ascr1413_2d, 0};
+actListPtr ALscr1415_2d[] = {&azap11_2d, &ascr1415_2d, 0};
+actListPtr ALscr15_2d[] = {&achkom_2d, 0};
+actListPtr ALscr1514_2d[] = {&amush1_2d, &ascr1514_2d, 0};
+actListPtr ALscr1516_2d[] = {&amush21_2d, &ascr1516_2d, 0};
+actListPtr ALscr1517_2d[] = {&amush11_2d, &ascr1517_2d, 0};
+actListPtr ALscr1615_2d[] = {&awell1_2d, &ascr1615_2d, 0};
+actListPtr ALscr1715_2d[] = {&asnake1_2d, &ascr1715_2d, 0};
+actListPtr ALscr1718_2d[] = {&asnake11_2d, &ascr1718_2d, 0};
+actListPtr ALscr1720_2d[] = {&asnake21_2d, &ascr1720_2d, 0};
+actListPtr ALscr1817_2d[] = {&aphone1_2d, &ascr1817_2d, 0};
+actListPtr ALscr1819c_2d[] = {&aphone11c_2d, &ascr1819_2d, 0};
+actListPtr ALscr1819l_2d[] = {&aphone11l_2d, &ascr1819_2d, 0};
+actListPtr ALscr1819r_2d[] = {&aphone11r_2d, &ascr1819_2d, 0};
+actListPtr ALscr1918c_2d[] = {&aphone11c_2d, &ascr1918_2d, 0};
+actListPtr ALscr1918l_2d[] = {&aphone11l_2d, &ascr1918_2d, 0};
+actListPtr ALscr1918r_2d[] = {&aphone11r_2d, &ascr1918_2d, 0};
+actListPtr ALscr2017_2d[] = {&akennel1_2d, &ascr2017_2d, 0};
+actListPtr ALscr2223_2d[] = {&arockg1_2d, &ascr2223_2d, 0};
+actListPtr ALscr2322_2d[] = {&athree1_2d, &ascr2322_2d, 0};
+actListPtr ALscr2324_2d[] = {&athree11_2d, &ascr2324_2d, 0};
+actListPtr ALscr2325_2d[] = {&athree21_2d, &ascr2325_2d, 0};
+actListPtr ALscr2326_2d[] = {&athree31_2d, &ascr2326_2d, 0};
+actListPtr ALscr2423_2d[] = {&alamp1_2d, &ascr2423_2d, 0};
+actListPtr ALscr2523_2d[] = {&achasm25_2d, &ascr2523_2d, 0};
+actListPtr ALscr2623_2d[] = {&apass1_2d, &ascr2623_2d, 0};
+actListPtr ALscr2627_2d[] = {&apass11_2d, &ascr2627_2d, 0};
+actListPtr ALscr2726_2d[] = {&aladder1_2d, &ascr2726_2d, 0};
+actListPtr ALscr2827_2d[] = {&atrap1_2d, &ascr2827_2d, 0};
+actListPtr ALscr2829_2d[] = {&atrap2_2d, &ascr2829_2d, 0};
+actListPtr ALscr29_2d[] = {&achkcop_2d, 0};
+actListPtr ALscr2928_2d[] = {&ahall2_1_2d, &ascr2928_2d, 0};
+actListPtr ALscr2930_2d[] = {&ahall2_2_2d, &ahall2_2a_2d, &ascr2930_2d, 0};
+actListPtr ALscr2931_2d[] = {&ahall2_3_2d, &ascr2931_2d, 0};
+actListPtr ALscr2934_2d[] = {&ahall2_4_2d, &ascr2934_2d, 0};
+actListPtr ALscr2938_2d[] = {&ahall2_5_2d, &ascr2938_2d, 0};
+actListPtr ALscr30_2d[] = {&achkcop2_2d, 0};
+actListPtr ALscr3029_2d[] = {&alounge1_2d, &ascr3029_2d, 0};
+actListPtr ALscr3106_2d[] = {&achkcookp_2d, &aparlor3_2d, &ascr3106_2d, 0};
+actListPtr ALscr3129_2d[] = {&aparlor2_2d, &ascr3129_2d, 0};
+actListPtr ALscr3132_2d[] = {&aparlor1_2d, &ascr3132_2d, 0};
+actListPtr ALscr3231_2d[] = {&acatroom1_2d, &ascr3231_2d, 0};
+actListPtr ALscr33_2d[] = {&adraught_2d, &adrop33a_2d, &adrop33b_2d, &adrop33c_2d, &adrop33d_2d, &adrop33e_2d, &adrop33f_2d, &adrop33g_2d, &adrop33h_2d, &adrop33i_2d, &adrop33j_2d, 0};
+actListPtr ALscr34_2d[] = {&achkhero_2d, 0};
+actListPtr ALscr3429_2d[] = {&ahall3_2_2d, &ascr3429_2d, 0};
+actListPtr ALscr3438_2d[] = {&ahall3_1_2d, &ahall3_1a_2d, &ascr3438_2d, 0};
+actListPtr ALscr35_2d[] = {&achksong_2d, 0};
+actListPtr ALscr3534_2d[] = {&asong0_2d, &aorgan1_2d, &ascr3534_2d, 0};
+actListPtr ALscr36_2d[] = {&achkhr1_2d, 0};
+actListPtr ALscr3634_2d[] = {&ahestroom1_2d, &ascr3634_2d, 0};
+actListPtr ALscr3718_2d[] = {&aretupxy_2d, &ascr3718_2d, 0};
+actListPtr ALscr3829_2d[] = {&ahall1_1_2d, &ascr3829_2d, 0};
+actListPtr ALscr3834_2d[] = {&ahall1_2_2d, &ahall1_3_2d, &ascr3834_2d, 0};
+actListPtr ALscrgate1_2d[] = {&ashed21_2d, &ashed22_2d, &ashed23_2d, &achkgo_2d, 0};
+actListPtr ALscrgate2_2d[] = {&astream1_2d, &achkgo_2d, 0};
+actListPtr ALscrok_2d[] = {&akit11_2d, &ascr0631_2d, 0};
+actListPtr ALshedlight_2d[] = {&abutchk_2d, &achkslight_2d, 0};
+actListPtr ALshot_2d[] = {&aridsched_2d, &amissed1_2d, &amissed2_2d, &amissed3_2d, &adalek1_2d, &adalek2_2d, &adalek3_2d, &adalek4_2d, &adalek5_2d, &adalek6_2d, &adalek7_2d, &abonus15_2d, 0};
+actListPtr ALsilly_2d[] = {&asilly_2d, 0};
+actListPtr ALslightoff_2d[] = {&aslightoff1_2d, &aslightoff2_2d, 0};
+actListPtr ALslighton_2d[] = {&aslighton1_2d, &aslighton2_2d, 0};
+actListPtr ALsnake_2d[] = {&achksnake_2d, 0};
+actListPtr ALsong1_2d[] = {&asong1_2d, 0};
+actListPtr ALsong3_2d[] = {&asong3_2d, 0};
+actListPtr ALsong4_2d[] = {&asong4_2d, 0};
+actListPtr ALsonic_2d[] = {&asonic1_2d, &asonic2_2d, &asonic3_2d, &asonic4_2d, &asonic5_2d, &asonic6_2d, &asonic7_2d, &asonic8_2d, 0};
+actListPtr ALstrike1_2d[] = {&astrike1_2d, 0};
+actListPtr ALstrikematch_2d[] = {&amatchk2_2d, 0};
+actListPtr ALswgates_2d[] = {&aswgates_2d, &arumbling_2d, 0};
+actListPtr ALswzapper_2d[] = {&aswzapper_2d, &aclick_2d, 0};
+actListPtr ALthrown_2d[] = {&achkken2_2d, 0};
+actListPtr ALthrowstick_2d[] = {&astick1_2d, &adisable_2d, &astick2_2d, &astick3_2d, &astick4_2d, &astick5_2d, &astick6_2d, &astick7_2d, &astick8_2d, &astick9_2d, &astick10_2d, &abonus12_2d, 0};
+actListPtr ALtrap_2d[] = {&achktrap_2d, 0};
+actListPtr ALuptrap_2d[] = {&auptrap1_2d, &auptrap2_2d, 0};
+actListPtr ALvenus_2d[] = {&astung_2d, &adead1_2d, &adead2_2d, &adead3_2d, &adead4_2d, &adead5_2d, 0};
+actListPtr ALwho_2d[] = {&abonus14_2d, &awho1_2d, &awho2_2d, &awho3_2d, &awho4_2d, &ascr1837_2d, 0};
+actListPtr ALwill_2d[] = {&achkmag_2d, 0};
+actListPtr ALwill1_2d[] = {&awill1_2d, &awill2_2d, &acopbit1_2d, &abonus20_2d, 0};
+actListPtr ALwill2_2d[] = {&awill3_2d, &awill4_2d, 0};
+actListPtr ALworkgates_2d[] = {&abutchk_2d, &achkgates_2d, 0};
+actListPtr ALzapperoff_2d[] = {&azapperoff1_2d, &azapperoff2_2d, 0};
+actListPtr ALzapperon_2d[] = {&abonus9_2d, &azapperon1_2d, &azapperon2_2d, 0};
+
+// Special action list for maze
+act2 aheroxy_2d = {INIT_OBJXY, 0, HERO, 0, 0};
+act1 aherostop_2d = {START_OBJ, 0, HERO, 0, NOT_CYCLING};
+act8 anewscr_2d = {NEW_SCREEN, 0, 0};
+actListPtr ALnewscr_2d[] = {&aheroxy_2d, &astophero_2d, &aherostop_2d, &anewscr_2d, 0};
+
+actList actListArr_2d[] = {
+ ALDummy, AL11maze_2d, ALballoon_2d, ALbanana_2d, ALbang1_2d,
+ ALbang2_2d, ALbed1_2d, ALbell_2d, ALbell1_2d, ALbell2_2d,
+ ALbite_2d, ALblah_2d, ALboom_2d, ALbottle_2d, ALbridge_2d,
+ ALbugattack_2d, ALbugflit_2d, ALbugrep1_2d, ALbugrep2_2d, ALbugs_2d,
+ ALbugzapper_2d, ALcallp_2d, ALcantpush_2d, ALcat1_2d, ALcat2_2d,
+ ALcat3_2d, ALcat4_2d, ALcat5_2d, ALcat6_2d, ALcatnip_2d,
+ ALchasm_2d, ALcheat_2d, ALchkbell2_2d, ALchkc09_2d, ALchkcarry_2d,
+ ALchkdoc_2d, ALchkld3_2d, ALchkld4_2d, ALchkmat2_2d, ALchkpap1_2d,
+ ALchkpap2_2d, ALchkrr2_2d, ALchksafe_2d, ALchkscrew_2d, ALchkstate1_2d,
+ ALclick_2d, ALclimax_2d, ALclimbrope_2d, ALclimbup_2d, ALclimbwell_2d,
+ ALclue09_2d, ALcomb1_2d, ALcomb2_2d, ALcook_2d, ALcookp_2d,
+ ALcop_2d, ALcure_2d, ALdalek_2d, ALdial_2d, ALdidnt_2d,
+ ALdoctor_2d, ALdog1_2d, ALdone_2d, ALdropdyn1_2d, ALdropdyn2_2d,
+ ALdropdynamite_2d, ALdropmat_2d, ALdumb_2d, ALdyn1_2d, ALeatbanana_2d,
+ ALempty_2d, ALexitmaze_2d, ALfaint_2d, ALgard1_2d, ALgarlic_2d,
+ ALgatelight_2d, ALgatescls_2d, ALgatesopn_2d, ALgenie_2d, ALgetbook_2d,
+ ALgetdynamite_2d, ALgetgarlic_2d, ALgetmatch_2d, ALgiveb2_2d, ALgiveb3_2d,
+ ALgiveb4_2d, ALgivebel_2d, ALglightoff_2d, ALglighton_2d, ALgoclosed_2d,
+ ALgoopen_2d, ALgun_2d, ALharry_2d, ALhdrink_2d, ALheroxy01_2d,
+ ALhfaint_2d, ALhole_2d, ALhprompt_2d, ALhrgreet_2d, ALhtable_2d,
+ ALhugone_2d, ALkaboom_2d, ALkaboom3_2d, ALkeyhole_2d, ALkeyhole1_2d,
+ ALkeyhole2_2d, ALlamp_2d, ALlightdynamite_2d, ALlookkennel_2d, ALlookm1_2d,
+ ALlookm2_2d, ALlookmatch_2d, ALmaid_2d, ALmaidbk_2d, ALmaidp_2d,
+ ALmaidx_2d, ALmap0_2d, ALmap1_2d, ALmatok_2d, ALmissed_2d,
+ ALnasty_2d, ALnobang_2d, ALnobang2_2d, ALnobell_2d, ALnocarry_2d,
+ ALnocure_2d, ALnodrink_2d, ALnogenie_2d, ALnopurps_2d, ALnoreply_2d,
+ ALnotrap_2d, ALomgag_2d, ALopendoor1_2d, ALopendoor2_2d, ALopendoor3_2d,
+ ALpanel_2d, ALparty_2d, ALpencil_2d, ALpengone_2d, ALpenny1_2d,
+ ALphone_2d, ALphonebox_2d, ALphoto_2d, ALphoto1_2d, ALphoto2_2d,
+ ALphoto3_2d, ALpois1_2d, ALpois2_2d, ALpois3_2d, ALpois4_2d,
+ ALpushpaper_2d, ALpushpencil_2d, ALreadlet_2d, ALrepmsg1_2d, ALrg_2d,
+ ALridgard_2d, ALridgarl_2d, ALridkey_2d, ALrr_2d, ALrumbling_2d,
+ ALsafe_2d, ALsafe1_2d, ALsafepr_2d, ALschedbut_2d, ALscr01_2d,
+ ALscr02_2d, ALscr0201_2d, ALscr03_2d, ALscr0301_2d, ALscr0305_2d,
+ ALscr0306_2d, ALscr04_2d, ALscr0503_2d, ALscr06_2d, ALscr0603_2d,
+ ALscr0607_2d, ALscr0631_2d, ALscr0706_2d, ALscr0708_2d, ALscr0710_2d,
+ ALscr0807_2d, ALscr0809_2d, ALscr09_2d, ALscr0908_2d, ALscr10_2d,
+ ALscr1007_2d, ALscr1108_2d, ALscr1113_2d, ALscr1314_2d, ALscr14_2d,
+ ALscr1413_2d, ALscr1415_2d, ALscr15_2d, ALscr1514_2d, ALscr1516_2d,
+ ALscr1517_2d, ALscr1615_2d, ALscr1715_2d, ALscr1718_2d, ALscr1720_2d,
+ ALscr1817_2d, ALscr1819c_2d, ALscr1819l_2d, ALscr1819r_2d, ALscr1918c_2d,
+ ALscr1918l_2d, ALscr1918r_2d, ALscr2017_2d, ALscr2223_2d, ALscr2322_2d,
+ ALscr2324_2d, ALscr2325_2d, ALscr2326_2d, ALscr2423_2d, ALscr2523_2d,
+ ALscr2623_2d, ALscr2627_2d, ALscr2726_2d, ALscr2827_2d, ALscr2829_2d,
+ ALscr29_2d, ALscr2928_2d, ALscr2930_2d, ALscr2931_2d, ALscr2934_2d,
+ ALscr2938_2d, ALscr30_2d, ALscr3029_2d, ALscr3106_2d, ALscr3129_2d,
+ ALscr3132_2d, ALscr3231_2d, ALscr33_2d, ALscr34_2d, ALscr3429_2d,
+ ALscr3438_2d, ALscr35_2d, ALscr3534_2d, ALscr36_2d, ALscr3634_2d,
+ ALscr3718_2d, ALscr3829_2d, ALscr3834_2d, ALscrgate1_2d, ALscrgate2_2d,
+ ALscrok_2d, ALshedlight_2d, ALshot_2d, ALsilly_2d, ALslightoff_2d,
+ ALslighton_2d, ALsnake_2d, ALsong1_2d, ALsong3_2d, ALsong4_2d,
+ ALsonic_2d, ALstrike1_2d, ALstrikematch_2d, ALswgates_2d, ALswzapper_2d,
+ ALthrown_2d, ALthrowstick_2d, ALtrap_2d, ALuptrap_2d, ALvenus_2d,
+ ALwho_2d, ALwill_2d, ALwill1_2d, ALwill2_2d, ALworkgates_2d,
+ ALzapperoff_2d, ALzapperon_2d, ALnewscr_2d
+};
+
+int oldrsp_3d[] = {kSTOldrsp1_3d, -1};
+int tiprsp_3d[] = {kSTTiprsp_3d, -1};
+
+act0 adarttest_3d = {ASCHEDULE, 0, kALdartsched_3d};
+act0 arepblink_3d = {ASCHEDULE, 60, kALeleblink_3d};
+act0 arepeatmouse_3d = {ASCHEDULE, 4, kALmouse_3d};
+act0 arepflash_3d = {ASCHEDULE, 10, kALflash_3d};
+
+act1 aappear1_3d = {START_OBJ, 1, HERO, 0, NOT_CYCLING};
+act1 acamp2a_3d = {START_OBJ, 0, NAT2_3d, 0, CYCLE_FORWARD};
+act1 acamp2b_3d = {START_OBJ, 0, NATG_3d, 0, CYCLE_FORWARD};
+act1 acamp8a_3d = {START_OBJ, 34, NAT2_3d, 0, NOT_CYCLING};
+act1 acamp8b_3d = {START_OBJ, 34, NATG_3d, 0, NOT_CYCLING};
+act1 acrash14_3d = {START_OBJ, 20, PENNY_3d, 0, CYCLE_FORWARD};
+act1 acrash19_3d = {START_OBJ, 42, HERO, 0, CYCLE_FORWARD};
+act1 acrash22_3d = {START_OBJ, 50, HERO, 0, INVISIBLE};
+act1 acrash9_3d = {START_OBJ, 5, HERO, 0, NOT_CYCLING};
+act1 adead1_3d = {START_OBJ, 0, HERO, 0, ALMOST_INVISIBLE};
+act1 adead3_3d = {START_OBJ, 0, PENNYLIE_3d, 0, NOT_CYCLING};
+act1 adropord2_3d = {START_OBJ, 0, CHEESE_3d, 0, NOT_CYCLING};
+act1 aenter5_3d = {START_OBJ, 4, MOUSE_3d, 0, ALMOST_INVISIBLE};
+act1 aenter6_3d = {START_OBJ, 4, CHEESE_3d, 0, ALMOST_INVISIBLE};
+act1 aenter8_3d = {START_OBJ, 4, CAGE_3d, 0, CYCLE_FORWARD};
+act1 aex4_3d = {START_OBJ, 0, GHOST_3d, 0, ALMOST_INVISIBLE};
+act1 afind2_3d = {START_OBJ, 0, CRYSTAL_3d, 0, NOT_CYCLING};
+act1 afindb3_3d = {START_OBJ, 0, BOOK_3d, 0, NOT_CYCLING};
+act1 aflask5_3d = {START_OBJ, 0, HERO, 0, ALMOST_INVISIBLE};
+act1 agot10_3d = {START_OBJ, 60, DOCTOR_3d, 0, CYCLE_FORWARD};
+act1 agot1a_3d = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 agot1b_3d = {START_OBJ, 0, DOCTOR_3d, 0, CYCLE_FORWARD};
+act1 ahelp3_3d = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 amission12_3d = {START_OBJ, 10, NATG_3d, 0, NOT_CYCLING};
+act1 amission15_3d = {START_OBJ, 29, LIPS_3d, 0, ALMOST_INVISIBLE};
+act1 amission18_3d = {START_OBJ, 34, HERO, 0, NOT_CYCLING};
+act1 amission4_3d = {START_OBJ, 0, NATG_3d, 0, CYCLE_FORWARD};
+act1 amission5_3d = {START_OBJ, 0, HERO, 0, CYCLE_FORWARD};
+act1 aold1a_3d = {START_OBJ, 0, MOUTH_3d, 0, NOT_CYCLING};
+act1 aold1b_3d = {START_OBJ, 20, MOUTH_3d, 0, CYCLE_FORWARD};
+act1 aold6a_3d = {START_OBJ, 0, MOUTH_3d, 0, NOT_CYCLING};
+act1 aold6g_3d = {START_OBJ, 22, HERO, 0, NOT_CYCLING};
+act1 aplantfix_3d = {START_OBJ, 0, PLANT1_3d, 0, NOT_CYCLING};
+act1 aprod1_3d = {START_OBJ, 0, DOCTOR_3d, 0, CYCLE_FORWARD};
+act1 aprod6_3d = {START_OBJ, 24, DOCTOR_3d, 0, CYCLE_FORWARD};
+act1 areturn2_3d = {START_OBJ, 0, NATG_3d, 0, NOT_CYCLING};
+act1 ascare15_3d = {START_OBJ, 0, ELEPHANT_3d, 0, CYCLE_FORWARD};
+act1 ascare16_3d = {START_OBJ, 64, ELEPHANT_3d, 0, ALMOST_INVISIBLE};
+act1 ascare4_3d = {START_OBJ, 0, E_EYES_3d, 0, ALMOST_INVISIBLE};
+act1 ascare6_3d = {START_OBJ, 0, MOUSE_3d, 0, CYCLE_FORWARD};
+act1 astick4_3d = {START_OBJ, 16, DOCTOR_3d, 0, ALMOST_INVISIBLE};
+act1 astick6_3d = {START_OBJ, 17, DOCLIE_3d, 0, CYCLE_FORWARD};
+act1 aswing1_3d = {START_OBJ, 0, HERO, 0, ALMOST_INVISIBLE};
+act1 aswing3_3d = {START_OBJ, 1, HERO, 0, CYCLE_FORWARD};
+act1 aswing8_3d = {START_OBJ, 15, HERO, 0, NOT_CYCLING};
+act1 atakecage1_3d = {START_OBJ, 0, CAGE_3d, 0, ALMOST_INVISIBLE};
+act1 atakecheese2_3d = {START_OBJ, 0, CHEESE_3d, 0, ALMOST_INVISIBLE};
+act1 avine2_3d = {START_OBJ, 0, BLOCK1_3d, 0, ALMOST_INVISIBLE};
+act1 avine3_3d = {START_OBJ, 0, BLOCK2_3d, 0, ALMOST_INVISIBLE};
+act1 avine4_3d = {START_OBJ, 0, BLOCK3_3d, 0, ALMOST_INVISIBLE};
+act1 aweb19_3d = {START_OBJ, 110, LIPS_3d, 0, ALMOST_INVISIBLE};
+act1 aweb21_3d = {START_OBJ, 115, PENNY_3d, 0, ALMOST_INVISIBLE};
+act1 aweb22_3d = {START_OBJ, 116, PENNYLIE_3d, 0, NOT_CYCLING};
+act1 aweb4_3d = {START_OBJ, 0, PENNY_3d, 0, CYCLE_FORWARD};
+act1 aweb7_3d = {START_OBJ, 38, PENNY_3d, 0, NOT_CYCLING};
+act1 awink1_3d = {START_OBJ, 8, O_EYE_3d, 1, CYCLE_FORWARD};
+act1 awink2_3d = {START_OBJ, 16, O_EYE_3d, 1, CYCLE_BACKWARD};
+act1 awink3_3d = {START_OBJ, 19, O_EYE_3d, 0, ALMOST_INVISIBLE};
+act1 aappear_3d = {START_OBJ, 0, HERO, 0, NOT_CYCLING};
+act1 adisappear_3d = {START_OBJ, 0, HERO, 0, ALMOST_INVISIBLE};
+act1 ahoriz1_3d = {START_OBJ, 0, HERO, 0, ALMOST_INVISIBLE};
+act1 ahoriz4_3d = {START_OBJ, 1, HERO, 0, CYCLE_FORWARD};
+
+act2 acamp0b_3d = {INIT_OBJXY, 0, NATG_3d, 128, 101};
+act2 acamp3a_3d = {INIT_OBJXY, 0, NAT2_3d, 17, 97};
+act2 acamp3b_3d = {INIT_OBJXY, 0, NATG_3d, 28, 101};
+act2 adoc4_3d = {INIT_OBJXY, 0, DOCTOR_3d, 70, 110};
+act2 adropcheese2_3d = {INIT_OBJXY, 0, CHEESE_3d, 158, 142};
+act2 aexit1_3d = {INIT_OBJXY, 0, HERO, 170, 110};
+act2 agot5a_3d = {INIT_OBJXY, 40, HERO, 239, 104};
+act2 ahole4a_3d = {INIT_OBJXY, 10, MOUSE_3d, 280, 135};
+act2 ahole4b_3d = {INIT_OBJXY, 10, MOUSE_3d, 200, 135};
+act2 aleft2_3d = {INIT_OBJXY, 0, HERO, 218, 106};
+act2 aleft4_3d = {INIT_OBJXY, 15, HERO, 53, 133};
+act2 amission3_3d = {INIT_OBJXY, 0, NATG_3d, 30, 120};
+act2 aold6f_3d = {INIT_OBJXY, 0, HERO, 289, 91};
+act2 aplane1_3d = {INIT_OBJXY, 0, HERO, 170, 50};
+act2 areturn4_3d = {INIT_OBJXY, 0, NATG_3d, 85, 115};
+act2 aright2_3d = {INIT_OBJXY, 0, HERO, 77, 106};
+act2 aright4_3d = {INIT_OBJXY, 15, HERO, 243, 133};
+act2 astick5_3d = {INIT_OBJXY, 17, DOCLIE_3d, 238, 133};
+act2 aweb2_3d = {INIT_OBJXY, 0, PENNY_3d, 270, 133};
+act2 aweb26_3d = {INIT_OBJXY, 0, HERO, 174, 107};
+act2 axy_brg_clftop_3d = {INIT_OBJXY, 0, HERO, 280, 30};
+act2 axy_brg_path_3d = {INIT_OBJXY, 0, HERO, 16, 91};
+act2 axy_camp_hut_3d = {INIT_OBJXY, 0, HERO, 27, 133};
+act2 axy_camp_village_c_3d = {INIT_OBJXY, 0, HERO, 100, 143};
+act2 axy_camp_village_l_3d = {INIT_OBJXY, 0, HERO, 45, 145};
+act2 axy_cave_turn_3d = {INIT_OBJXY, 0, HERO, 22, 136};
+act2 axy_cave_wfall_3d = {INIT_OBJXY, 0, HERO, 287, 140};
+act2 axy_clf_clftop_3d = {INIT_OBJXY, 0, HERO, 269, 130};
+act2 axy_clf_wfall_3d = {INIT_OBJXY, 0, HERO, 28, 140};
+act2 axy_clftop_brg_3d = {INIT_OBJXY, 0, HERO, 28, 91};
+act2 axy_clftop_clf_3d = {INIT_OBJXY, 0, HERO, 28, 140};
+act2 axy_clftop_slope_3d = {INIT_OBJXY, 0, HERO, 28, 120};
+act2 axy_crash_web_3d = {INIT_OBJXY, 0, HERO, 280, 133};
+act2 axy_garden_wbase_3d = {INIT_OBJXY, 0, HERO, 24, 114};
+act2 axy_hut_camp_3d = {INIT_OBJXY, 0, HERO, 280, 121};
+act2 axy_hut_in_3d = {INIT_OBJXY, 0, HERO, 155, 141};
+act2 axy_hut_out_3d = {INIT_OBJXY, 0, HERO, 148, 108};
+act2 axy_hut_village_c_3d = {INIT_OBJXY, 0, HERO, 207, 143};
+act2 axy_hut_village_r_3d = {INIT_OBJXY, 0, HERO, 207, 143};
+act2 axy_path_brg_3d = {INIT_OBJXY, 0, HERO, 289, 91};
+act2 axy_path_stream_3d = {INIT_OBJXY, 0, HERO, 289, 133};
+act2 axy_path_village_3d = {INIT_OBJXY, 0, HERO, 25, 143};
+act2 axy_path_web_3d = {INIT_OBJXY, 0, HERO, 25, 140};
+act2 axy_slope_clftop_3d = {INIT_OBJXY, 0, HERO, 280, 92};
+act2 axy_slope_stream_3d = {INIT_OBJXY, 0, HERO, 28, 133};
+act2 axy_stream_path_3d = {INIT_OBJXY, 0, HERO, 27, 140};
+act2 axy_stream_slope_3d = {INIT_OBJXY, 0, HERO, 275, 90};
+act2 axy_turn_cave_3d = {INIT_OBJXY, 0, HERO, 272, 140};
+act2 axy_turn_village_3d = {INIT_OBJXY, 0, HERO, 283, 143};
+act2 axy_village_camp_l_3d = {INIT_OBJXY, 0, HERO, 64, 130};
+act2 axy_village_camp_r_3d = {INIT_OBJXY, 0, HERO, 280, 130};
+act2 axy_village_path_3d = {INIT_OBJXY, 0, HERO, 280, 140};
+act2 axy_village_turn_3d = {INIT_OBJXY, 0, HERO, 27, 87};
+act2 axy_wbase_garden_3d = {INIT_OBJXY, 0, HERO, 272, 133};
+act2 axy_wbase_wfall_3d = {INIT_OBJXY, 0, HERO, 254, 114};
+act2 axy_web_crash_3d = {INIT_OBJXY, 0, HERO, 28, 140};
+act2 axy_web_path_3d = {INIT_OBJXY, 0, HERO, 280, 140};
+act2 axy_wfall_cave_3d = {INIT_OBJXY, 0, HERO, 27, 140};
+act2 axy_wfall_clf_3d = {INIT_OBJXY, 0, HERO, 280, 140};
+act2 axy_wfallb_wbase_3d = {INIT_OBJXY, 0, HERO, 273, 114};
+
+act3 abtipprompt_3d = {PROMPT, 0, kSTBridgeprompt_3d, tiprsp_3d, kALnotip_3d, kALbtip_3d, false};
+act3 aold1c_3d = {PROMPT, 60, kSTOldman1_3d, oldrsp_3d, kALold2_3d, kALwrong_3d, false};
+act3 aold2_3d = {PROMPT, 0, kSTOldman2_3d, oldrsp_3d, kALold3_3d, kALwrong_3d, false};
+act3 aold3_3d = {PROMPT, 0, kSTOldman3_3d, oldrsp_3d, kALold7_3d, kALold4_3d, false};
+
+act5 acamp4a_3d = {INIT_OBJVXY, 0, NAT2_3d, 4, 0};
+act5 acamp4b_3d = {INIT_OBJVXY, 0, NATG_3d, 3, 0};
+act5 acamp6a_3d = {INIT_OBJVXY, 33, NAT2_3d, 0, 0};
+act5 acamp7a_3d = {INIT_OBJVXY, 34, NATG_3d, 0, 0};
+act5 aclose1_3d = {INIT_OBJVXY, 0, CDOOR_3d, DX, 0};
+act5 aclose2_3d = {INIT_OBJVXY, 6, CDOOR_3d, 0, 0};
+act5 acrash17_3d = {INIT_OBJVXY, 23, PENNY_3d, -DX, 0};
+act5 acrash20_3d = {INIT_OBJVXY, 42, HERO, 0, -1};
+act5 acrash21_3d = {INIT_OBJVXY, 50, HERO, 0, 0};
+act5 acrash4_3d = {INIT_OBJVXY, 1, PENNY_3d, 0, DY};
+act5 acrash5_3d = {INIT_OBJVXY, 1, HERO, 0, DY};
+act5 acrash6_3d = {INIT_OBJVXY, 4, PENNY_3d, DX, 0};
+act5 acrash7_3d = {INIT_OBJVXY, 4, HERO, 0, 0};
+act5 adead4_3d = {INIT_OBJVXY, 0, HERO, 0, 0};
+act5 adn1_3d = {INIT_OBJVXY, 0, HERO, 0, DY};
+act5 aenter4_3d = {INIT_OBJVXY, 0, MOUSE_3d, -DX, 0};
+act5 aex3_3d = {INIT_OBJVXY, 0, GHOST_3d, 0, 0};
+act5 agot12_3d = {INIT_OBJVXY, 60, DOCTOR_3d, -DX, 0};
+act5 agot2b_3d = {INIT_OBJVXY, 26, HERO, 0, 0};
+act5 agot3b_3d = {INIT_OBJVXY, 28, DOCTOR_3d, 0, -DX};
+act5 agot4_3d = {INIT_OBJVXY, 22, CDOOR_3d, -DX, 0};
+act5 agot5_3d = {INIT_OBJVXY, 36, HERO, 0, -DX};
+act5 agot7_3d = {INIT_OBJVXY, 36, CDOOR_3d, DX, 0};
+act5 agot8_3d = {INIT_OBJVXY, 42, CDOOR_3d, 0, 0};
+act5 ahelp4_3d = {INIT_OBJVXY, 0, HERO, 0, DY};
+act5 ahelp6_3d = {INIT_OBJVXY, 8, HERO, -DX * 2, 0};
+act5 ahole3a_3d = {INIT_OBJVXY, 0, MOUSE_3d, DX, 0};
+act5 ahole3b_3d = {INIT_OBJVXY, 0, MOUSE_3d, -DX, 0};
+act5 aleft3_3d = {INIT_OBJVXY, 0, HERO, -DX * 2, 0};
+act5 amission11_3d = {INIT_OBJVXY, 10, NATG_3d, 0, 0};
+act5 amission17_3d = {INIT_OBJVXY, 36, HERO, 0, 0};
+act5 amission6_3d = {INIT_OBJVXY, 0, NATG_3d, DX, -1};
+act5 amission7_3d = {INIT_OBJVXY, 0, SPIDER_3d, 0, -1};
+act5 amission8_3d = {INIT_OBJVXY, 0, HERO, -DX, 0};
+act5 amission9_3d = {INIT_OBJVXY, 6, HERO, -DX, -1};
+act5 aopen1_3d = {INIT_OBJVXY, 0, CDOOR_3d, -DX, 0};
+act5 aprod3_3d = {INIT_OBJVXY, 2, DOCTOR_3d, DX * 4, 0};
+act5 aprod8_3d = {INIT_OBJVXY, 26, DOCTOR_3d, -DX, 0};
+act5 areturn3_3d = {INIT_OBJVXY, 0, NATG_3d, 0, 0};
+act5 aright3_3d = {INIT_OBJVXY, 0, HERO, DX * 2, 0};
+act5 ascare11_3d = {INIT_OBJVXY, 18, MOUSE_3d, DX * 4, -DY};
+act5 ascare14_3d = {INIT_OBJVXY, 0, ELEPHANT_3d, -3, 0};
+act5 ascare9_3d = {INIT_OBJVXY, 0, MOUSE_3d, -DX * 4, 0};
+act5 aswing6_3d = {INIT_OBJVXY, 15, HERO, 0, 0};
+act5 aup1_3d = {INIT_OBJVXY, 0, HERO, 0, -DY};
+act5 aweb11_3d = {INIT_OBJVXY, 50, SPIDER_3d, 0, 1};
+act5 aweb12_3d = {INIT_OBJVXY, 75, SPIDER_3d, 0, -4};
+act5 aweb13_3d = {INIT_OBJVXY, 80, SPIDER_3d, 0, 2};
+act5 aweb14_3d = {INIT_OBJVXY, 105, SPIDER_3d, 0, 0};
+act5 aweb5_3d = {INIT_OBJVXY, 0, PENNY_3d, -DX, -1};
+act5 aweb9_3d = {INIT_OBJVXY, 40, PENNY_3d, 0, 0};
+act5 astophero_3d = {INIT_OBJVXY, 0, HERO, 0, 0};
+
+act6 acheese1_3d = {INIT_CARRY, 0, CHEESE_3d, false};
+act6 adropord3_3d = {INIT_CARRY, 0, CHEESE_3d, false};
+act6 agive6_3d = {INIT_CARRY, 0, BLOWPIPE_3d, true};
+act6 agive7_3d = {INIT_CARRY, 0, BOUILLON_3d, false};
+act6 atakecage2_3d = {INIT_CARRY, 0, CAGE_3d, true};
+act6 atakecb3_3d = {INIT_CARRY, 0, CRYSTAL_3d, false};
+act6 atakecheese3_3d = {INIT_CARRY, 0, CHEESE_3d, true};
+
+act7 adead2_3d = {INIT_HF_COORD, 0, PENNYLIE_3d};
+act7 adropord1_3d = {INIT_HF_COORD, 0, CHEESE_3d};
+act7 afind1_3d = {INIT_HF_COORD, 0, CRYSTAL_3d};
+act7 afindb2_3d = {INIT_HF_COORD, 0, BOOK_3d};
+act7 ascare5_3d = {INIT_HF_COORD, 0, MOUSE_3d};
+
+act8 acrash23_3d = {NEW_SCREEN, 50, WEB_3d};
+act8 aexit2_3d = {NEW_SCREEN, 0, CRASH_3d};
+act8 aflask6_3d = {NEW_SCREEN, 0, SUNSET_3d};
+act8 aold6i_3d = {NEW_SCREEN, 22, BRIDGE2_3d};
+act8 aplane2_3d = {NEW_SCREEN, 0, PLANE_3d};
+act8 areturn_3d = {NEW_SCREEN, 1, CAVE_3d};
+act8 ascr_brg_clftop_3d = {NEW_SCREEN, 0, CLIFFTOP_3d};
+act8 ascr_brg_path_3d = {NEW_SCREEN, 0, PATH_UL_3d};
+act8 ascr_camp_hut_3d = {NEW_SCREEN, 0, HUT_OUT_3d};
+act8 ascr_camp_village_c_3d = {NEW_SCREEN, 0, VILLAGE_3d};
+act8 ascr_camp_village_l_3d = {NEW_SCREEN, 0, VILLAGE_3d};
+act8 ascr_cave_man_3d = {NEW_SCREEN, 0, OLDMAN_3d};
+act8 ascr_cave_turn_3d = {NEW_SCREEN, 0, TURN_3d};
+act8 ascr_clf_clftop_3d = {NEW_SCREEN, 0, CLIFFTOP_3d};
+act8 ascr_clf_wfall_3d = {NEW_SCREEN, 0, WFALL_3d};
+act8 ascr_clf_wnofall_3d = {NEW_SCREEN, 0, WFALL_B_3d};
+act8 ascr_clftop_brg_3d = {NEW_SCREEN, 0, BRIDGE2_3d};
+act8 ascr_clftop_clf_3d = {NEW_SCREEN, 0, CLIFF_3d};
+act8 ascr_clftop_slope_3d = {NEW_SCREEN, 0, SLOPE_3d};
+act8 ascr_crash_web_3d = {NEW_SCREEN, 0, WEB_3d};
+act8 ascr_garden_wbase_3d = {NEW_SCREEN, 0, WBASE_3d};
+act8 ascr_hut_camp_3d = {NEW_SCREEN, 0, CAMP_3d};
+act8 ascr_hut_in_3d = {NEW_SCREEN, 0, HUT_IN_3d};
+act8 ascr_hut_out_3d = {NEW_SCREEN, 0, HUT_OUT_3d};
+act8 ascr_hut_village_c_3d = {NEW_SCREEN, 0, VILLAGE_3d};
+act8 ascr_hut_village_r_3d = {NEW_SCREEN, 0, VILLAGE_3d};
+act8 ascr_path_brg1_3d = {NEW_SCREEN, 0, BRIDGE_3d};
+act8 ascr_path_brg2_3d = {NEW_SCREEN, 0, BRIDGE2_3d};
+act8 ascr_path_village_3d = {NEW_SCREEN, 0, VILLAGE_3d};
+act8 ascr_path_web_3d = {NEW_SCREEN, 0, WEB_3d};
+act8 ascr_slope_clftop_3d = {NEW_SCREEN, 0, CLIFFTOP_3d};
+act8 ascr_slope_stream1_3d = {NEW_SCREEN, 0, STREAM_3d};
+act8 ascr_slope_stream2_3d = {NEW_SCREEN, 0, STREAM2_3d};
+act8 ascr_stream_path_3d = {NEW_SCREEN, 0, PATH_3d};
+act8 ascr_stream_slope_3d = {NEW_SCREEN, 0, SLOPE_3d};
+act8 ascr_turn_cave_3d = {NEW_SCREEN, 0, CAVE_3d};
+act8 ascr_turn_village_3d = {NEW_SCREEN, 0, VILLAGE_3d};
+act8 ascr_village_camp_l_3d = {NEW_SCREEN, 0, CAMP_3d};
+act8 ascr_village_camp_r_3d = {NEW_SCREEN, 0, CAMP_3d};
+act8 ascr_village_path_3d = {NEW_SCREEN, 0, PATH_3d};
+act8 ascr_village_turn_3d = {NEW_SCREEN, 0, TURN_3d};
+act8 ascr_wbase_garden_3d = {NEW_SCREEN, 0, GARDEN_3d};
+act8 ascr_wbase_wfall_3d = {NEW_SCREEN, 0, WFALL_3d};
+act8 ascr_web_crash_3d = {NEW_SCREEN, 0, CRASH_3d};
+act8 ascr_web_path_3d = {NEW_SCREEN, 0, PATH_UL_3d};
+act8 ascr_wfall_cave_3d = {NEW_SCREEN, 0, CAVE_3d};
+act8 ascr_wfall_clf_3d = {NEW_SCREEN, 0, CLIFF_3d};
+act8 ascr_wfallb_wbase_3d = {NEW_SCREEN, 0, WBASE_3d};
+act8 aweb23_3d = {NEW_SCREEN, 117, CRASH_3d};
+
+act9 abrg_msg2_3d = {INIT_OBJSTATE, 0, VINE_3d, 1};
+act9 acamp0a_3d = {INIT_OBJSTATE, 4, NAT2_3d, 0};
+act9 acom0b_3d = {INIT_OBJSTATE, 0, NAT1_3d, 1};
+act9 acom1b_3d = {INIT_OBJSTATE, 0, NAT1_3d, 2};
+act9 acom2b_3d = {INIT_OBJSTATE, 0, NAT1_3d, 3};
+act9 acom3b_3d = {INIT_OBJSTATE, 0, NAT1_3d, 4};
+act9 acom4b_3d = {INIT_OBJSTATE, 0, NAT1_3d, 5};
+act9 acom5b_3d = {INIT_OBJSTATE, 0, NAT1_3d, 6};
+act9 acom6b_3d = {INIT_OBJSTATE, 0, NAT1_3d, 7};
+act9 acom7b_3d = {INIT_OBJSTATE, 0, NAT1_3d, 8};
+act9 acom8b_3d = {INIT_OBJSTATE, 0, NAT1_3d, 9};
+act9 adart1_3d = {INIT_OBJSTATE, 0, BLOWPIPE_3d, 1};
+act9 adn2_3d = {INIT_OBJSTATE, 0, HERO, 0};
+act9 adrink_3d = {INIT_OBJSTATE, 0, FLASK_3d, 0};
+act9 adropcheese3_3d = {INIT_OBJSTATE, 0, CHEESE_3d, 1};
+act9 aelewoken_3d = {INIT_OBJSTATE, 0, ELEPHANT_3d, 0};
+act9 aemptyflask_3d = {INIT_OBJSTATE, 0, FLASK_3d, 0};
+act9 aendaction_3d = {INIT_OBJSTATE, DARTTIME + 30, E_EYES_3d, 0};
+act9 aenter1_3d = {INIT_OBJSTATE, 0, MOUSE_3d, 2};
+act9 aex7_3d = {INIT_OBJSTATE, 0, GHOST_3d, 1};
+act9 afillmagic3_3d = {INIT_OBJSTATE, 0, FLASK_3d, 2};
+act9 afillord2_3d = {INIT_OBJSTATE, 0, FLASK_3d, 1};
+act9 afindb1_3d = {INIT_OBJSTATE, 0, BOOK_3d, 1};
+act9 agive3_3d = {INIT_OBJSTATE, 0, NAT1_3d, 10};
+act9 agot1_3d = {INIT_OBJSTATE, 0, DOCTOR_3d, 1};
+act9 ahelp2_3d = {INIT_OBJSTATE, 0, HERO, 1};
+act9 ahole5a_3d = {INIT_OBJSTATE, 0, MOUSE_3d, 1};
+act9 ahole5b_3d = {INIT_OBJSTATE, 0, MOUSE_3d, 0};
+act9 amakeclay2_3d = {INIT_OBJSTATE, 0, CLAY_3d, 1};
+act9 amission1_3d = {INIT_OBJSTATE, 0, PENNY_3d, 2};
+act9 amousefree_3d = {INIT_OBJSTATE, 0, MOUSE_3d, 3};
+act9 aoldstate_3d = {INIT_OBJSTATE, 0, MOUTH_3d, 1};
+act9 aopen2_3d = {INIT_OBJSTATE, 0, CDOOR_3d, 1};
+act9 apause0_3d = {INIT_OBJSTATE, 3 * NORMAL_TPS, NAT2_3d, 0};
+act9 apause1_3d = {INIT_OBJSTATE, 0, NAT2_3d, 1};
+act9 astartaction_3d = {INIT_OBJSTATE, 0, E_EYES_3d, 1};
+act9 astick3_3d = {INIT_OBJSTATE, 0, DOCTOR_3d, 2};
+act9 atakecheese1_3d = {INIT_OBJSTATE, 0, CHEESE_3d, 0};
+act9 aup2_3d = {INIT_OBJSTATE, 0, HERO, 1};
+act9 avine6_3d = {INIT_OBJSTATE, 0, BLOCK1_3d, 1};
+act9 aweb1_3d = {INIT_OBJSTATE, 0, PENNY_3d, 1};
+
+act10 acamp1a_3d = {INIT_PATH, 0, NAT2_3d, AUTO, 0, 0};
+act10 acamp1b_3d = {INIT_PATH, 0, NATG_3d, AUTO, 0, 0};
+act10 acamp9a_3d = {INIT_PATH, 60, NATG_3d, CHASE, DX / 2, DY / 2};
+act10 acamp9b_3d = {INIT_PATH, 55, NAT2_3d, WANDER, DX, 2};
+act10 achase1_3d = {INIT_PATH, 0, NATG_3d, AUTO, 0, 0};
+act10 achase2_3d = {INIT_PATH, 8, NATG_3d, CHASE, DX / 2, DY / 2};
+act10 adoc2_3d = {INIT_PATH, 0, DOCTOR_3d, CHASE, DX, DY};
+act10 aenter3_3d = {INIT_PATH, 0, MOUSE_3d, AUTO, 0, 0};
+act10 aex2_3d = {INIT_PATH, 0, GHOST_3d, AUTO, 0, 0};
+act10 agot6_3d = {INIT_PATH, 40, HERO, USER, 0, 0};
+act10 ahole1_3d = {INIT_PATH, 0, MOUSE_3d, AUTO, 0, 0};
+act10 ahole6_3d = {INIT_PATH, 30, MOUSE_3d, WANDER2, DX, 0};
+act10 aold6h_3d = {INIT_PATH, 22, HERO, USER, 0, 0};
+act10 areturn1_3d = {INIT_PATH, 0, NATG_3d, AUTO, 0, 0};
+act10 ascare12_3d = {INIT_PATH, 34, MOUSE_3d, WANDER2, DX * 4, DY};
+act10 ascare7_3d = {INIT_PATH, 0, MOUSE_3d, AUTO, 0, 0};
+act10 aswing5_3d = {INIT_PATH, 20, HERO, USER, 0, 0};
+act10 adisable_3d = {INIT_PATH, 0, HERO, AUTO, 0, 0};
+act10 aenable_3d = {INIT_PATH, 0, HERO, USER, 0, 0};
+act10 ahoriz6_3d = {INIT_PATH, 1, HERO, USER, 0, 0};
+act10 aquiet_3d = {INIT_PATH, 0, HERO, QUIET, 0, 0};
+
+act11 aactiontest1_3d = {COND_R, 0, E_EYES_3d, 1, 0, kALoktoleave1_3d};
+act11 aactiontest2_3d = {COND_R, 0, E_EYES_3d, 1, 0, kALoktoleave2_3d};
+act11 ablktest_3d = {COND_R, 0, BLOCK1_3d, 0, kALblk1_3d, 0};
+act11 abrgmsgtest_3d = {COND_R, 0, VINE_3d, 0, kALbrg_clftop_msg_3d, kALbrg_clftop1_3d};
+act11 abrgtest_3d = {COND_R, 0, VINE_3d, 0, kALbrg_ok_3d, kALbrg_down_3d};
+act11 acagetest_3d = {COND_R, 0, MOUSE_3d, 2, 0, kALpostest_3d};
+act11 acagetest1_3d = {COND_R, 0, MOUSE_3d, 2, kALcagetest2_3d, kALok_3d};
+act11 acamptest_3d = {COND_R, 0, NAT1_3d, 0, kALcampers_3d, kALchase_3d};
+act11 acavetest_3d = {COND_R, 0, GHOST_3d, 0, kALspirit_3d, kALcave_man_3d};
+act11 acrashtest1_3d = {COND_R, 0, PENNY_3d, 0, kALcrashed_3d, kALcrashtest2_3d};
+act11 acrashtest2_3d = {COND_R, 0, PENNY_3d, 1, kALcryhelp_3d, 0};
+act11 adartedtest_3d = {COND_R, 0, BLOWPIPE_3d, 0, kALdodart_3d, kALdarted_3d};
+act11 adoctest_3d = {COND_R, 0, DOCTOR_3d, 0, kALdoc_3d, 0};
+act11 adrinktest_3d = {COND_R, 0, FLASK_3d, 0, kALdrinkno_3d, kALdrinkyes_3d};
+act11 aeletest1_3d = {COND_R, 0, ELEPHANT_3d, 1, kALele_sleep_3d, kALeletest2_3d};
+act11 aeletest2_3d = {COND_R, 0, ELEPHANT_3d, 0, kALeleblink_3d, 0};
+act11 aemptytest1_3d = {COND_R, 0, FLASK_3d, 2, kALemptymagic_3d, kALemptytest2_3d};
+act11 aemptytest2_3d = {COND_R, 0, FLASK_3d, 1, kALemptyord_3d, kALdrinkno_3d};
+act11 aentertest1_3d = {COND_R, 0, CHEESE_3d, 1, kALentertest2_3d, 0};
+act11 aentertest2_3d = {COND_R, 0, MOUSE_3d, 0, kALentertest3_3d, 0};
+act11 aexotest1_3d = {COND_R, 0, GHOST_3d, 0, kALexotest2_3d, kALexordone_3d};
+act11 afindbtest_3d = {COND_R, 0, BOOK_3d, 0, kALfindit_3d, 0};
+act11 aflasktest2_3d = {COND_R, 0, FLASK_3d, 2, kALremedy_3d, kALflasktest3_3d};
+act11 aflasktest3_3d = {COND_R, 0, FLASK_3d, 1, kALnoremedy_3d, kALrefuseflask_3d};
+act11 agettest2_3d = {COND_R, 0, DOCTOR_3d, 0, kALgot_3d, 0};
+act11 agivetest_3d = {COND_R, 0, NAT1_3d, 10, kALrefuse_3d, kALgive_3d};
+act11 anat0_3d = {COND_R, 0, NAT1_3d, 0, kALcom0_3d, kALnat1_3d};
+act11 anat1_3d = {COND_R, 0, NAT1_3d, 1, kALcom1_3d, kALnat2_3d};
+act11 anat2_3d = {COND_R, 0, NAT1_3d, 2, kALcom2_3d, kALnat3_3d};
+act11 anat3_3d = {COND_R, 0, NAT1_3d, 3, kALcom3_3d, kALnat4_3d};
+act11 anat4_3d = {COND_R, 0, NAT1_3d, 4, kALcom4_3d, kALnat5_3d};
+act11 anat5_3d = {COND_R, 0, NAT1_3d, 5, kALcom5_3d, kALnat6_3d};
+act11 anat6_3d = {COND_R, 0, NAT1_3d, 6, kALcom6_3d, kALnat7_3d};
+act11 anat7_3d = {COND_R, 0, NAT1_3d, 7, kALcom7_3d, kALnat8_3d};
+act11 anat8_3d = {COND_R, 0, NAT1_3d, 8, kALcom8_3d, 0};
+act11 aold5_3d = {COND_R, 0, FLASK_3d, 2, kALold6_3d, kALwrong_3d};
+act11 aoldmantest_3d = {COND_R, 0, MOUTH_3d, 0, kALoldfirst_3d, kALoldsubseq_3d};
+act11 aopentest_3d = {COND_R, 0, DOCTOR_3d, 1, kALprod_3d, kALopencdoor_3d};
+act11 apausetest_3d = {COND_R, 0, NAT2_3d, 1, 0, kALcomment_3d};
+act11 apostest_3d = {COND_R, 0, MOUSE_3d, 0, kALmousel_3d, kALmouser_3d};
+act11 aspirittest_3d = {COND_R, 0, GHOST_3d, 0, kALwarn_3d, 0};
+act11 asticktest1_3d = {COND_R, 0, DOCTOR_3d, 2, kALstuckpin_3d, kALsticktest2_3d};
+act11 asticktest2_3d = {COND_R, 0, CLAY_3d, 1, kALstickpin_3d, kALnostickpin_3d};
+act11 ataketest1_3d = {COND_R, 0, MOUSE_3d, 2, kALtakeit_3d, kALcanttake_3d};
+act11 ataketest2_3d = {COND_R, 0, MOUSE_3d, 3, kALmousegone_3d, kALtaketest1_3d};
+act11 atalktest1_3d = {COND_R, 0, NAT1_3d, 9, kALnat9_3d, kALnative_3d};
+act11 atiptest_3d = {COND_R, 60 * NORMAL_TPS, BLOCK1_3d, 0, kALbtipprompt_3d, 0};
+act11 auntietest_3d = {COND_R, 0, BLOCK1_3d, 0, kALnottied_3d, kALuntie_3d};
+act11 avinetest_3d = {COND_R, 0, BLOCK1_3d, 0, kALtievine_3d, kALtied_3d};
+act11 awebtest1_3d = {COND_R, 0, PENNY_3d, 0, kALspider_3d, kALwebtest2_3d};
+act11 awebtest2_3d = {COND_R, 0, PENNY_3d, 1, kALmission_3d, kALreturn_3d};
+act11 ahoriz5_3d = {COND_R, 1, HERO, 0, kALup_3d, kALdn_3d};
+
+act12 ablk1_3d = {TEXT, 0, kSTBlk1_3d};
+act12 abook1_3d = {TEXT, 0, kSTBook1_3d};
+act12 abtip_3d = {TEXT, 0, kSTBridgetip_3d};
+act12 acanttake_3d = {TEXT, 0, kSTCanttake_3d};
+act12 acheese2_3d = {TEXT, 0, kSTYummy_3d};
+act12 acubestip_3d = {TEXT, 0, kSTCubestip_3d};
+act12 adammedtip_3d = {TEXT, 0, kSTDammedtip_3d};
+act12 adarted_3d = {TEXT, 0, kSTDarted_3d};
+act12 adrinkno_3d = {TEXT, 0, kSTDrinkno_3d};
+act12 adrinkyes_3d = {TEXT, 0, kSTDrinkyes_3d};
+act12 aemptymagic_3d = {TEXT, 0, kSTEmptymagic_3d};
+act12 aemptyord_3d = {TEXT, 0, kSTEmptyord_3d};
+act12 aex5_3d = {TEXT, 0, kSTExor1_3d};
+act12 aex6_3d = {TEXT, 0, kSTExor2_3d};
+act12 aexordone_3d = {TEXT, 0, kSTExordone_3d};
+act12 afillmagic2_3d = {TEXT, 0, kSTFillmagic_3d};
+act12 afillord1_3d = {TEXT, 0, kSTFillord_3d};
+act12 afindb4_3d = {TEXT, 2, kSTFoundbook_3d};
+act12 ago1_3d = {TEXT, 0, kSTMousefree_3d};
+act12 alookfall_3d = {TEXT, 0, kSTLookwfall1_3d};
+act12 alooknofall_3d = {TEXT, 0, kSTLookwfall2_3d};
+act12 amagictip_3d = {TEXT, 0, kSTMagictip_3d};
+act12 amakeclay3_3d = {TEXT, 0, kSTMakeeffigy_3d};
+act12 amodeltip_3d = {TEXT, 0, kSTModeltip_3d};
+act12 amousegone_3d = {TEXT, 0, kSTMousegone_3d};
+act12 amousetip_3d = {TEXT, 0, kSTMousetip_3d};
+act12 anoblow_3d = {TEXT, 0, kSTNoblow_3d};
+act12 anoclay_3d = {TEXT, 0, kSTNoclay_3d};
+act12 anofill_3d = {TEXT, 0, kSTNofill_3d};
+act12 anomake_3d = {TEXT, 0, kSTNomake_3d};
+act12 anoremedy1_3d = {TEXT, 0, kSTNoremedy_3d};
+act12 anospell_3d = {TEXT, 0, kSTNospell_3d};
+act12 anostick_3d = {TEXT, 0, kSTNostick_3d};
+act12 anostickpin_3d = {TEXT, 0, kSTNostickpin_3d};
+act12 anotakecb_3d = {TEXT, 0, kSTOldmannotake_3d};
+act12 anotip_3d = {TEXT, 0, kSTNotip_3d};
+act12 anottied_3d = {TEXT, 0, kSTNottied_3d};
+act12 aold7_3d = {TEXT, 0, kSTAllwrong_3d};
+act12 aoldmantip_3d = {TEXT, 0, kSTOldmantip_3d};
+act12 aplanetip_3d = {TEXT, 0, kSTPlanetip_3d};
+act12 aputitdown_3d = {TEXT, 0, kSTPutitdown_3d};
+act12 arefuse_3d = {TEXT, 0, kSTRefuse_3d};
+act12 arefuseflask_3d = {TEXT, 0, kSTRefuseflask_3d};
+act12 aremedytip_3d = {TEXT, 0, kSTRemedytip_3d};
+act12 arub_3d = {TEXT, 0, kSTRubcrystal_3d};
+act12 astick2_3d = {TEXT, 0, kSTStickpin_3d};
+act12 asticktip_3d = {TEXT, 0, kSTSticktip_3d};
+act12 astuckpin_3d = {TEXT, 0, kSTStuckpin_3d};
+act12 aswingtip_3d = {TEXT, 0, kSTSwingtip_3d};
+act12 atakecb2_3d = {TEXT, 0, kSTOldmantakeball_3d};
+act12 atalkweb_3d = {TEXT, 0, kSTTalkweb_3d};
+act12 athing_3d = {TEXT, 0, kSTVillagething_3d};
+act12 atied_3d = {TEXT, 0, kSTTiedvine_3d};
+act12 auntie_3d = {TEXT, 0, kSTUntievine_3d};
+act12 avine5_3d = {TEXT, 0, kSTBlk2_3d};
+act12 awarn_3d = {TEXT, 0, kSTCavewarn_3d};
+act12 awaterfalling_3d = {TEXT, 0, kSTWaterfalling_3d};
+act12 awrong1_3d = {TEXT, 0, kSTWrong_3d};
+act12 aclick_3d = {TEXT, 0, kSTClick_3d};
+act12 aempty_3d = {TEXT, 0, kSTEmpty1_3d};
+act12 agotit_3d = {TEXT, 0, kSTGotit_3d};
+act12 anocarry_3d = {TEXT, 0, kSTNocarry_3d};
+act12 anopurps_3d = {TEXT, 0, kSTNopurps_3d};
+act12 anothanks_3d = {TEXT, 0, kSTNothanks_3d};
+act12 aok_3d = {TEXT, 0, kSTOkgen_3d};
+act12 astalk_3d = {TEXT, 0, kSTStalk_3d};
+
+act13 acrash1_3d = {SWAP_IMAGES, 0, HERO, HERO_OLD_3d};
+act13 aswing2_3d = {SWAP_IMAGES, 2, HERO, SWINGER_3d};
+act13 aswing7_3d = {SWAP_IMAGES, 15, HERO, SWINGER_3d};
+act13 aweb24_3d = {SWAP_IMAGES, 0, HERO, HERO_OLD_3d};
+act13 aweb25_3d = {SWAP_IMAGES, 0, HERO, WHERO_3d};
+act13 ahoriz2_3d = {SWAP_IMAGES, 1, HERO, WHERO_3d};
+act13 aweehero_3d = {SWAP_IMAGES, 0, HERO, WHERO_3d};
+
+act14 acagetest3_3d = {COND_SCR, 0, CAGE_3d, PATH_3d, kALcagetest4_3d, kALmousego_3d};
+act14 adroptest1_3d = {COND_SCR, 0, HERO, HUT_IN_3d, kALdropincage_3d, kALnocarry_3d};
+act14 aexotest2_3d = {COND_SCR, 0, HERO, CAVE_3d, kALexor_3d, kALnospell_3d};
+act14 afilltest1_3d = {COND_SCR, 0, HERO, GARDEN_3d, kALfillmagic_3d, kALfilltest2_3d};
+act14 afilltest2_3d = {COND_SCR, 0, HERO, STREAM_3d, kALfillord_3d, kALfilltest3_3d};
+act14 afilltest3_3d = {COND_SCR, 0, HERO, WFALL_3d, kALfillord_3d, kALnofill_3d};
+act14 aflasktest1_3d = {COND_SCR, 0, HERO, WEB_3d, kALflasktest2_3d, kALnothanks_3d};
+act14 agettest1_3d = {COND_SCR, 0, DOCTOR_3d, HUT_IN_3d, kALgettest2_3d, 0};
+act14 agivetest1_3d = {COND_SCR, 0, HERO, CAMP_3d, kALgivetest_3d, kALnothanks2_3d};
+act14 amaketest_3d = {COND_SCR, 0, HERO, HUT_IN_3d, kALmakeit_3d, kALnomake_3d};
+act14 apath2test_3d = {COND_SCR, 0, HERO, PATH_3d, kALdartedtest_3d, kALnoblow_3d};
+act14 atalktest2_3d = {COND_SCR, 0, HERO, CAMP_3d, kALtalktest1_3d, kALstalk_3d};
+act14 atalktest3_3d = {COND_SCR, 0, HERO, WEB_3d, kALtalkweb_3d, kALtalktest2_3d};
+
+act15 agot2_3d = {AUTOPILOT, 3, HERO, CDOOR_3d, DX, DY};
+act15 agot2a_3d = {AUTOPILOT, 22, HERO, CDOOR_3d, DX, DY};
+act15 agot3_3d = {AUTOPILOT, 0, DOCTOR_3d, CDOOR_3d, DX, DY};
+act15 agot3a_3d = {AUTOPILOT, 20, DOCTOR_3d, CDOOR_3d, DX, DY};
+
+act16 acamp5a_3d = {INIT_OBJ_SEQ, 1, NAT2_3d, RIGHT};
+act16 acamp5b_3d = {INIT_OBJ_SEQ, 1, NATG_3d, RIGHT};
+act16 acamp6b_3d = {INIT_OBJ_SEQ, 36, NAT2_3d, DOWN};
+act16 acamp7b_3d = {INIT_OBJ_SEQ, 40, NATG_3d, 2};
+act16 acrash10_3d = {INIT_OBJ_SEQ, 8, HERO, LEFT};
+act16 acrash15_3d = {INIT_OBJ_SEQ, 21, PENNY_3d, DOWN};
+act16 acrash16_3d = {INIT_OBJ_SEQ, 22, PENNY_3d, LEFT};
+act16 acrash18_3d = {INIT_OBJ_SEQ, 40, HERO, _UP};
+act16 acrash2_3d = {INIT_OBJ_SEQ, 1, PENNY_3d, DOWN};
+act16 acrash3_3d = {INIT_OBJ_SEQ, 1, HERO, DOWN};
+act16 acrash8_3d = {INIT_OBJ_SEQ, 4, PENNY_3d, RIGHT};
+act16 adart6_3d = {INIT_OBJ_SEQ, DARTTIME - 1, E_EYES_3d, 1};
+act16 adoc1_3d = {INIT_OBJ_SEQ, 0, HERO, _UP};
+act16 aeleblink1_3d = {INIT_OBJ_SEQ, 41, E_EYES_3d, 1};
+act16 aeleblink2_3d = {INIT_OBJ_SEQ, 42, E_EYES_3d, 0};
+act16 aeleblink3_3d = {INIT_OBJ_SEQ, 43, E_EYES_3d, 1};
+act16 aeleblink4_3d = {INIT_OBJ_SEQ, 44, E_EYES_3d, 0};
+act16 aenter7_3d = {INIT_OBJ_SEQ, 4, CAGE_3d, 1};
+act16 agot11_3d = {INIT_OBJ_SEQ, 58, DOCTOR_3d, LEFT};
+act16 ahelp5_3d = {INIT_OBJ_SEQ, 8, HERO, LEFT};
+act16 ahole2a_3d = {INIT_OBJ_SEQ, 0, MOUSE_3d, 0};
+act16 ahole2b_3d = {INIT_OBJ_SEQ, 0, MOUSE_3d, 1};
+act16 aleft1_3d = {INIT_OBJ_SEQ, 0, HERO, LEFT};
+act16 amission13_3d = {INIT_OBJ_SEQ, 10, NATG_3d, DOWN};
+act16 amission19_3d = {INIT_OBJ_SEQ, 48, NATG_3d, RIGHT};
+act16 aprod2_3d = {INIT_OBJ_SEQ, 1, DOCTOR_3d, RIGHT};
+act16 aprod7_3d = {INIT_OBJ_SEQ, 25, DOCTOR_3d, LEFT};
+act16 aright1_3d = {INIT_OBJ_SEQ, 0, HERO, RIGHT};
+act16 ascare10_3d = {INIT_OBJ_SEQ, 18, MOUSE_3d, 0};
+act16 ascare2_3d = {INIT_OBJ_SEQ, 0, CAGE_3d, 0};
+act16 ascare3_3d = {INIT_OBJ_SEQ, 0, ELEPHANT_3d, 1};
+act16 ascare8_3d = {INIT_OBJ_SEQ, 0, MOUSE_3d, 1};
+act16 aweb16_3d = {INIT_OBJ_SEQ, 105, PENNY_3d, RIGHT};
+act16 aweb27_3d = {INIT_OBJ_SEQ, 0, HERO, DOWN};
+act16 aweb8_3d = {INIT_OBJ_SEQ, 41, PENNY_3d, DOWN};
+
+act17 adart3_3d = {SET_STATE_BITS, DARTTIME, ELEPHANT_3d, 1};
+act17 ascare1_3d = {SET_STATE_BITS, 0, ELEPHANT_3d, 2};
+
+act19 abittest_3d = {TEST_STATE_BITS, 0, ELEPHANT_3d, 1, kALsleepy_3d, kALscared_3d};
+act19 acagetest4_3d = {TEST_STATE_BITS, 0, ELEPHANT_3d, 1, kALasleep_3d, kALscare_3d};
+act19 adarttest1_3d = {TEST_STATE_BITS, DARTTIME, ELEPHANT_3d, 3, kALdammed_3d, kALbittest_3d};
+act19 alookwfalltest_3d = {TEST_STATE_BITS, 0, ELEPHANT_3d, 3, kALlooknofall_3d, kALlookfall_3d};
+act19 astreamtest_3d = {TEST_STATE_BITS, 0, ELEPHANT_3d, 3, kALstream2_3d, kALstream1_3d};
+act19 awfalltest_3d = {TEST_STATE_BITS, 0, ELEPHANT_3d, 3, kALwaternofall_3d, kALwaterfall_3d};
+
+act20 adart4_3d = {DEL_EVENTS, DARTTIME, ASCHEDULE};
+act20 adart5_3d = {DEL_EVENTS, DARTTIME, INIT_OBJ_SEQ};
+act20 aold6e_3d = {DEL_EVENTS, 0, ASCHEDULE};
+act20 aridtest_3d = {DEL_EVENTS, 0, TEST_STATE_BITS};
+
+act21 adead5_3d = {GAMEOVER, 0};
+
+act22 ahoriz3_3d = {INIT_HH_COORD, 1, HERO};
+
+act23 asunset3_3d = {EXIT, 50};
+
+act24 adammed1_3d = {BONUS, 0, 11};
+act24 adart2_3d = {BONUS, DARTTIME, 10};
+act24 adropcheese1_3d = {BONUS, 0, 6};
+act24 aenter0_3d = {BONUS, 0, 7};
+act24 aex1_3d = {BONUS, 0, 15};
+act24 afillmagic1_3d = {BONUS, 0, 8};
+act24 aflask1_3d = {BONUS, 0, 1};
+act24 agive2_3d = {BONUS, 0, 14};
+act24 amakeclay1_3d = {BONUS, 0, 4};
+act24 aold6b_3d = {BONUS, 0, 12};
+act24 ascarebonus_3d = {BONUS, 0, 9};
+act24 astick1_3d = {BONUS, 0, 5};
+act24 aswing0_3d = {BONUS, 0, 3};
+act24 atakecb1_3d = {BONUS, 0, 16};
+act24 atakencheese_3d = {BONUS, 0, 13};
+act24 avine1_3d = {BONUS, 0, 2};
+
+act25 aentertest3_3d = {COND_BOX, 1, MOUSE_3d, 156, 133, 163, 148, kALtrapped_3d, 0};
+act25 amousel_3d = {COND_BOX, 0, HERO, 0, 0, 254, 199, kALholel_3d, 0};
+act25 amouser_3d = {COND_BOX, 0, HERO, 255, 0, 319, 199, kALholer_3d, 0};
+act25 aswing4_3d = {COND_BOX, 1, HERO, 0, 0, 160, 200, kALright_3d, kALleft_3d};
+
+act27 aaddcheese_3d = {ADD_SCORE, 0, CHEESE_3d};
+act27 adammed2_3d = {ADD_SCORE, 0, CAGE_3d};
+act27 agive1_3d = {ADD_SCORE, 0, BLOWPIPE_3d};
+act27 atakecage3_3d = {ADD_SCORE, 0, CAGE_3d};
+
+act28 asubcheese_3d = {SUB_SCORE, 0, CHEESE_3d};
+
+act29 acagetest2_3d = {COND_CARRY, 0, CAGE_3d, kALputitdown_3d, kALcagetest3_3d};
+act29 acbtest_3d = {COND_CARRY, 0, CRYSTAL_3d, kALtakecb_3d, kALnotakecb_3d};
+act29 adroptest3_3d = {COND_CARRY, 0, CHEESE_3d, kALdroptest2_3d, kALnocarry_3d};
+act29 aold4_3d = {COND_CARRY, 0, FLASK_3d, kALold5_3d, kALwrong_3d};
+act29 areadtest1_3d = {COND_CARRY, 0, BELL_3d, kALreadtest2_3d, kALreadord_3d};
+act29 areadtest2_3d = {COND_CARRY, 0, CANDLE_3d, kALexorcise_3d, kALreadord_3d};
+act29 asticktest4_3d = {COND_CARRY, 0, CLAY_3d, kALsticktest1_3d, kALnoclay_3d};
+act29 atakechstest_3d = {COND_CARRY, 0, CHEESE_3d, 0, kALtakechs_3d};
+act29 ataketest3_3d = {COND_CARRY, 0, CAGE_3d, 0, kALtaketest2_3d};
+
+act33 acamp0c_3d = {INIT_SCREEN, 0, NATG_3d, CAMP_3d};
+act33 adoc3_3d = {INIT_SCREEN, 0, DOCTOR_3d, HUT_IN_3d};
+act33 amission2_3d = {INIT_SCREEN, 0, NATG_3d, WEB_3d};
+act33 areturn5_3d = {INIT_SCREEN, 0, NATG_3d, WEB_3d};
+act33 aweb3_3d = {INIT_SCREEN, 0, PENNY_3d, WEB_3d};
+
+act35 amap0_3d = {REMAPPAL, 0, _TRED, _LIGHTYELLOW};
+act35 amap1_3d = {REMAPPAL, 0, _TLIGHTMAGENTA, _BLACK};
+act35 amap2_3d = {REMAPPAL, 0, _TRED, 0x002a2aL}; // Light khaki
+act35 amap3_3d = {REMAPPAL, 0, _TRED, 0x00153fL}; // Orange
+act35 amap4a_3d = {REMAPPAL, 0, _TGRAY, _BLACK};
+act35 amap4b_3d = {REMAPPAL, 1, _TGRAY, _GRAY};
+act35 amap4c_3d = {REMAPPAL, 2, _TGRAY, _BLACK};
+act35 amap4d_3d = {REMAPPAL, 3, _TGRAY, _GRAY};
+
+act36 adroptest2_3d = {COND_NOUN, 0, kNCage_3d, kALcagetest_3d, kALdropord_3d};
+act36 asticktest3_3d = {COND_NOUN, 0, kNClay_3d, kALsticktest4_3d, kALnostick_3d};
+
+act37 aex8_3d = {SCREEN_STATE, 0, CAVE_3d, 1};
+act37 ascare17_3d = {SCREEN_STATE, 64, PATH_3d, 1};
+act37 astick7_3d = {SCREEN_STATE, 17, HUT_IN_3d, 1};
+
+act38 amission14_3d = {INIT_LIPS, 20, LIPS_3d, NATG_3d, 4, LIPDY + 1};
+act38 aweb18_3d = {INIT_LIPS, 108, LIPS_3d, PENNY_3d, LIPDX, LIPDY};
+act38 alips_3d = {INIT_LIPS, 0, LIPS_3d, PENNY_3d, LIPDX, LIPDY};
+
+act39 amission23_3d = {INIT_STORY_MODE, 50, false};
+act39 astory_mode_3d = {INIT_STORY_MODE, 0, true};
+
+// all the act40 were previously defined as act12 with a type set to WARN
+act40 aasleep_3d = {WARN, 30, kSTAsleep_3d};
+act40 abrg_msg1_3d = {WARN, 0, kSTBridgedown_3d};
+act40 acom0a_3d = {WARN, 0, kSTCom0_3d};
+act40 acom1a_3d = {WARN, 0, kSTCom1_3d};
+act40 acom2a_3d = {WARN, 0, kSTCom2_3d};
+act40 acom3a_3d = {WARN, 0, kSTCom3_3d};
+act40 acom4a_3d = {WARN, 0, kSTCom4_3d};
+act40 acom5a_3d = {WARN, 0, kSTCom5_3d};
+act40 acom6a_3d = {WARN, 0, kSTCom6_3d};
+act40 acom7a_3d = {WARN, 0, kSTCom7_3d};
+act40 acom8a_3d = {WARN, 0, kSTCom8_3d};
+act40 acom9_3d = {WARN, 0, kSTCom9_3d};
+act40 acrash11_3d = {WARN, 20, kSTPenny1_3d};
+act40 acrash12_3d = {WARN, 20, kSTPenny2_3d};
+act40 acrash13_3d = {WARN, 34, kSTPenny3_3d};
+act40 adammed3_3d = {WARN, 0, kSTDammed_3d};
+act40 aelewaking_3d = {WARN, 0, kSTElewaking_3d};
+act40 aenter2_3d = {WARN, 0, kSTMouse1_3d};
+act40 aflask2_3d = {WARN, 0, kSTEnd1_3d};
+act40 aflask3_3d = {WARN, 0, kSTEnd2_3d};
+act40 aflask4_3d = {WARN, 0, kSTEnd3_3d};
+act40 agive4_3d = {WARN, 0, kSTGiveb1_3d};
+act40 agive5_3d = {WARN, 0, kSTGiveb2_3d};
+act40 agot1c_3d = {WARN, 1, kSTGot1_3d};
+act40 agot9_3d = {WARN, 54, kSTGot2_3d};
+act40 ahelp1_3d = {WARN, 2, kSTHelp1_3d};
+act40 amission10_3d = {WARN, 5, kSTMission1_3d};
+act40 amission16_3d = {WARN, 30, kSTMission2_3d};
+act40 amission20_3d = {WARN, 50, kSTMission3_3d};
+act40 amission21_3d = {WARN, 50, kSTMission4_3d};
+act40 amission22_3d = {WARN, 50, kSTMission5_3d};
+act40 amission24_3d = {WARN, 60, kSTMission6_3d};
+act40 aold0a_3d = {WARN, 40, kSTOldman0a_3d};
+act40 aold0b_3d = {WARN, 40, kSTOldman0b_3d};
+act40 aold6c_3d = {WARN, 0, kSTOldman4_3d};
+act40 aold6d_3d = {WARN, 0, kSTOldman5_3d};
+act40 aprod4_3d = {WARN, 8, kSTProd1_3d};
+act40 aprod5_3d = {WARN, 20, kSTProd2_3d};
+act40 ascare13_3d = {WARN, 12, kSTScare1_3d};
+act40 ascared_3d = {WARN, 0, kSTScared_3d};
+act40 asleepy_3d = {WARN, 0, kSTSleepy_3d};
+act40 asunset1_3d = {WARN, 20, kSTAdios1_3d};
+act40 asunset2_3d = {WARN, 40, kSTAdios2_3d};
+act40 aweb10_3d = {WARN, 50, kSTPenny5_3d};
+act40 aweb15_3d = {WARN, 105, kSTSpider1_3d};
+act40 aweb17_3d = {WARN, 108, kSTSpider2_3d};
+act40 aweb20_3d = {WARN, 110, kSTSpider3_3d};
+act40 aweb6_3d = {WARN, 25, kSTPenny4_3d};
+
+act41 ac1_3d = {COND_BONUS, 0, 3, kALac2_3d, kALswingtip_3d};
+act41 ac2_3d = {COND_BONUS, 0, 13, kALac3_3d, kALplanetip_3d};
+act41 ac3_3d = {COND_BONUS, 0, 4, kALac4_3d, kALmodeltip_3d};
+act41 ac4_3d = {COND_BONUS, 0, 5, kALac5_3d, kALsticktip_3d};
+act41 ac5_3d = {COND_BONUS, 0, 7, kALac6_3d, kALmousetip_3d};
+act41 ac6_3d = {COND_BONUS, 0, 14, kALac7_3d, kALcubestip_3d};
+act41 ac7_3d = {COND_BONUS, 0, 11, kALac8_3d, kALdammedtip_3d};
+act41 ac8_3d = {COND_BONUS, 0, 8, kALac9_3d, kALmagictip_3d};
+act41 ac9_3d = {COND_BONUS, 0, 12, kALremedytip_3d, kALoldmantip_3d};
+
+//Strangerke - act26 are stored in new act49, as songs were not handled the same way in DOS version (in harcoded strings)
+act49 aballsong_3d = {OLD_SONG, 0, kDTsong10_3d};
+act49 afillsong_3d = {OLD_SONG, 0, kDTsong3_3d};
+act49 anelesong_3d = {OLD_SONG, 5, kDTsong2_3d};
+act49 aprodsong_3d = {OLD_SONG, 20, kDTsong1_3d};
+act49 aspidersong_3d = {OLD_SONG, 105, kDTsong12_3d};
+act49 asticksong_3d = {OLD_SONG, 0, kDTsong1_3d};
+act49 asunsetsong_3d = {OLD_SONG, 0, kDTsong11_3d};
+act49 aswingsong_3d = {OLD_SONG, 0, kDTsong9_3d};
+act49 atiesong_3d = {OLD_SONG, 0, kDTsong3_3d};
+act49 asong0_3d = {OLD_SONG, 0, kDTsong0_3d};
+act49 asong3_3d = {OLD_SONG, 0, kDTsong3_3d};
+act49 asong6_3d = {OLD_SONG, 4, kDTsong6_3d};
+
+actListPtr ALac2_3d[] = {&ac2_3d, 0};
+actListPtr ALac3_3d[] = {&ac3_3d, 0};
+actListPtr ALac4_3d[] = {&ac4_3d, 0};
+actListPtr ALac5_3d[] = {&ac5_3d, 0};
+actListPtr ALac6_3d[] = {&ac6_3d, 0};
+actListPtr ALac7_3d[] = {&ac7_3d, 0};
+actListPtr ALac8_3d[] = {&ac8_3d, 0};
+actListPtr ALac9_3d[] = {&ac9_3d, 0};
+actListPtr ALasleep_3d[] = {&astartaction_3d, &aasleep_3d, &amousefree_3d, &ascare2_3d, &ascare5_3d, &ascare6_3d, &ascare7_3d, &ascare8_3d, &ascare9_3d, &ascare10_3d, &ascare11_3d, &ascare12_3d, &ascare17_3d, &aendaction_3d, 0};
+actListPtr ALbittest_3d[] = {&abittest_3d, 0};
+actListPtr ALblk1_3d[] = {&ablk1_3d, 0};
+actListPtr ALblk_3d[] = {&ablktest_3d, 0};
+actListPtr ALbrg_clftop1_3d[] = {&axy_brg_clftop_3d, &ascr_brg_clftop_3d, 0};
+actListPtr ALbrg_clftop_3d[] = {&abrgmsgtest_3d, 0};
+actListPtr ALbrg_clftop_msg_3d[] = {&abrg_msg1_3d, &abrg_msg2_3d, &axy_brg_clftop_3d, &ascr_brg_clftop_3d, 0};
+actListPtr ALbrg_down_3d[] = {&ascr_path_brg2_3d, 0};
+actListPtr ALbrg_ok_3d[] = {&ascr_path_brg1_3d, 0};
+actListPtr ALbrg_path_3d[] = {&axy_brg_path_3d, &ascr_brg_path_3d, 0};
+actListPtr ALbridgetip_3d[] = {&atiptest_3d, 0};
+actListPtr ALbtip_3d[] = {&abtip_3d, 0};
+actListPtr ALbtipprompt_3d[] = {&abtipprompt_3d, 0};
+actListPtr ALcagetest2_3d[] = {&acagetest2_3d, 0};
+actListPtr ALcagetest3_3d[] = {&acagetest3_3d, 0};
+actListPtr ALcagetest4_3d[] = {&acagetest4_3d, 0};
+actListPtr ALcagetest_3d[] = {&adroptest1_3d, 0};
+actListPtr ALcamp_3d[] = {&acamp0a_3d, &acamp0b_3d, &acamp0c_3d, &acamptest_3d, 0};
+actListPtr ALcamp_hut_3d[] = {&axy_camp_hut_3d, &ascr_camp_hut_3d, 0};
+actListPtr ALcamp_village_c_3d[] = {&aweehero_3d, &axy_camp_village_c_3d, &ascr_camp_village_c_3d, 0}; // exit center
+actListPtr ALcamp_village_l_3d[] = {&aweehero_3d, &axy_camp_village_l_3d, &ascr_camp_village_l_3d, 0}; // exit left
+actListPtr ALcampers_3d[] = {&acamp1a_3d, &acamp1b_3d, &acamp2a_3d, &acamp2b_3d, &acamp3a_3d, &acamp3b_3d, &acamp4a_3d, &acamp4b_3d, &acamp5a_3d, &acamp5b_3d, &acamp6a_3d, &acamp6b_3d, &acamp7a_3d, &acamp7b_3d, &acamp8a_3d, &acamp8b_3d, &acamp9a_3d, &acamp9b_3d, 0};
+actListPtr ALcanttake_3d[] = {&acanttake_3d, 0};
+actListPtr ALcave_man_3d[] = {&adisappear_3d, &adisable_3d, &ascr_cave_man_3d, 0};
+actListPtr ALcave_oldman_3d[] = {&acavetest_3d, 0};
+actListPtr ALcave_turn_3d[] = {&axy_cave_turn_3d, &ascr_cave_turn_3d, 0};
+actListPtr ALcave_wfall_3d[] = {&axy_cave_wfall_3d, &awfalltest_3d, 0};
+actListPtr ALchase_3d[] = {&achase1_3d, &achase2_3d, 0};
+actListPtr ALclf_clftop_3d[] = {&axy_clf_clftop_3d, &ascr_clf_clftop_3d, 0};
+actListPtr ALclf_wfall_3d[] = {&axy_clf_wfall_3d, &awfalltest_3d, 0};
+actListPtr ALclftop_brg_3d[] = {&axy_clftop_brg_3d, &ascr_clftop_brg_3d, 0};
+actListPtr ALclftop_clf_3d[] = {&axy_clftop_clf_3d, &ascr_clftop_clf_3d, 0};
+actListPtr ALclftop_slope_3d[] = {&axy_clftop_slope_3d, &ascr_clftop_slope_3d, 0};
+actListPtr ALclosedoor_3d[] = {&aclose1_3d, &aclose2_3d, 0};
+actListPtr ALcom0_3d[] = {&acom0a_3d, &acom0b_3d, 0};
+actListPtr ALcom1_3d[] = {&acom1a_3d, &acom1b_3d, 0};
+actListPtr ALcom2_3d[] = {&acom2a_3d, &acom2b_3d, 0};
+actListPtr ALcom3_3d[] = {&acom3a_3d, &acom3b_3d, 0};
+actListPtr ALcom4_3d[] = {&acom4a_3d, &acom4b_3d, 0};
+actListPtr ALcom5_3d[] = {&acom5a_3d, &acom5b_3d, 0};
+actListPtr ALcom6_3d[] = {&acom6a_3d, &acom6b_3d, 0};
+actListPtr ALcom7_3d[] = {&acom7a_3d, &acom7b_3d, 0};
+actListPtr ALcom8_3d[] = {&acom8a_3d, &acom8b_3d, 0};
+actListPtr ALcomment_3d[] = {&anat0_3d, &apause0_3d, &apause1_3d, 0};
+actListPtr ALcrashNoStory_3d[] = {&amap1_3d, &acrashtest1_3d, 0};
+actListPtr ALcrashStory_3d[] = {&acrashtest1_3d, 0};
+actListPtr ALcrash_web_3d[] = {&axy_crash_web_3d, &ascr_crash_web_3d, 0};
+actListPtr ALcrashed_3d[] = {&astory_mode_3d, &acrash1_3d, &acrash2_3d, &acrash3_3d, &acrash4_3d, &acrash5_3d, &acrash6_3d, &acrash7_3d, &acrash8_3d, &acrash9_3d, &acrash10_3d, &acrash11_3d, &acrash12_3d, &acrash13_3d, &acrash14_3d, &acrash15_3d, &acrash16_3d, &acrash17_3d, &acrash18_3d, &acrash19_3d, &acrash20_3d, &acrash21_3d, &acrash22_3d, &acrash23_3d, 0};
+actListPtr ALcrashtest2_3d[] = {&acrashtest2_3d, 0};
+actListPtr ALcryhelp_3d[] = {&ahelp1_3d, &ahelp2_3d, &ahelp3_3d, &ahelp4_3d, &ahelp5_3d, &ahelp6_3d, 0};
+actListPtr ALcrystal_3d[] = {&arub_3d, &ac1_3d, 0};
+actListPtr ALcubestip_3d[] = {&acubestip_3d, 0};
+actListPtr ALdammed_3d[] = {&adammed1_3d, &adammed2_3d, &adammed3_3d, 0};
+actListPtr ALdammedtip_3d[] = {&adammedtip_3d, 0};
+actListPtr ALdart_3d[] = {&apath2test_3d, 0};
+actListPtr ALdarted_3d[] = {&adarted_3d, 0};
+actListPtr ALdartedtest_3d[] = {&adartedtest_3d, 0};
+actListPtr ALdartsched_3d[] = {&adarttest1_3d, 0};
+actListPtr ALdn_3d[] = {&adn1_3d, &adn2_3d, 0};
+actListPtr ALdoc_3d[] = {&aquiet_3d, &astophero_3d, &adoc1_3d, &adoc2_3d, &adoc3_3d, &adoc4_3d, 0};
+actListPtr ALdocgot_3d[] = {&agettest1_3d, 0};
+actListPtr ALdodart_3d[] = {&astartaction_3d, &aok_3d, &adart1_3d, &adart2_3d, &adart3_3d, &adart4_3d, &adart5_3d, &adart6_3d, &aridtest_3d, &adarttest_3d, &aendaction_3d, 0};
+actListPtr ALdrink_3d[] = {&adrinktest_3d, 0};
+actListPtr ALdrinkno_3d[] = {&adrinkno_3d, 0};
+actListPtr ALdrinkyes_3d[] = {&adrinkyes_3d, &adrink_3d, 0};
+actListPtr ALdropcheese_3d[] = {&adroptest3_3d, 0};
+actListPtr ALdropincage_3d[] = {&asubcheese_3d, &aok_3d, &adropord2_3d, &adropord3_3d, &adropcheese1_3d, &adropcheese2_3d, &adropcheese3_3d, 0};
+actListPtr ALdropord_3d[] = {&asubcheese_3d, &aok_3d, &adropord1_3d, &adropord2_3d, &adropord3_3d, 0};
+actListPtr ALdroptest2_3d[] = {&adroptest2_3d, 0};
+actListPtr ALeatcheese_3d[] = {&asubcheese_3d, &acheese1_3d, &acheese2_3d, 0};
+actListPtr ALele_sleep_3d[] = {&aeleblink1_3d, 0};
+actListPtr ALeleblink_3d[] = {&arepblink_3d, &aeleblink1_3d, &aeleblink2_3d, &aeleblink3_3d, &aeleblink4_3d, 0};
+actListPtr ALeletest2_3d[] = {&aeletest2_3d, 0};
+actListPtr ALempty_3d[] = {&aemptytest1_3d, 0};
+actListPtr ALempty2_3d[] = {&aempty_3d, 0};
+actListPtr ALemptymagic_3d[] = {&aemptyflask_3d, &aemptymagic_3d, 0};
+actListPtr ALemptyord_3d[] = {&aemptyflask_3d, &aemptyord_3d, 0};
+actListPtr ALemptytest2_3d[] = {&aemptytest2_3d, 0};
+actListPtr ALentertest2_3d[] = {&aentertest2_3d, 0};
+actListPtr ALentertest3_3d[] = {&aentertest3_3d, 0};
+actListPtr ALexit_3d[] = {&aappear_3d, &aenable_3d, &aexit1_3d, &aexit2_3d, 0};
+actListPtr ALexor_3d[] = {&aex1_3d, &aex2_3d, &aex3_3d, &aex4_3d, &aex5_3d, &aex6_3d, &aex7_3d, &aex8_3d, 0};
+actListPtr ALexorcise_3d[] = {&aexotest1_3d, 0};
+actListPtr ALexordone_3d[] = {&aexordone_3d, 0};
+actListPtr ALexotest2_3d[] = {&aexotest2_3d, 0};
+actListPtr ALfill_3d[] = {&afilltest1_3d, 0};
+actListPtr ALfillmagic_3d[] = {&afillsong_3d, &afillmagic1_3d, &afillmagic2_3d, &afillmagic3_3d, 0};
+actListPtr ALfillord_3d[] = {&afillord1_3d, &afillord2_3d, 0};
+actListPtr ALfilltest2_3d[] = {&afilltest2_3d, 0};
+actListPtr ALfilltest3_3d[] = {&afilltest3_3d, 0};
+actListPtr ALfindbook_3d[] = {&afindbtest_3d, 0};
+actListPtr ALfindcrystal_3d[] = {&aballsong_3d, &afind1_3d, &afind2_3d, 0};
+actListPtr ALfindit_3d[] = {&afindb1_3d, &afindb2_3d, &afindb3_3d, &afindb4_3d, 0};
+actListPtr ALflash_3d[] = {&arepflash_3d, &amap4a_3d, &amap4b_3d, &amap4c_3d, &amap4d_3d, 0};
+actListPtr ALflask_3d[] = {&aflasktest1_3d, 0};
+actListPtr ALflasktest2_3d[] = {&aflasktest2_3d, 0};
+actListPtr ALflasktest3_3d[] = {&aflasktest3_3d, 0};
+actListPtr ALgarden_wbase_3d[] = {&axy_garden_wbase_3d, &ascr_garden_wbase_3d, 0};
+actListPtr ALgettest2_3d[] = {&agettest2_3d, 0};
+actListPtr ALgive_3d[] = {&agive1_3d, &agive2_3d, &agive3_3d, &agive4_3d, &agive5_3d, &agive6_3d, &agive7_3d, 0};
+actListPtr ALgiveb_3d[] = {&agivetest1_3d, 0};
+actListPtr ALgivetest_3d[] = {&agivetest_3d, 0};
+actListPtr ALgot_3d[] = {&agot1_3d, &agot1a_3d, &agot1b_3d, &agot1c_3d, &agot2_3d, &agot3_3d, &agot2a_3d, &agot3a_3d, &agot2b_3d, &agot3b_3d, &agot4_3d, &agot5_3d, &agot5a_3d, &agot6_3d, &agot7_3d, &agot8_3d, &agot9_3d, &agot10_3d, &agot11_3d, &agot12_3d, 0};
+actListPtr ALgotit_3d[] = {&agotit_3d, 0};
+actListPtr ALholel_3d[] = {&ahole1_3d, &ahole2a_3d, &ahole3a_3d, &ahole4a_3d, &ahole5a_3d, &ahole6_3d, 0};
+actListPtr ALholer_3d[] = {&ahole1_3d, &ahole2b_3d, &ahole3b_3d, &ahole4b_3d, &ahole5b_3d, &ahole6_3d, 0};
+actListPtr ALhorizon_3d[] = {&aquiet_3d, &ahoriz1_3d, &ahoriz2_3d, &ahoriz3_3d, &ahoriz4_3d, &ahoriz5_3d, &ahoriz6_3d, 0};
+actListPtr ALhut_camp_3d[] = {&axy_hut_camp_3d, &ascr_hut_camp_3d, 0};
+actListPtr ALhut_enter_3d[] = {&axy_hut_in_3d, &ascr_hut_in_3d, 0};
+actListPtr ALhut_in_3d[] = {&adoctest_3d, 0};
+actListPtr ALhut_out_3d[] = {&axy_hut_out_3d, &ascr_hut_out_3d, 0};
+actListPtr ALhut_village_c_3d[] = {&aweehero_3d, &axy_hut_village_c_3d, &ascr_hut_village_c_3d, 0};
+actListPtr ALhut_village_r_3d[] = {&aweehero_3d, &axy_hut_village_r_3d, &ascr_hut_village_r_3d, 0};
+actListPtr ALleft_3d[] = {&aleft1_3d, &aleft2_3d, &aleft3_3d, &aleft4_3d, 0};
+actListPtr ALlookfall_3d[] = {&alookfall_3d, 0};
+actListPtr ALlooknofall_3d[] = {&alooknofall_3d, 0};
+actListPtr ALlookwfall_3d[] = {&alookwfalltest_3d, 0};
+actListPtr ALmagictip_3d[] = {&amagictip_3d, 0};
+actListPtr ALmakeclay_3d[] = {&amaketest_3d, 0};
+actListPtr ALmakeit_3d[] = {&amakeclay1_3d, &amakeclay2_3d, &amakeclay3_3d, 0};
+actListPtr ALmap0_3d[] = {&amap0_3d, 0};
+actListPtr ALmap1_3d[] = {&amap1_3d, 0};
+actListPtr ALmission_3d[] = {&amission1_3d, &amission2_3d, &amission3_3d, &amission4_3d, &amission5_3d, &amission6_3d, &amission7_3d, &amission8_3d, &amission9_3d, &amission10_3d, &amission11_3d, &amission12_3d, &amission13_3d, &amission14_3d, &amission15_3d, &amission16_3d, &amission17_3d, &amission18_3d, &amission19_3d, &amission20_3d, &amission21_3d, &amission22_3d, &amission23_3d, &amission24_3d, 0};
+actListPtr ALmodeltip_3d[] = {&amodeltip_3d, 0};
+actListPtr ALmouse_3d[] = {&acagetest_3d, &aentertest1_3d, &arepeatmouse_3d, 0};
+actListPtr ALmousego_3d[] = {&ago1_3d, &amousefree_3d, &ascare2_3d, 0};
+actListPtr ALmousegone_3d[] = {&amousegone_3d, 0};
+actListPtr ALmousel_3d[] = {&amousel_3d, 0};
+actListPtr ALmouser_3d[] = {&amouser_3d, 0};
+actListPtr ALmousetip_3d[] = {&amousetip_3d, 0};
+actListPtr ALnat1_3d[] = {&anat1_3d, 0};
+actListPtr ALnat2_3d[] = {&anat2_3d, 0};
+actListPtr ALnat3_3d[] = {&anat3_3d, 0};
+actListPtr ALnat4_3d[] = {&anat4_3d, 0};
+actListPtr ALnat5_3d[] = {&anat5_3d, 0};
+actListPtr ALnat6_3d[] = {&anat6_3d, 0};
+actListPtr ALnat7_3d[] = {&anat7_3d, 0};
+actListPtr ALnat8_3d[] = {&anat8_3d, 0};
+actListPtr ALnat9_3d[] = {&acom9_3d, 0};
+actListPtr ALnative_3d[] = {&apausetest_3d, 0};
+actListPtr ALnoblow_3d[] = {&anoblow_3d, 0};
+actListPtr ALnocarry_3d[] = {&anocarry_3d, 0};
+actListPtr ALnoclay_3d[] = {&anoclay_3d, 0};
+actListPtr ALnofill_3d[] = {&anofill_3d, 0};
+actListPtr ALnomake_3d[] = {&anomake_3d, 0};
+actListPtr ALnopurps_3d[] = {&anopurps_3d, 0};
+actListPtr ALnoremedy_3d[] = {&anoremedy1_3d, 0};
+actListPtr ALnospell_3d[] = {&anospell_3d, 0};
+actListPtr ALnostick_3d[] = {&anostick_3d, 0};
+actListPtr ALnostickpin_3d[] = {&anostickpin_3d, 0};
+actListPtr ALnotakecb_3d[] = {&anotakecb_3d, 0};
+actListPtr ALnothanks2_3d[] = {&anothanks_3d, 0};
+actListPtr ALnothanks_3d[] = {&anothanks_3d, 0};
+actListPtr ALnotip_3d[] = {&anotip_3d, 0};
+actListPtr ALnottied_3d[] = {&anottied_3d, 0};
+actListPtr ALok_3d[] = {&aok_3d, 0};
+actListPtr ALoktoleave1_3d[] = {&aweehero_3d, &axy_path_village_3d, &ascr_path_village_3d, 0};
+actListPtr ALoktoleave2_3d[] = {&axy_path_stream_3d, &astreamtest_3d, 0};
+actListPtr ALold2_3d[] = {&aold2_3d, 0};
+actListPtr ALold3_3d[] = {&aold3_3d, 0};
+actListPtr ALold4_3d[] = {&aold4_3d, 0};
+actListPtr ALold5_3d[] = {&aold5_3d, 0};
+actListPtr ALold6_3d[] = {&aold6a_3d, &aold6b_3d, &aold6c_3d, &aold6d_3d, &aold6e_3d, &acbtest_3d, &awink1_3d, &awink2_3d, &awink3_3d, &aold6f_3d, &aold6g_3d, &aold6h_3d, &aold6i_3d, 0};
+actListPtr ALold7_3d[] = {&aappear1_3d, &aenable_3d, &aold7_3d, &amap4b_3d, &areturn_3d, 0};
+actListPtr ALoldfirst_3d[] = {&aoldstate_3d, &aold0a_3d, &aold1a_3d, &aold1b_3d, &aold1c_3d, 0};
+actListPtr ALoldman_3d[] = {&aoldmantest_3d, 0};
+actListPtr ALoldmantip_3d[] = {&aoldmantip_3d, 0};
+actListPtr ALoldsubseq_3d[] = {&aoldstate_3d, &aold0b_3d, &aold1a_3d, &aold1b_3d, &aold1c_3d, 0};
+actListPtr ALopencage_3d[] = {&acagetest1_3d, 0};
+actListPtr ALopencdoor_3d[] = {&aopen1_3d, &aopen2_3d, 0};
+actListPtr ALopendoor_3d[] = {&aopentest_3d, 0};
+actListPtr ALpath_3d[] = {&aeletest1_3d, 0};
+actListPtr ALpath_brg_3d[] = {&axy_path_brg_3d, &abrgtest_3d, 0};
+actListPtr ALpath_stream_3d[] = {&aactiontest2_3d, 0};
+actListPtr ALpath_village_3d[] = {&aactiontest1_3d, 0};
+actListPtr ALpath_web_3d[] = {&axy_path_web_3d, &ascr_path_web_3d, 0};
+actListPtr ALplane_3d[] = {&adisappear_3d, &adisable_3d, &aplane1_3d, &aplane2_3d, 0};
+actListPtr ALplanetip_3d[] = {&aplanetip_3d, 0};
+actListPtr ALpostest_3d[] = {&apostest_3d, 0};
+actListPtr ALprod_3d[] = {&aprod1_3d, &aprod2_3d, &aprod3_3d, &aprod4_3d, &aprodsong_3d, &aprod5_3d, &aprod6_3d, &aprod7_3d, &aprod8_3d, 0};
+actListPtr ALputitdown_3d[] = {&aputitdown_3d, 0};
+actListPtr ALreadbook_3d[] = {&areadtest1_3d, 0};
+actListPtr ALreadord_3d[] = {&abook1_3d, 0};
+actListPtr ALreadtest2_3d[] = {&areadtest2_3d, 0};
+actListPtr ALrefuse_3d[] = {&arefuse_3d, 0};
+actListPtr ALrefuseflask_3d[] = {&arefuseflask_3d, 0};
+actListPtr ALremedy_3d[] = {&aflask1_3d, &aflask2_3d, &aflask3_3d, &aflask4_3d, &aflask5_3d, &astophero_3d, &adisable_3d, &aflask6_3d, 0};
+actListPtr ALremedytip_3d[] = {&aremedytip_3d, 0};
+actListPtr ALreturn_3d[] = {&areturn1_3d, &areturn2_3d, &areturn3_3d, &areturn4_3d, &areturn5_3d, 0};
+actListPtr ALright_3d[] = {&aright1_3d, &aright2_3d, &aright3_3d, &aright4_3d, 0};
+actListPtr ALscare_3d[] = {&astartaction_3d, &ascarebonus_3d, &anelesong_3d, &amousefree_3d, &ascare1_3d, &ascare2_3d, &ascare3_3d, &ascare4_3d, &ascare5_3d, &ascare6_3d, &ascare7_3d, &ascare8_3d, &ascare9_3d, &ascare10_3d, &ascare11_3d, &ascare12_3d, &ascare13_3d, &ascare14_3d, &ascare15_3d, &ascare16_3d, &ascare17_3d, &aridtest_3d, &adarttest_3d, &aendaction_3d, 0};
+actListPtr ALscared_3d[] = {&ascared_3d, 0};
+actListPtr ALsleepy_3d[] = {&asleepy_3d, 0};
+actListPtr ALslope_clftop_3d[] = {&axy_slope_clftop_3d, &ascr_slope_clftop_3d, 0};
+actListPtr ALslope_stream_3d[] = {&axy_slope_stream_3d, &astreamtest_3d, 0};
+actListPtr ALsong3_3d[] = {&asong3_3d, 0};
+actListPtr ALspider_3d[] = {&aplantfix_3d, &aspidersong_3d, &amap1_3d, &aweb1_3d, &aweb2_3d, &aweb3_3d, &aweb4_3d, &aweb5_3d, &aweb6_3d, &aweb7_3d, &aweb8_3d, &aweb9_3d, &aweb10_3d, &aweb11_3d, &aweb12_3d, &aweb13_3d, &aweb14_3d, &aweb15_3d, &aweb16_3d, &aweb17_3d, &aweb18_3d, &aweb19_3d, &aweb20_3d, &aweb21_3d, &aweb22_3d, &aweb23_3d, &aweb24_3d, &aweb25_3d, &aweb26_3d, &aweb27_3d, 0};
+actListPtr ALspirit_3d[] = {&aspirittest_3d, 0};
+actListPtr ALstalk_3d[] = {&astalk_3d, 0};
+actListPtr ALstick_3d[] = {&asticktest3_3d, 0};
+actListPtr ALstickpin_3d[] = {&asticksong_3d, &aprod1_3d, &aprod2_3d, &aprod3_3d, &astick1_3d, &astick2_3d, &astick3_3d, &astick4_3d, &astick5_3d, &astick6_3d, &astick7_3d, 0};
+actListPtr ALsticktest1_3d[] = {&asticktest1_3d, 0};
+actListPtr ALsticktest2_3d[] = {&asticktest2_3d, 0};
+actListPtr ALsticktest4_3d[] = {&asticktest4_3d, 0};
+actListPtr ALsticktip_3d[] = {&asticktip_3d, 0};
+actListPtr ALstream1_3d[] = {&ascr_slope_stream1_3d, 0};
+actListPtr ALstream2_3d[] = {&ascr_slope_stream2_3d, 0};
+actListPtr ALstream_path_3d[] = {&axy_stream_path_3d, &ascr_stream_path_3d, 0};
+actListPtr ALstream_slope_3d[] = {&axy_stream_slope_3d, &ascr_stream_slope_3d, 0};
+actListPtr ALstuckpin_3d[] = {&astuckpin_3d, 0};
+actListPtr ALsunset_3d[] = {&asunsetsong_3d, &asunset1_3d, &asunset2_3d, &asunset3_3d, 0};
+actListPtr ALswing_3d[] = {&aquiet_3d, &aswingsong_3d, &aswing0_3d, &aswing1_3d, &aswing2_3d, &aswing3_3d, &aswing4_3d, &aswing5_3d, &aswing6_3d, &aswing7_3d, &aswing8_3d, 0};
+actListPtr ALswingtip_3d[] = {&aswingtip_3d, 0};
+actListPtr ALtakecage_3d[] = {&ataketest3_3d, 0};
+actListPtr ALtakecb_3d[] = {&atakecb1_3d, &atakecb2_3d, &atakecb3_3d, 0};
+actListPtr ALtakecheese_3d[] = {&atakechstest_3d, 0};
+actListPtr ALtakechs_3d[] = {&aaddcheese_3d, &aok_3d, &atakencheese_3d, &atakecheese1_3d, &atakecheese2_3d, &atakecheese3_3d, 0};
+actListPtr ALtakeit_3d[] = {&aok_3d, &atakecage1_3d, &atakecage2_3d, &atakecage3_3d, 0};
+actListPtr ALtaketest1_3d[] = {&ataketest1_3d, 0};
+actListPtr ALtaketest2_3d[] = {&ataketest2_3d, 0};
+actListPtr ALtalknat_3d[] = {&atalktest3_3d, 0};
+actListPtr ALtalktest1_3d[] = {&atalktest1_3d, 0};
+actListPtr ALtalktest2_3d[] = {&atalktest2_3d, 0};
+actListPtr ALtalkweb_3d[] = {&atalkweb_3d, 0};
+actListPtr ALtied_3d[] = {&atied_3d, 0};
+actListPtr ALtievine_3d[] = {&atiesong_3d, &avine1_3d, &avine2_3d, &avine3_3d, &avine4_3d, &avine5_3d, &avine6_3d, 0};
+actListPtr ALtrapped_3d[] = {&aaddcheese_3d, &aenter0_3d, &aenter1_3d, &aenter2_3d, &aenter3_3d, &aenter4_3d, &aenter5_3d, &aenter6_3d, &aenter7_3d, &aenter8_3d, 0};
+actListPtr ALturn_cave_3d[] = {&axy_turn_cave_3d, &ascr_turn_cave_3d, 0};
+actListPtr ALturn_village_3d[] = {&aweehero_3d, &axy_turn_village_3d, &ascr_turn_village_3d, 0};
+actListPtr ALuntie_3d[] = {&auntie_3d, 0};
+actListPtr ALuntie_vine_3d[] = {&auntietest_3d, 0};
+actListPtr ALup_3d[] = {&aup1_3d, &aup2_3d, 0};
+actListPtr ALvillage_camp_l_3d[] = {&aweehero_3d, &axy_village_camp_l_3d, &ascr_village_camp_l_3d, 0};
+actListPtr ALvillage_camp_r_3d[] = {&aweehero_3d, &axy_village_camp_r_3d, &ascr_village_camp_r_3d, 0};
+actListPtr ALvillage_path_3d[] = {&aweehero_3d, &axy_village_path_3d, &ascr_village_path_3d, 0};
+actListPtr ALvillage_thing_3d[] = {&athing_3d, 0};
+actListPtr ALvillage_turn_3d[] = {&aweehero_3d, &axy_village_turn_3d, &ascr_village_turn_3d, 0};
+actListPtr ALvine_3d[] = {&avinetest_3d, 0};
+actListPtr ALwarn_3d[] = {&awarn_3d, 0};
+actListPtr ALwaterfall_3d[] = {&ascr_clf_wfall_3d, 0};
+actListPtr ALwaternofall_3d[] = {&ascr_clf_wnofall_3d, 0};
+actListPtr ALwbase_garden_3d[] = {&axy_wbase_garden_3d, &ascr_wbase_garden_3d, 0};
+actListPtr ALwbase_wfall_3d[] = {&aelewaking_3d, &aelewoken_3d, &axy_wbase_wfall_3d, &ascr_wbase_wfall_3d, 0};
+actListPtr ALweb_3d[] = {&awebtest1_3d, 0};
+actListPtr ALweb_crash_3d[] = {&axy_web_crash_3d, &ascr_web_crash_3d, 0};
+actListPtr ALweb_path_3d[] = {&axy_web_path_3d, &ascr_web_path_3d, 0};
+actListPtr ALwebtest2_3d[] = {&awebtest2_3d, 0};
+actListPtr ALwfall_cave_3d[] = {&axy_wfall_cave_3d, &ascr_wfall_cave_3d, 0};
+actListPtr ALwfall_clf_3d[] = {&axy_wfall_clf_3d, &ascr_wfall_clf_3d, 0};
+actListPtr ALwfall_wbase_3d[] = {&awaterfalling_3d, 0};
+actListPtr ALwfallb_cave_3d[] = {&axy_wfall_cave_3d, &ascr_wfall_cave_3d, 0};
+actListPtr ALwfallb_clf_3d[] = {&axy_wfall_clf_3d, &ascr_wfall_clf_3d, 0};
+actListPtr ALwfallb_wbase_3d[] = {&axy_wfallb_wbase_3d, &ascr_wfallb_wbase_3d, 0};
+actListPtr ALwrong_3d[] = {&aappear1_3d, &aenable_3d, &awrong1_3d, &amap4b_3d, &areturn_3d, 0};
+
+actList actListArr_3d[] = {
+ ALDummy, ALac2_3d, ALac3_3d, ALac4_3d, ALac5_3d,
+ ALac6_3d, ALac7_3d, ALac8_3d, ALac9_3d, ALasleep_3d,
+ ALbittest_3d, ALblk1_3d, ALblk_3d, ALbrg_clftop1_3d, ALbrg_clftop_3d,
+ ALbrg_clftop_msg_3d, ALbrg_down_3d, ALbrg_ok_3d, ALbrg_path_3d, ALbridgetip_3d,
+ ALbtip_3d, ALbtipprompt_3d, ALcagetest2_3d, ALcagetest3_3d, ALcagetest4_3d,
+ ALcagetest_3d, ALcamp_3d, ALcamp_hut_3d, ALcamp_village_c_3d, ALcamp_village_l_3d,
+ ALcampers_3d, ALcanttake_3d, ALcave_man_3d, ALcave_oldman_3d, ALcave_turn_3d,
+ ALcave_wfall_3d, ALchase_3d, ALclf_clftop_3d, ALclf_wfall_3d, ALclftop_brg_3d,
+ ALclftop_clf_3d, ALclftop_slope_3d, ALclosedoor_3d, ALcom0_3d, ALcom1_3d,
+ ALcom2_3d, ALcom3_3d, ALcom4_3d, ALcom5_3d, ALcom6_3d,
+ ALcom7_3d, ALcom8_3d, ALcomment_3d, ALcrashNoStory_3d, ALcrashStory_3d,
+ ALcrash_web_3d, ALcrashed_3d, ALcrashtest2_3d, ALcryhelp_3d, ALcrystal_3d,
+ ALcubestip_3d, ALdammed_3d, ALdammedtip_3d, ALdart_3d, ALdarted_3d,
+ ALdartedtest_3d, ALdartsched_3d, ALdn_3d, ALdoc_3d, ALdocgot_3d,
+ ALdodart_3d, ALdrink_3d, ALdrinkno_3d, ALdrinkyes_3d, ALdropcheese_3d,
+ ALdropincage_3d, ALdropord_3d, ALdroptest2_3d, ALeatcheese_3d, ALele_sleep_3d,
+ ALeleblink_3d, ALeletest2_3d, ALempty_3d, ALempty2_3d, ALemptymagic_3d,
+ ALemptyord_3d, ALemptytest2_3d, ALentertest2_3d, ALentertest3_3d, ALexit_3d,
+ ALexor_3d, ALexorcise_3d, ALexordone_3d, ALexotest2_3d, ALfill_3d,
+ ALfillmagic_3d, ALfillord_3d, ALfilltest2_3d, ALfilltest3_3d, ALfindbook_3d,
+ ALfindcrystal_3d, ALfindit_3d, ALflash_3d, ALflask_3d, ALflasktest2_3d,
+ ALflasktest3_3d, ALgarden_wbase_3d, ALgettest2_3d, ALgive_3d, ALgiveb_3d,
+ ALgivetest_3d, ALgot_3d, ALgotit_3d, ALholel_3d, ALholer_3d,
+ ALhorizon_3d, ALhut_camp_3d, ALhut_enter_3d, ALhut_in_3d, ALhut_out_3d,
+ ALhut_village_c_3d, ALhut_village_r_3d, ALleft_3d, ALlookfall_3d, ALlooknofall_3d,
+ ALlookwfall_3d, ALmagictip_3d, ALmakeclay_3d, ALmakeit_3d, ALmap0_3d,
+ ALmap1_3d, ALmission_3d, ALmodeltip_3d, ALmouse_3d, ALmousego_3d,
+ ALmousegone_3d, ALmousel_3d, ALmouser_3d, ALmousetip_3d, ALnat1_3d,
+ ALnat2_3d, ALnat3_3d, ALnat4_3d, ALnat5_3d, ALnat6_3d,
+ ALnat7_3d, ALnat8_3d, ALnat9_3d, ALnative_3d, ALnoblow_3d,
+ ALnocarry_3d, ALnoclay_3d, ALnofill_3d, ALnomake_3d, ALnopurps_3d,
+ ALnoremedy_3d, ALnospell_3d, ALnostick_3d, ALnostickpin_3d, ALnotakecb_3d,
+ ALnothanks2_3d, ALnothanks_3d, ALnotip_3d, ALnottied_3d, ALok_3d,
+ ALoktoleave1_3d, ALoktoleave2_3d, ALold2_3d, ALold3_3d, ALold4_3d,
+ ALold5_3d, ALold6_3d, ALold7_3d, ALoldfirst_3d, ALoldman_3d,
+ ALoldmantip_3d, ALoldsubseq_3d, ALopencage_3d, ALopencdoor_3d, ALopendoor_3d,
+ ALpath_3d, ALpath_brg_3d, ALpath_stream_3d, ALpath_village_3d, ALpath_web_3d,
+ ALplane_3d, ALplanetip_3d, ALpostest_3d, ALprod_3d, ALputitdown_3d,
+ ALreadbook_3d, ALreadord_3d, ALreadtest2_3d, ALrefuse_3d, ALrefuseflask_3d,
+ ALremedy_3d, ALremedytip_3d, ALreturn_3d, ALright_3d, ALscare_3d,
+ ALscared_3d, ALsleepy_3d, ALslope_clftop_3d, ALslope_stream_3d, ALsong3_3d,
+ ALspider_3d, ALspirit_3d, ALstalk_3d, ALstick_3d, ALstickpin_3d,
+ ALsticktest1_3d, ALsticktest2_3d, ALsticktest4_3d, ALsticktip_3d, ALstream1_3d,
+ ALstream2_3d, ALstream_path_3d, ALstream_slope_3d, ALstuckpin_3d, ALsunset_3d,
+ ALswing_3d, ALswingtip_3d, ALtakecage_3d, ALtakecb_3d, ALtakecheese_3d,
+ ALtakechs_3d, ALtakeit_3d, ALtaketest1_3d, ALtaketest2_3d, ALtalknat_3d,
+ ALtalktest1_3d, ALtalktest2_3d, ALtalkweb_3d, ALtied_3d, ALtievine_3d,
+ ALtrapped_3d, ALturn_cave_3d, ALturn_village_3d, ALuntie_3d, ALuntie_vine_3d,
+ ALup_3d, ALvillage_camp_l_3d, ALvillage_camp_r_3d, ALvillage_path_3d, ALvillage_thing_3d,
+ ALvillage_turn_3d, ALvine_3d, ALwarn_3d, ALwaterfall_3d, ALwaternofall_3d,
+ ALwbase_garden_3d, ALwbase_wfall_3d, ALweb_3d, ALweb_crash_3d, ALweb_path_3d,
+ ALwebtest2_3d, ALwfall_cave_3d, ALwfall_clf_3d, ALwfall_wbase_3d, ALwfallb_cave_3d,
+ ALwfallb_clf_3d, ALwfallb_wbase_3d, ALwrong_3d
+};
+
+// Default tune selection - repeats indefinitely
+int16 def_tunes_1w[] = {T_TRACK1, T_TRACK2, T_TRACK3, T_TRACK6, -1};
+int16 def_tunes_2w[] = {T_TRACK4, T_TRACK5, T_TRACK6, -1};
+int16 def_tunes_3w[] = {T_TRACK7, T_TRACK8, T_TRACK9, -1};
+// Dummy initialisation
+int16 def_tunes_1d[] = {-1};
+int16 def_tunes_2d[] = {-1};
+int16 def_tunes_3d[] = {-1};
+
+#endif
+
diff --git a/tools/create_hugo/staticdisplay.h b/tools/create_hugo/staticdisplay.h
new file mode 100644
index 0000000000..2dfc939371
--- /dev/null
+++ b/tools/create_hugo/staticdisplay.h
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef STATICDISPLAY_H
+#define STATICDISPLAY_H
+
+#define SIZE_PAL_ARRAY 64
+
+// Color table of standard 16 VGA colors
+// Values from "Programmers guide to EGA/VGA cards" Ferraro, p303
+#define V1 168 // Low intensity value
+#define V2 255 // High intensity value
+#define V3 87 // Special for Brown/Gray
+#define V4 32 // De-saturate hi intensity
+
+
+byte _palette[SIZE_PAL_ARRAY] = {
+ 0, 0, 0, 0, // BLACK
+ 0, 0, V1, 0, // BLUE
+ 0, V1, 0, 0, // GREEN
+ 0, V1, V1, 0, // CYAN
+ V1, 0, 0, 0, // RED
+ V1, 0, V1, 0, // MAGENTA
+ V1, V3, 0, 0, // BROWN
+ V1, V1, V1, 0, // WHITE (LIGHT GRAY)
+ V3, V3, V3, 0, // GRAY (DARK GRAY)
+ V4, V4, V2, 0, // LIGHTBLUE
+ V4, V2, V4, 0, // LIGHTGREEN
+ V4, V2, V2, 0, // LIGHTCYAN
+ V2, V4, V4, 0, // LIGHTRED
+ V2, V4, V2, 0, // LIGHTMAGENTA
+ V2, V2, V4, 0, // YELLOW
+ V2, V2, V2, 0 // BRIGHTWHITE
+};
+
+#endif
diff --git a/tools/create_hugo/staticengine.h b/tools/create_hugo/staticengine.h
new file mode 100644
index 0000000000..362100b8f0
--- /dev/null
+++ b/tools/create_hugo/staticengine.h
@@ -0,0 +1,52 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef STATICENGINE_H
+#define STATICENGINE_H
+
+#define NUM_ENGINE_TEXT 1
+const char *textEngine[NUM_ENGINE_TEXT] = {
+ "Hugo and Penelope say:\n\n"
+ "We hope you liked our adventure and\n"
+ "hope to see you very soon in Hugo's\n"
+ "Mystery Adventure and Hugo's Amazon\n"
+ "Adventure. They are just like this\n"
+ "game but bigger and better!\n\n"
+ "Call 1-800-2424-PsL now to order the\n"
+ "Hugo Trilogy for Windows for only $36!\n"
+ "(Note: This number is for ORDERS only).\n\n"
+ "It includes all 3 games plus the 30-page\n"
+ "answer book. See Ordering information\n"
+ "for more details and some screenshots."
+};
+
+#endif
diff --git a/tools/create_hugo/staticintro.h b/tools/create_hugo/staticintro.h
new file mode 100644
index 0000000000..f9e59952e7
--- /dev/null
+++ b/tools/create_hugo/staticintro.h
@@ -0,0 +1,59 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef STATICINTRO_H
+#define STATICINTRO_H
+
+#define NUM_INTRO_TEXT 3
+#define NUM_INTRO_TICK 36
+// We use intro_tick as an index into the following coordinate list for the plane path.
+const byte x_intro[NUM_INTRO_TICK] = {
+ 210, 204, 198, 192, 186, 180, 174, 168, 162, 156,
+ 152, 149, 152, 158, 165, 171, 170, 165, 161, 157,
+ 150, 144, 138, 134, 133, 134, 138, 144, 146, 142,
+ 137, 132, 128, 124, 120, 115
+};
+
+const byte y_intro[NUM_INTRO_TICK] = {
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 63, 66, 71, 74, 72, 75, 80, 82, 83, 84,
+ 84, 84, 85, 89, 94, 99, 103, 104, 100, 98,
+ 100, 103, 106, 109, 111, 112
+};
+
+const char *textIntro[NUM_INTRO_TEXT] = {
+ "Hugo and Penelope are returning\nhome from their vacation at the\ncottage of Great Uncle Horace.",
+ "Suddenly, a freak magnetic storm\ncauses the compass in their light\naircraft to spin wildly! Unable\nto navigate, Hugo loses all sense\nof direction...",
+ "Finally, hopelessly lost over a\nSouth American Jungle, the plane\nabout to run out of gas, Hugo\nspots a clearing just big enough\nto land it.\n\nWith fingers clenching the controls\nhe shouts: Hold on Penelope, we're\ngoing down...!"
+};
+
+#endif
diff --git a/tools/create_hugo/staticmouse.h b/tools/create_hugo/staticmouse.h
new file mode 100644
index 0000000000..2d4987a30c
--- /dev/null
+++ b/tools/create_hugo/staticmouse.h
@@ -0,0 +1,43 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef STATICMOUSE_H
+#define STATICMOUSE_H
+
+#define NUM_MOUSE_TEXT 2
+
+const char *textMouse[NUM_MOUSE_TEXT] = {
+ "I don't know how to get there!",
+ "Exit"
+};
+
+#endif
diff --git a/tools/create_hugo/staticparser.h b/tools/create_hugo/staticparser.h
new file mode 100644
index 0000000000..95e790f40a
--- /dev/null
+++ b/tools/create_hugo/staticparser.h
@@ -0,0 +1,58 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef STATICPARSER_H
+#define STATICPARSER_H
+
+#define NUM_PARSER_TEXT 18
+const char *textParser[NUM_PARSER_TEXT] = {
+ "You should press ALT+F4 or click on Game/Exit.",
+ "You are in a maze of\ntwisty little paths,\nwhich are all alike!",
+ "There's no point!",
+ "I don't fully understand.",
+ "I don't quite understand.",
+ "Eh?",
+ "You see nothing\nunusual about it.",
+ "You already have it.",
+ "It is of no use to you.",
+ "You don't have it.",
+ "No! You'll be needing it.",
+ "Ok.",
+ "You don't have any!",
+ "There aren't any!",
+ "I don't see any here!",
+ "You're not close enough!",
+ "You are carrying:",
+ "\nPress ESCAPE to continue"
+};
+
+#endif //STATICPARSER_H
diff --git a/tools/create_hugo/staticschedule.h b/tools/create_hugo/staticschedule.h
new file mode 100644
index 0000000000..aa11bd8bf3
--- /dev/null
+++ b/tools/create_hugo/staticschedule.h
@@ -0,0 +1,43 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef STATICSCHEDULE_H
+#define STATICSCHEDULE_H
+
+#define NUM_SCHEDULE_TEXT 2
+
+const char *textSchedule[NUM_SCHEDULE_TEXT] = {
+ "Can't find background file!",
+ "Obsolete saved game format will be converted!"
+};
+
+#endif
diff --git a/tools/create_hugo/staticutil.h b/tools/create_hugo/staticutil.h
new file mode 100644
index 0000000000..090b07de93
--- /dev/null
+++ b/tools/create_hugo/staticutil.h
@@ -0,0 +1,51 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+/*
+ * This code is based on original Hugo Trilogy source code
+ *
+ * Copyright (c) 1989-1995 David P. Gray
+ *
+ */
+
+#ifndef STATICUTIL_H
+#define STATICUTIL_H
+
+#define NUM_UTIL_TEXT 8
+
+const char *textUtil[NUM_UTIL_TEXT] = {
+ "\n\nPlease read the supplied 'technote' file which may contain information on this problem.",
+ "File not found: ",
+ "Unable to write file.\nDisk full or perhaps read-only?\n",
+ "Bad data file format:\n",
+ "Insufficient memory to run game.\n",
+ "Sound missing from sound file:\n",
+ "An error has occurred.\n",
+ "I'm afraid all you can do at this point is:\n\n- Load a saved game (Ctrl+L)\n- Start a new game (Ctrl+N)\n- Quit! (Alt+F4)"
+// "No timers available, try again later.\n",
+// "Unable to find or load VBX file:\n"
+};
+
+#endif //STATICENGINE_H
diff --git a/tools/create_translations/create_translations.cpp b/tools/create_translations/create_translations.cpp
new file mode 100644
index 0000000000..fab35cdfd5
--- /dev/null
+++ b/tools/create_translations/create_translations.cpp
@@ -0,0 +1,187 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for create the translations.dat file from all the po files.
+ * The generated files is used by ScummVM to propose translation of its GUI.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+ // HACK to allow building with the SDL backend on MinGW
+// see bug #1800764 "TOOLS: MinGW tools building broken"
+#ifdef main
+#undef main
+#endif // main
+
+#include "create_translations.h"
+#include "po_parser.h"
+
+#define TRANSLATIONS_DAT_VER 2 // 1 byte
+
+// Padding buffer (filled with 0) used if we want to aligned writes
+// static uint8 padBuf[DATAALIGNMENT];
+
+// Utility functions
+// Some of the function are very simple but are factored out so that it would require
+// minor modifications if we want for example to aligne writes on 4 bytes.
+void writeByte(FILE *fp, uint8 b) {
+ fwrite(&b, 1, 1, fp);
+}
+
+void writeUint16BE(FILE *fp, uint16 value) {
+ writeByte(fp, (uint8)(value >> 8));
+ writeByte(fp, (uint8)(value & 0xFF));
+}
+
+int stringSize(const char* string) {
+ // Each string is preceded by its size coded on 2 bytes
+ if (string == NULL)
+ return 2;
+ int len = strlen(string) + 1;
+ return 2 + len;
+ // The two lines below are an example if we want to align string writes
+ // pad = DATAALIGNMENT - (len + 2) % DATAALIGNMENT;
+ // return 2 + len + pad;
+}
+
+void writeString(FILE *fp, const char* string) {
+ // Each string is preceded by its size coded on 2 bytes
+ if (string == NULL) {
+ writeUint16BE(fp, 0);
+ return;
+ }
+ int len = strlen(string) + 1;
+ writeUint16BE(fp, len);
+ fwrite(string, len, 1, fp);
+ // The commented lines below are an example if we want to align string writes
+ // It replaces the two lines above.
+ // int pad = DATAALIGNMENT - (len + 2) % DATAALIGNMENT;
+ // writeUint16BE(fp, len + pad);
+ // fwrite(string, len, 1, fp);
+ // fwrite(padBuf, pad, 1, fp);
+}
+
+// Main
+int main(int argc, char *argv[]) {
+ // Build the translation list
+ PoMessageList messageIds;
+ PoMessageEntryList **translations = new PoMessageEntryList*[argc - 1];
+ int numLangs = 0;
+ for (int i = 1 ; i < argc ; ++i) {
+ translations[numLangs] = parsePoFile(argv[i], messageIds);
+ if (translations[numLangs] != NULL)
+ ++numLangs;
+ }
+
+ FILE *outFile;
+ int i, lang;
+ int len;
+
+ // Padding buffer initialization (filled with 0)
+ // used if we want to aligned writes
+ // for (i = 0; i < DATAALIGNMENT; i++)
+ // padBuf[i] = 0;
+
+ outFile = fopen("translations.dat", "wb");
+
+ // Write header
+ fwrite("TRANSLATIONS", 12, 1, outFile);
+
+ writeByte(outFile, TRANSLATIONS_DAT_VER);
+
+ // Write number of translations
+ writeUint16BE(outFile, numLangs);
+
+ // Write the length of each data block here.
+ // We could write it at the start of each block but that would mean that
+ // to go to block 4 we would have to go at the start of each preceding block,
+ // read its size and skip it until we arrive at the block we want.
+ // By having all the sizes at the start we just need to read the start of the
+ // file and can then skip to the block we want.
+ // Blocks are:
+ // 1. List of languages with the language name
+ // 2. Original messages (i.e. english)
+ // 3. First translation
+ // 4. Second translation
+ // ...
+
+ // Write length for translation description
+ len = 0;
+ for (lang = 0; lang < numLangs; lang++) {
+ len += stringSize(translations[lang]->language());
+ len += stringSize(translations[lang]->languageName());
+ }
+ writeUint16BE(outFile, len);
+
+ // Write size for the original language (english) block
+ // It starts with the number of strings coded on 2 bytes followed by each
+ // string (two bytes for the number of chars and the string itself).
+ len = 2;
+ for (i = 0; i < messageIds.size(); ++i)
+ len += stringSize(messageIds[i]);
+ writeUint16BE(outFile, len);
+
+ // Then comes the size of each translation block.
+ // It starts with the number of strings coded on 2 bytes, the charset and then the strings.
+ // For each string we have the string id (on two bytes) followed by
+ // the string size (two bytes for the number of chars and the string itself).
+ for (lang = 0; lang < numLangs; lang++) {
+ len = 2 + stringSize(translations[lang]->charset());
+ for (i = 0; i < translations[lang]->size(); ++i) {
+ len += 2 + stringSize(translations[lang]->entry(i)->msgstr);
+ len += stringSize(translations[lang]->entry(i)->msgctxt);
+ }
+ writeUint16BE(outFile, len);
+ }
+
+ // Write list of languages
+ for (lang = 0; lang < numLangs; lang++) {
+ writeString(outFile, translations[lang]->language());
+ writeString(outFile, translations[lang]->languageName());
+ }
+
+ // Write original messages
+ writeUint16BE(outFile, messageIds.size());
+ for (i = 0; i < messageIds.size(); ++i) {
+ writeString(outFile, messageIds[i]);
+ }
+
+ // Write translations
+ for (lang = 0; lang < numLangs; lang++) {
+ writeUint16BE(outFile, translations[lang]->size());
+ writeString(outFile, translations[lang]->charset());
+ for (i = 0; i < translations[lang]->size(); ++i) {
+ writeUint16BE(outFile, messageIds.findIndex(translations[lang]->entry(i)->msgid));
+ writeString(outFile, translations[lang]->entry(i)->msgstr);
+ writeString(outFile, translations[lang]->entry(i)->msgctxt);
+ }
+ }
+
+ fclose(outFile);
+
+ // Clean the memory
+ for (i = 0; i < numLangs; ++i)
+ delete translations[i];
+ delete [] translations;
+
+ return 0;
+}
diff --git a/tools/create_translations/create_translations.h b/tools/create_translations/create_translations.h
new file mode 100644
index 0000000000..0ece8102f0
--- /dev/null
+++ b/tools/create_translations/create_translations.h
@@ -0,0 +1,30 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef CREATE_TRANSLATIONS_H
+#define CREATE_TRANSLATIONS_H
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef signed short int16;
+
+#endif /* CREATE_TRANSLATIONS_H */
diff --git a/tools/create_translations/module.mk b/tools/create_translations/module.mk
new file mode 100644
index 0000000000..4ffb39183b
--- /dev/null
+++ b/tools/create_translations/module.mk
@@ -0,0 +1,11 @@
+MODULE := tools/create_translations
+
+MODULE_OBJS := \
+ po_parser.o \
+ create_translations.o
+
+# Set the name of the executable
+TOOL_EXECUTABLE := create_translations
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/tools/create_translations/po_parser.cpp b/tools/create_translations/po_parser.cpp
new file mode 100644
index 0000000000..3d8e2547a0
--- /dev/null
+++ b/tools/create_translations/po_parser.cpp
@@ -0,0 +1,364 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for create the translations.dat file from all the po files.
+ * The generated files is used by ScummVM to propose translation of its GUI.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "po_parser.h"
+
+PoMessageList::PoMessageList() : _messages(NULL), _size(0), _allocated(0) {
+}
+
+PoMessageList::~PoMessageList() {
+ for (int i = 0; i < _size; ++i)
+ delete [] _messages[i];
+ delete [] _messages;
+}
+
+void PoMessageList::insert(const char *msg) {
+ if (msg == NULL || *msg == '\0')
+ return;
+
+ // binary-search for the insertion index
+ int leftIndex = 0;
+ int rightIndex = _size - 1;
+ while (rightIndex >= leftIndex) {
+ int midIndex = (leftIndex + rightIndex) / 2;
+ int compareResult = strcmp(msg, _messages[midIndex]);
+ if (compareResult == 0)
+ return;
+ else if (compareResult < 0)
+ rightIndex = midIndex - 1;
+ else
+ leftIndex = midIndex + 1;
+ }
+ // We now have rightIndex = leftIndex - 1 and we need to insert the new message
+ // between the two (i.a. at leftIndex).
+ if (_size + 1 > _allocated) {
+ _allocated += 100;
+ char **newMessages = new char*[_allocated];
+ for (int i = 0; i < leftIndex; ++i)
+ newMessages[i] = _messages[i];
+ for (int i = leftIndex; i < _size; ++i)
+ newMessages[i + 1] = _messages[i];
+ delete [] _messages;
+ _messages = newMessages;
+ } else {
+ for (int i = _size - 1; i >= leftIndex; --i)
+ _messages[i + 1] = _messages[i];
+ }
+ _messages[leftIndex] = new char[1 + strlen(msg)];
+ strcpy(_messages[leftIndex], msg);
+ ++_size;
+}
+
+int PoMessageList::findIndex(const char *msg) {
+ if (msg == NULL || *msg == '\0')
+ return -1;
+
+ // binary-search for the message
+ int leftIndex = 0;
+ int rightIndex = _size - 1;
+
+ while (rightIndex >= leftIndex) {
+ const int midIndex = (leftIndex + rightIndex) / 2;
+ const int compareResult = strcmp(msg, _messages[midIndex]);
+ if (compareResult == 0)
+ return midIndex;
+ else if (compareResult < 0)
+ rightIndex = midIndex - 1;
+ else
+ leftIndex = midIndex + 1;
+ }
+
+ return -1;
+}
+
+int PoMessageList::size() const {
+ return _size;
+}
+
+const char *PoMessageList::operator[](int index) const {
+ if (index < 0 || index >= _size)
+ return NULL;
+ return _messages[index];
+}
+
+PoMessageEntryList::PoMessageEntryList(const char *lang) :
+ _lang(NULL), _charset(NULL), _langName(NULL),
+ _list(NULL), _size(0), _allocated(0)
+{
+ _lang = new char[1 + strlen(lang)];
+ strcpy(_lang, lang);
+ // Set default charset to empty string
+ _charset = new char[1];
+ _charset[0] = '\0';
+ // Set default langName to lang
+ _langName = new char[1 + strlen(lang)];
+ strcpy(_langName, lang);
+}
+
+PoMessageEntryList::~PoMessageEntryList() {
+ delete [] _lang;
+ delete [] _charset;
+ delete [] _langName;
+ for (int i = 0; i < _size; ++i)
+ delete _list[i];
+ delete [] _list;
+}
+
+void PoMessageEntryList::addMessageEntry(const char *translation, const char *message, const char *context) {
+ if (*message == '\0') {
+ // This is the header.
+ // We get the charset and the language name from the translation string
+ char *str = parseLine(translation, "Language:");
+ if (str != NULL) {
+ delete [] _langName;
+ _langName = str;
+ }
+ str = parseLine(translation, "charset=");
+ if (str != NULL) {
+ delete [] _charset;
+ _charset = str;
+ }
+ return;
+ }
+
+ // binary-search for the insertion index
+ int leftIndex = 0;
+ int rightIndex = _size - 1;
+ while (rightIndex >= leftIndex) {
+ int midIndex = (leftIndex + rightIndex) / 2;
+ int compareResult = strcmp(message, _list[midIndex]->msgid);
+ if (compareResult == 0) {
+ if (context == NULL) {
+ if (_list[midIndex]->msgctxt == NULL)
+ return;
+ compareResult = -1;
+ } else {
+ if (_list[midIndex]->msgctxt == NULL)
+ compareResult = 1;
+ else {
+ compareResult = strcmp(context, _list[midIndex]->msgctxt);
+ if (compareResult == 0)
+ return;
+ }
+ }
+ }
+ if (compareResult < 0)
+ rightIndex = midIndex - 1;
+ else
+ leftIndex = midIndex + 1;
+ }
+ // We now have rightIndex = leftIndex - 1 and we need to insert the new message
+ // between the two (i.a. at leftIndex).
+ // However since the TranslationManager will pick the translation associated to no
+ // context if it is not present for a specific context, we can optimize the file
+ // size, memory used at run-time and performances (less strings to read from the file
+ // and less strings to look for) by avoiding duplicate.
+ if (context != NULL && *context != '\0') {
+ // Check if we have the same translation for no context
+ int contextIndex = leftIndex - 1;
+ while (contextIndex >= 0 && strcmp (message, _list[contextIndex]->msgid) == 0) {
+ --contextIndex;
+ }
+ ++contextIndex;
+ if (contextIndex < leftIndex && _list[contextIndex]->msgctxt == NULL && strcmp(translation, _list[contextIndex]->msgstr) == 0)
+ return;
+ }
+
+
+ if (_size + 1 > _allocated) {
+ _allocated += 100;
+ PoMessageEntry **newList = new PoMessageEntry*[_allocated];
+ for (int i = 0; i < leftIndex; ++i)
+ newList[i] = _list[i];
+ for (int i = leftIndex; i < _size; ++i)
+ newList[i + 1] = _list[i];
+ delete [] _list;
+ _list = newList;
+ } else {
+ for (int i = _size - 1; i >= leftIndex; --i)
+ _list[i + 1] = _list[i];
+ }
+ _list[leftIndex] = new PoMessageEntry(translation, message, context);
+ ++_size;
+
+ if (context == NULL || *context == '\0') {
+ // Remove identical translations for a specific context (see comment above)
+ int contextIndex = leftIndex + 1;
+ int removed = 0;
+ while (contextIndex < _size && strcmp(message, _list[contextIndex]->msgid) == 0) {
+ if (strcmp(translation, _list[contextIndex]->msgstr) == 0) {
+ delete _list[contextIndex];
+ ++removed;
+ } else {
+ _list[contextIndex - removed] = _list[contextIndex];
+ }
+ ++contextIndex;
+ }
+ if (removed > 0) {
+ while (contextIndex < _size) {
+ _list[contextIndex - removed] = _list[contextIndex];
+ ++contextIndex;
+ }
+ }
+ _size -= removed;
+ }
+
+}
+
+const char *PoMessageEntryList::language() const {
+ return _lang;
+}
+
+const char *PoMessageEntryList::languageName() const {
+ return _langName;
+}
+
+const char *PoMessageEntryList::charset() const {
+ return _charset;
+}
+
+int PoMessageEntryList::size() const {
+ return _size;
+}
+
+const PoMessageEntry *PoMessageEntryList::entry(int index) const {
+ if (index < 0 || index >= _size)
+ return NULL;
+ return _list[index];
+}
+
+
+PoMessageEntryList *parsePoFile(const char *file, PoMessageList& messages) {
+ FILE *inFile = fopen(file, "r");
+ if (!inFile)
+ return NULL;
+
+ char msgidBuf[1024], msgctxtBuf[1024], msgstrBuf[1024];
+ char line[1024], *currentBuf = NULL;
+
+ // Get language from file name and create PoMessageEntryList
+ int index = 0, start_index = strlen(file) - 1;
+ while (start_index > 0 && file[start_index - 1] != '/' && file[start_index - 1] != '\\') {
+ --start_index;
+ }
+ while (file[start_index + index] != '.' && file[start_index + index] != '\0') {
+ msgidBuf[index] = file[start_index + index];
+ ++index;
+ }
+ msgidBuf[index] = '\0';
+ PoMessageEntryList *list = new PoMessageEntryList(msgidBuf);
+
+ // Parse the file line by line.
+ // The msgstr is always the last line of an entry (i.e. msgid and msgctxt always
+ // precede the corresponding msgstr).
+ msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
+ while (!feof(inFile) && fgets(line, 1024, inFile)) {
+ // Skip empty and comment line
+ if (*line == '\n' || *line == '#')
+ continue;
+ if (strncmp(line, "msgid", 5) == 0) {
+ if (currentBuf == msgstrBuf) {
+ // add previous entry
+ if (*msgstrBuf != '\0') {
+ messages.insert(msgidBuf);
+ list->addMessageEntry(msgstrBuf, msgidBuf, msgctxtBuf);
+ }
+ msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
+ }
+ strcpy(msgidBuf, stripLine(line));
+ currentBuf = msgidBuf;
+ } else if (strncmp(line, "msgctxt", 7) == 0) {
+ if (currentBuf == msgstrBuf) {
+ // add previous entry
+ if (*msgstrBuf != '\0') {
+ messages.insert(msgidBuf);
+ list->addMessageEntry(msgstrBuf, msgidBuf, msgctxtBuf);
+ }
+ msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
+ }
+ strcpy(msgctxtBuf, stripLine(line));
+ currentBuf = msgctxtBuf;
+ } else if (strncmp(line, "msgstr", 6) == 0) {
+ strcpy(msgstrBuf, stripLine(line));
+ currentBuf = msgstrBuf;
+ } else {
+ // concatenate the string at the end of the current buffer
+ if (currentBuf)
+ strcat(currentBuf, stripLine(line));
+ }
+ }
+
+ fclose(inFile);
+ return list;
+}
+
+char *stripLine(char *line) {
+ // This function modifies line in place and return it.
+ // Keep only the text between the first two unprotected quotes.
+ // Look for the first quote
+ int start = 0;
+ int len = strlen(line);
+ while (start < len && line[start++] != '"') {}
+ // shift characters until we reach the end of the string or an unprotected quote
+ int i = 0;
+ while (start+i < len && (line[start+i] != '"' || (i > 0 && line[start+i-1] == '\\'))) {
+ line[i] = line[start+i];
+ ++i;
+ }
+ line[i] = '\0';
+ return line;
+}
+
+char *parseLine(const char *line, const char *field) {
+ // This function allocate and return a new char*.
+ // It will return a NULL pointer if the field is not found.
+ // It is used to parse the header of the po files to find the language name
+ // and the charset.
+ const char *str = strstr(line, field);
+ if (str == NULL)
+ return NULL;
+ str += strlen(field);
+ // Skip spaces
+ while (*str != '\0' && isspace(*str)) {
+ ++str;
+ }
+ // Find string length (top at the first '\\'
+ // (since the string we want is followed by a '\\n')
+ int len = 0;
+ while (str[len] != '\0' && str[len] != '\\') {
+ ++len;
+ }
+ if (len == 0)
+ return NULL;
+ // Create result string
+ char *result = new char[len + 1];
+ strncpy(result, str, len);
+ result[len] = '\0';
+ return result;
+}
diff --git a/tools/create_translations/po_parser.h b/tools/create_translations/po_parser.h
new file mode 100644
index 0000000000..ac54a7fdae
--- /dev/null
+++ b/tools/create_translations/po_parser.h
@@ -0,0 +1,110 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef PO_PARSER_H
+#define PO_PARSER_H
+
+
+/**
+ * List of english messages.
+ */
+class PoMessageList {
+public:
+ PoMessageList();
+ ~PoMessageList();
+
+ void insert(const char *msg);
+ int findIndex(const char *msg);
+
+ int size() const;
+ const char *operator[](int) const;
+
+private:
+ char **_messages;
+ int _size;
+ int _allocated;
+};
+
+/**
+ * Describes a translation entry.
+ */
+struct PoMessageEntry {
+ char *msgstr;
+ char *msgid;
+ char *msgctxt;
+
+ PoMessageEntry(const char *translation, const char *message, const char *context = NULL) :
+ msgstr(NULL), msgid(NULL), msgctxt(NULL)
+ {
+ if (translation != NULL && *translation != '\0') {
+ msgstr = new char[1 + strlen(translation)];
+ strcpy(msgstr, translation);
+ }
+ if (message != NULL && *message != '\0') {
+ msgid = new char[1 + strlen(message)];
+ strcpy(msgid, message);
+ }
+ if (context != NULL && *context != '\0') {
+ msgctxt = new char[1 + strlen(context)];
+ strcpy(msgctxt, context);
+ }
+ }
+ ~PoMessageEntry() {
+ delete [] msgstr;
+ delete [] msgid;
+ delete [] msgctxt;
+ }
+};
+
+/**
+ * List of translation entries for one language.
+ */
+class PoMessageEntryList {
+public:
+ PoMessageEntryList(const char* language);
+ ~PoMessageEntryList();
+
+ void addMessageEntry(const char *translation, const char *message, const char *context = NULL);
+
+ const char *language() const;
+ const char *languageName() const;
+ const char *charset() const;
+
+ int size() const;
+ const PoMessageEntry *entry(int) const;
+
+private:
+ char *_lang;
+ char *_charset;
+ char *_langName;
+
+ PoMessageEntry **_list;
+ int _size;
+ int _allocated;
+};
+
+
+PoMessageEntryList *parsePoFile(const char *file, PoMessageList &);
+char *stripLine(char *);
+char *parseLine(const char *line, const char *field);
+
+#endif /* PO_PARSER_H */
diff --git a/tools/po2c b/tools/po2c
deleted file mode 100755
index 10e15338c7..0000000000
--- a/tools/po2c
+++ /dev/null
@@ -1,277 +0,0 @@
-#!/usr/bin/perl
-
-#
-# po2c - Converts .po files to C code
-#
-# Copyright (C) 2004 Angel Ortega <angel@triptico.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# http://www.triptico.com
-#
-
-$VERSION = "1.0.2-scummvm";
-
-if(scalar(@ARGV) == 0)
-{
- print "Usage: po2c {po file[s]}\n";
- exit 1;
-}
-
-%msgs = ();
-%msgids = ();
-
-# stage 1: loading
-
-# arguments are .po files
-foreach my $f (@ARGV)
-{
- my ($lang);
- my ($langDesc);
-
- next unless(($lang) = ($f =~ /([^\/]+)\.po$/));
-
- if(open F, $f)
- {
- my ($msgid, $val, %a);
-
- while(<F>)
- {
- chomp;
-
- # ignore blank lines or comments
- next if /^$/ or /^#/;
-
- if(/^msgid\s+\"(.*)\"\s*$/)
- {
- # store previous msgid
- if(defined($msgid))
- {
- $a{$msgid} = $val;
- $msgids{$msgid} ++;
- }
-
- # start of msgid
- $val = $1;
- }
- elsif(/^msgstr\s+\"(.*)\"\s*$/)
- {
- # store previous msgid
- $msgid = $val;
-
- # start of msgstr
- $val = $1;
- }
- elsif(/^\"(.*)\"\s*$/)
- {
- # add to current value
- $val .= $1;
- }
- }
-
- # store previous msgid
- if(defined($msgid))
- {
- $a{$msgid} = $val;
- $msgids{$msgid} ++;
- }
-
- close F;
-
- # add to the global message pool
- $msgs{$lang} = \%a;
- }
-}
-
-# stage 2: convert the data
-
-# stores all sorted msgids into @msgids
-@msgids = sort(keys(%msgids));
-
-# travels again, storing indexes into %msgids
-for(my $n = 0;$n < scalar(@msgids);$n++)
-{
- $msgids{$msgids[$n]} = $n;
-}
-
-# stage 3: dump as C++ code
-
-print "// generated by po2c $VERSION - Do not modify\n\n";
-
-# dump first the msgid array
-print "static const char * const _messageIds[] = {\n";
-
-for(my $n = 0;$n < scalar(@msgids);$n++)
-{
- print "\t/* $n */ \"" . $msgids[$n] . "\",\n";
-}
-
-print "\tNULL\n};\n\n";
-
-# dump the lang structure
-print "struct PoMessageEntry {\n";
-print "\tint msgid;\n";
-print "\tconst char *msgstr;\n";
-print "};\n\n";
-
-# dump now each language
-
-foreach my $l (keys(%msgs))
-{
- print "static const PoMessageEntry _translation_${l}\[\] = {\n";
-
- # get the translation table for the language $l
- my ($m) = $msgs{$l};
-
-# while (my ($msgstr, $msgid) = each (%$m))
- foreach my $msgid (sort(keys(%$m)))
- {
- my ($msgstr) = "";
-
- # make it 7-bit safe
- foreach $c (split(//, $m->{$msgid})) {
- if (ord($c) > 0x7f) {
- $msgstr .= sprintf("\\%o", ord($c));
- } else {
- $msgstr .= $c;
- }
- }
-
- print "\t{ " . $msgids{$msgid} . ", \"" . $msgstr . "\" },\n"
- if $msgstr;
- }
-
- print "\t{ -1, NULL }\n};\n\n";
-}
-
-# finally, dump the languages
-
-print "struct PoLangEntry {\n";
-print "\tconst char *lang;\n";
-print "\tconst char *charset;\n";
-print "\tconst char *langname;\n";
-print "\tconst PoMessageEntry *msgs;\n";
-print "};\n\n";
-print "const PoLangEntry _translations[] = {\n";
-
-foreach my $l (keys(%msgs))
-{
- # charset
- $header = $msgs{$l}->{""};
- $header =~ /charset=([^\\]+)/;
- $charset = $1;
- # user readable language name
- $lang = "NULL";
- $header = $msgs{$l}->{""};
- $header =~ /Language:[\s]*([^\\]*)/;
- unless ($1 eq "")
- {
- $lang = "\"" . $1 . "\"";
- }
- print "\t{ \"" . $l . "\", \"" . $charset . "\", " . $lang . ", _translation_${l} },\n";
-}
-
-print "\t{ NULL, NULL, NULL, NULL }\n};\n\n";
-
-print "// code\n";
-print << 'EOF';
-
-static const PoMessageEntry *_currentTranslation = NULL;
-static int _currentTranslationMessageEntryCount = 0;
-static const char *_currentTranslationCharset = NULL;
-
-void po2c_setlang(const char *lang) {
- _currentTranslation = NULL;
- _currentTranslationMessageEntryCount = 0;
- _currentTranslationCharset = NULL;
-
- // if lang is NULL or "", deactivate it
- if (lang == NULL || *lang == '\0')
- return;
-
- // searches for a valid language array
- for (int i = 0; _currentTranslation == NULL && _translations[i].lang != NULL; ++i) {
- if (strcmp(lang, _translations[i].lang) == 0) {
- _currentTranslation = _translations[i].msgs;
- _currentTranslationCharset = _translations[i].charset;
- }
- }
-
- // try partial searches
- for (int i = 0; _currentTranslation == NULL && _translations[i].lang != NULL; ++i) {
- if (strncmp(lang, _translations[i].lang, 2) == 0) {
- _currentTranslation = _translations[i].msgs;
- _currentTranslationCharset = _translations[i].charset;
- }
- }
-
- // if found, count entries
- if (_currentTranslation != NULL) {
- for (const PoMessageEntry *m = _currentTranslation; m->msgid != -1; ++m)
- ++_currentTranslationMessageEntryCount;
- }
-}
-
-const char *po2c_gettext(const char *msgid) {
- // if no language is set or msgid is empty, return msgid as is
- if (_currentTranslation == NULL || *msgid == '\0')
- return msgid;
-
- // binary-search for the msgid
- int leftIndex = 0;
- int rightIndex = _currentTranslationMessageEntryCount - 1;
-
- while (rightIndex >= leftIndex) {
- const int midIndex = (leftIndex + rightIndex) / 2;
- const PoMessageEntry * const m = &_currentTranslation[midIndex];
-
- const int compareResult = strcmp(msgid, _messageIds[m->msgid]);
-
- if (compareResult == 0)
- return m->msgstr;
- else if (compareResult < 0)
- rightIndex = midIndex - 1;
- else
- leftIndex = midIndex + 1;
- }
-
- return msgid;
-}
-
-const char *po2c_getcharset(void) {
- if (_currentTranslationCharset)
- return _currentTranslationCharset;
- else
- return "ASCII";
-}
-
-int po2c_getnumlangs(void) {
- return ARRAYSIZE(_translations) - 1;
-}
-
-const char *po2c_getlang(const int num) {
- assert(num < ARRAYSIZE(_translations));
- return _translations[num].lang;
-}
-
-const char *po2c_getlangname(const int num) {
- assert(num < ARRAYSIZE(_translations));
- if (_translations[num].langname != NULL)
- return _translations[num].langname;
- return _translations[num].lang;
-}
-EOF
-
-exit 0;